/* * Copyright (c) 2021-2022, Matthew Olsson * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #define ENUMERATE_COLOR_SPACE_FAMILIES(V) \ V(DeviceGray, true) \ V(DeviceRGB, true) \ V(DeviceCMYK, true) \ V(CalGray, false) \ V(CalRGB, false) \ V(Lab, false) \ V(ICCBased, false) \ V(Indexed, false) \ V(Pattern, false) \ V(Separation, false) \ V(DeviceN, false) namespace PDF { class ColorSpaceFamily { public: ColorSpaceFamily(DeprecatedFlyString name, bool never_needs_paramaters_p) : m_name(move(name)) , m_never_needs_parameters(never_needs_paramaters_p) { } DeprecatedFlyString name() const { return m_name; }; bool never_needs_parameters() const { return m_never_needs_parameters; }; static PDFErrorOr get(DeprecatedFlyString const&); #define ENUMERATE(name, ever_needs_parameters) static ColorSpaceFamily name; ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE) #undef ENUMERATE private: DeprecatedFlyString m_name; bool m_never_needs_parameters; }; class ColorSpace : public RefCounted { public: static PDFErrorOr> create(DeprecatedFlyString const&); static PDFErrorOr> create(Document*, NonnullRefPtr); virtual ~ColorSpace() = default; virtual Color color(Vector const& arguments) const = 0; virtual int number_of_components() const = 0; virtual Vector default_decode() const = 0; virtual ColorSpaceFamily const& family() const = 0; }; class DeviceGrayColorSpace final : public ColorSpace { public: static NonnullRefPtr the(); ~DeviceGrayColorSpace() override = default; Color color(Vector const& arguments) const override; int number_of_components() const override { return 1; } Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; } private: DeviceGrayColorSpace() = default; }; class DeviceRGBColorSpace final : public ColorSpace { public: static NonnullRefPtr the(); ~DeviceRGBColorSpace() override = default; Color color(Vector const& arguments) const override; int number_of_components() const override { return 3; } Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; } private: DeviceRGBColorSpace() = default; }; class DeviceCMYKColorSpace final : public ColorSpace { public: static NonnullRefPtr the(); ~DeviceCMYKColorSpace() override = default; Color color(Vector const& arguments) const override; int number_of_components() const override { return 4; } Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; } private: DeviceCMYKColorSpace() = default; }; class CalRGBColorSpace final : public ColorSpace { public: static PDFErrorOr> create(Document*, Vector&& parameters); ~CalRGBColorSpace() override = default; Color color(Vector const& arguments) const override; int number_of_components() const override { return 3; } Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; } private: CalRGBColorSpace() = default; Array m_whitepoint { 0, 0, 0 }; Array m_blackpoint { 0, 0, 0 }; Array m_gamma { 1, 1, 1 }; Array m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; }; class ICCBasedColorSpace final : public ColorSpace { public: static PDFErrorOr> create(Document*, Vector&& parameters); ~ICCBasedColorSpace() override = default; Color color(Vector const& arguments) const override; int number_of_components() const override { VERIFY_NOT_REACHED(); } Vector default_decode() const override; ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; } private: ICCBasedColorSpace() = delete; }; }