ColorSpace.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /*
  2. * Copyright (c) 2021-2022, Matthew Olsson <mattco@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/DeprecatedFlyString.h>
  8. #include <AK/Forward.h>
  9. #include <LibGfx/Color.h>
  10. #include <LibGfx/ICC/Profile.h>
  11. #include <LibPDF/Function.h>
  12. #include <LibPDF/Value.h>
  13. #define ENUMERATE_COLOR_SPACE_FAMILIES(V) \
  14. V(DeviceGray, true) \
  15. V(DeviceRGB, true) \
  16. V(DeviceCMYK, true) \
  17. V(CalGray, false) \
  18. V(CalRGB, false) \
  19. V(Lab, false) \
  20. V(ICCBased, false) \
  21. V(Indexed, false) \
  22. V(Pattern, true) \
  23. V(Separation, false) \
  24. V(DeviceN, false)
  25. namespace PDF {
  26. class ColorSpaceFamily {
  27. public:
  28. ColorSpaceFamily(DeprecatedFlyString name, bool may_be_specified_directly)
  29. : m_name(move(name))
  30. , m_may_be_specified_directly(may_be_specified_directly)
  31. {
  32. }
  33. DeprecatedFlyString name() const { return m_name; }
  34. bool may_be_specified_directly() const { return m_may_be_specified_directly; }
  35. static PDFErrorOr<ColorSpaceFamily> get(DeprecatedFlyString const&);
  36. #define ENUMERATE(name, may_be_specified_directly) static ColorSpaceFamily name;
  37. ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE)
  38. #undef ENUMERATE
  39. bool operator==(ColorSpaceFamily const& other) const
  40. {
  41. return m_name == other.m_name;
  42. }
  43. private:
  44. DeprecatedFlyString m_name;
  45. bool m_may_be_specified_directly;
  46. };
  47. class ColorSpace : public RefCounted<ColorSpace> {
  48. public:
  49. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<Object>);
  50. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&);
  51. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>);
  52. virtual ~ColorSpace() = default;
  53. virtual PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const = 0;
  54. virtual int number_of_components() const = 0;
  55. virtual Vector<float> default_decode() const = 0; // "TABLE 4.40 Default Decode arrays"
  56. virtual ColorSpaceFamily const& family() const = 0;
  57. };
  58. class DeviceGrayColorSpace final : public ColorSpace {
  59. public:
  60. static NonnullRefPtr<DeviceGrayColorSpace> the();
  61. ~DeviceGrayColorSpace() override = default;
  62. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  63. int number_of_components() const override { return 1; }
  64. Vector<float> default_decode() const override;
  65. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; }
  66. private:
  67. DeviceGrayColorSpace() = default;
  68. };
  69. class DeviceRGBColorSpace final : public ColorSpace {
  70. public:
  71. static NonnullRefPtr<DeviceRGBColorSpace> the();
  72. ~DeviceRGBColorSpace() override = default;
  73. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  74. int number_of_components() const override { return 3; }
  75. Vector<float> default_decode() const override;
  76. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; }
  77. private:
  78. DeviceRGBColorSpace() = default;
  79. };
  80. class DeviceCMYKColorSpace final : public ColorSpace {
  81. public:
  82. static NonnullRefPtr<DeviceCMYKColorSpace> the();
  83. ~DeviceCMYKColorSpace() override = default;
  84. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  85. int number_of_components() const override { return 4; }
  86. Vector<float> default_decode() const override;
  87. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; }
  88. private:
  89. DeviceCMYKColorSpace() = default;
  90. };
  91. class DeviceNColorSpace final : public ColorSpace {
  92. public:
  93. static PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> create(Document*, Vector<Value>&& parameters);
  94. ~DeviceNColorSpace() override = default;
  95. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  96. int number_of_components() const override;
  97. Vector<float> default_decode() const override;
  98. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceN; }
  99. private:
  100. DeviceNColorSpace(NonnullRefPtr<ColorSpace>, NonnullRefPtr<Function>);
  101. Vector<DeprecatedString> m_names;
  102. NonnullRefPtr<ColorSpace> m_alternate_space;
  103. NonnullRefPtr<Function> m_tint_transform;
  104. Vector<float> mutable m_tint_input_values;
  105. Vector<Value> mutable m_tint_output_values;
  106. };
  107. class CalGrayColorSpace final : public ColorSpace {
  108. public:
  109. static PDFErrorOr<NonnullRefPtr<CalGrayColorSpace>> create(Document*, Vector<Value>&& parameters);
  110. ~CalGrayColorSpace() override = default;
  111. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  112. int number_of_components() const override { return 1; }
  113. Vector<float> default_decode() const override;
  114. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalGray; }
  115. private:
  116. CalGrayColorSpace() = default;
  117. Array<float, 3> m_whitepoint { 0, 0, 0 };
  118. Array<float, 3> m_blackpoint { 0, 0, 0 };
  119. float m_gamma { 1 };
  120. };
  121. class CalRGBColorSpace final : public ColorSpace {
  122. public:
  123. static PDFErrorOr<NonnullRefPtr<CalRGBColorSpace>> create(Document*, Vector<Value>&& parameters);
  124. ~CalRGBColorSpace() override = default;
  125. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  126. int number_of_components() const override { return 3; }
  127. Vector<float> default_decode() const override;
  128. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; }
  129. private:
  130. CalRGBColorSpace() = default;
  131. Array<float, 3> m_whitepoint { 0, 0, 0 };
  132. Array<float, 3> m_blackpoint { 0, 0, 0 };
  133. Array<float, 3> m_gamma { 1, 1, 1 };
  134. Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
  135. };
  136. class ICCBasedColorSpace final : public ColorSpace {
  137. public:
  138. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
  139. ~ICCBasedColorSpace() override = default;
  140. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  141. int number_of_components() const override;
  142. Vector<float> default_decode() const override;
  143. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; }
  144. private:
  145. ICCBasedColorSpace(NonnullRefPtr<Gfx::ICC::Profile>);
  146. static RefPtr<Gfx::ICC::Profile> s_srgb_profile;
  147. NonnullRefPtr<Gfx::ICC::Profile> m_profile;
  148. };
  149. class LabColorSpace final : public ColorSpace {
  150. public:
  151. static PDFErrorOr<NonnullRefPtr<LabColorSpace>> create(Document*, Vector<Value>&& parameters);
  152. ~LabColorSpace() override = default;
  153. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  154. int number_of_components() const override { return 3; }
  155. Vector<float> default_decode() const override;
  156. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Lab; }
  157. private:
  158. LabColorSpace() = default;
  159. Array<float, 3> m_whitepoint { 0, 0, 0 };
  160. Array<float, 3> m_blackpoint { 0, 0, 0 };
  161. Array<float, 4> m_range { -100, 100, -100, 100 };
  162. };
  163. class IndexedColorSpace final : public ColorSpace {
  164. public:
  165. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
  166. ~IndexedColorSpace() override = default;
  167. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  168. int number_of_components() const override { return 1; }
  169. Vector<float> default_decode() const override;
  170. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Indexed; }
  171. private:
  172. IndexedColorSpace(NonnullRefPtr<ColorSpace>);
  173. NonnullRefPtr<ColorSpace> m_base;
  174. int m_hival { 0 };
  175. Vector<u8> m_lookup;
  176. };
  177. class SeparationColorSpace final : public ColorSpace {
  178. public:
  179. static PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> create(Document*, Vector<Value>&& parameters);
  180. ~SeparationColorSpace() override = default;
  181. PDFErrorOr<Color> color(ReadonlySpan<Value> arguments) const override;
  182. int number_of_components() const override { return 1; }
  183. Vector<float> default_decode() const override;
  184. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Separation; }
  185. private:
  186. SeparationColorSpace(NonnullRefPtr<ColorSpace>, NonnullRefPtr<Function>);
  187. DeprecatedString m_name;
  188. NonnullRefPtr<ColorSpace> m_alternate_space;
  189. NonnullRefPtr<Function> m_tint_transform;
  190. Vector<Value> mutable m_tint_output_values;
  191. };
  192. }