Serenity Operating System
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}