Serenity Operating System
at master 143 lines 4.6 kB view raw
1/* 2 * Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#pragma once 8 9#include <AK/DeprecatedFlyString.h> 10#include <AK/Forward.h> 11#include <LibGfx/Color.h> 12#include <LibPDF/Value.h> 13 14#define ENUMERATE_COLOR_SPACE_FAMILIES(V) \ 15 V(DeviceGray, true) \ 16 V(DeviceRGB, true) \ 17 V(DeviceCMYK, true) \ 18 V(CalGray, false) \ 19 V(CalRGB, false) \ 20 V(Lab, false) \ 21 V(ICCBased, false) \ 22 V(Indexed, false) \ 23 V(Pattern, false) \ 24 V(Separation, false) \ 25 V(DeviceN, false) 26 27namespace PDF { 28 29class ColorSpaceFamily { 30public: 31 ColorSpaceFamily(DeprecatedFlyString name, bool never_needs_paramaters_p) 32 : m_name(move(name)) 33 , m_never_needs_parameters(never_needs_paramaters_p) 34 { 35 } 36 37 DeprecatedFlyString name() const { return m_name; }; 38 bool never_needs_parameters() const { return m_never_needs_parameters; }; 39 static PDFErrorOr<ColorSpaceFamily> get(DeprecatedFlyString const&); 40 41#define ENUMERATE(name, ever_needs_parameters) static ColorSpaceFamily name; 42 ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE) 43#undef ENUMERATE 44 45private: 46 DeprecatedFlyString m_name; 47 bool m_never_needs_parameters; 48}; 49 50class ColorSpace : public RefCounted<ColorSpace> { 51public: 52 static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&); 53 static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>); 54 55 virtual ~ColorSpace() = default; 56 57 virtual Color color(Vector<Value> const& arguments) const = 0; 58 virtual int number_of_components() const = 0; 59 virtual Vector<float> default_decode() const = 0; 60 virtual ColorSpaceFamily const& family() const = 0; 61}; 62 63class DeviceGrayColorSpace final : public ColorSpace { 64public: 65 static NonnullRefPtr<DeviceGrayColorSpace> the(); 66 67 ~DeviceGrayColorSpace() override = default; 68 69 Color color(Vector<Value> const& arguments) const override; 70 int number_of_components() const override { return 1; } 71 Vector<float> default_decode() const override; 72 ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; } 73 74private: 75 DeviceGrayColorSpace() = default; 76}; 77 78class DeviceRGBColorSpace final : public ColorSpace { 79public: 80 static NonnullRefPtr<DeviceRGBColorSpace> the(); 81 82 ~DeviceRGBColorSpace() override = default; 83 84 Color color(Vector<Value> const& arguments) const override; 85 int number_of_components() const override { return 3; } 86 Vector<float> default_decode() const override; 87 ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; } 88 89private: 90 DeviceRGBColorSpace() = default; 91}; 92 93class DeviceCMYKColorSpace final : public ColorSpace { 94public: 95 static NonnullRefPtr<DeviceCMYKColorSpace> the(); 96 97 ~DeviceCMYKColorSpace() override = default; 98 99 Color color(Vector<Value> const& arguments) const override; 100 int number_of_components() const override { return 4; } 101 Vector<float> default_decode() const override; 102 ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; } 103 104private: 105 DeviceCMYKColorSpace() = default; 106}; 107 108class CalRGBColorSpace final : public ColorSpace { 109public: 110 static PDFErrorOr<NonnullRefPtr<CalRGBColorSpace>> create(Document*, Vector<Value>&& parameters); 111 112 ~CalRGBColorSpace() override = default; 113 114 Color color(Vector<Value> const& arguments) const override; 115 int number_of_components() const override { return 3; } 116 Vector<float> default_decode() const override; 117 ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; } 118 119private: 120 CalRGBColorSpace() = default; 121 122 Array<float, 3> m_whitepoint { 0, 0, 0 }; 123 Array<float, 3> m_blackpoint { 0, 0, 0 }; 124 Array<float, 3> m_gamma { 1, 1, 1 }; 125 Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 }; 126}; 127 128class ICCBasedColorSpace final : public ColorSpace { 129public: 130 static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters); 131 132 ~ICCBasedColorSpace() override = default; 133 134 Color color(Vector<Value> const& arguments) const override; 135 int number_of_components() const override { VERIFY_NOT_REACHED(); } 136 Vector<float> default_decode() const override; 137 ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; } 138 139private: 140 ICCBasedColorSpace() = delete; 141}; 142 143}