ColorSpace.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  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 <LibGfx/PaintStyle.h>
  12. #include <LibPDF/Function.h>
  13. #include <LibPDF/Value.h>
  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, true) \
  24. V(Separation, false) \
  25. V(DeviceN, false)
  26. namespace PDF {
  27. typedef Variant<Gfx::Color, NonnullRefPtr<Gfx::PaintStyle>> ColorOrStyle;
  28. class Renderer;
  29. class ColorSpaceFamily {
  30. public:
  31. ColorSpaceFamily(DeprecatedFlyString name, bool may_be_specified_directly)
  32. : m_name(move(name))
  33. , m_may_be_specified_directly(may_be_specified_directly)
  34. {
  35. }
  36. DeprecatedFlyString name() const { return m_name; }
  37. bool may_be_specified_directly() const { return m_may_be_specified_directly; }
  38. static PDFErrorOr<ColorSpaceFamily> get(DeprecatedFlyString const&);
  39. #define ENUMERATE(name, may_be_specified_directly) static ColorSpaceFamily name;
  40. ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE)
  41. #undef ENUMERATE
  42. bool operator==(ColorSpaceFamily const& other) const
  43. {
  44. return m_name == other.m_name;
  45. }
  46. private:
  47. DeprecatedFlyString m_name;
  48. bool m_may_be_specified_directly;
  49. };
  50. class ColorSpace : public RefCounted<ColorSpace> {
  51. public:
  52. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<Object>, Renderer&);
  53. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&, Renderer&);
  54. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>, Renderer&);
  55. virtual ~ColorSpace() = default;
  56. virtual PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const = 0;
  57. virtual PDFErrorOr<ColorOrStyle> style(ReadonlySpan<Value> arguments) const
  58. {
  59. Vector<float, 4> float_arguments;
  60. for (auto& argument : arguments)
  61. float_arguments.append(argument.to_float());
  62. return style(float_arguments);
  63. }
  64. virtual int number_of_components() const = 0;
  65. virtual Vector<float> default_decode() const = 0; // "TABLE 4.40 Default Decode arrays"
  66. virtual ColorSpaceFamily const& family() const = 0;
  67. };
  68. class DeviceGrayColorSpace final : public ColorSpace {
  69. public:
  70. static NonnullRefPtr<DeviceGrayColorSpace> the();
  71. ~DeviceGrayColorSpace() override = default;
  72. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  73. int number_of_components() const override { return 1; }
  74. Vector<float> default_decode() const override;
  75. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; }
  76. private:
  77. DeviceGrayColorSpace() = default;
  78. };
  79. class DeviceRGBColorSpace final : public ColorSpace {
  80. public:
  81. static NonnullRefPtr<DeviceRGBColorSpace> the();
  82. ~DeviceRGBColorSpace() override = default;
  83. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  84. int number_of_components() const override { return 3; }
  85. Vector<float> default_decode() const override;
  86. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; }
  87. private:
  88. DeviceRGBColorSpace() = default;
  89. };
  90. class DeviceCMYKColorSpace final : public ColorSpace {
  91. public:
  92. static ErrorOr<NonnullRefPtr<DeviceCMYKColorSpace>> the();
  93. ~DeviceCMYKColorSpace() override = default;
  94. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  95. int number_of_components() const override { return 4; }
  96. Vector<float> default_decode() const override;
  97. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; }
  98. private:
  99. DeviceCMYKColorSpace() = default;
  100. };
  101. class DeviceNColorSpace final : public ColorSpace {
  102. public:
  103. static PDFErrorOr<NonnullRefPtr<DeviceNColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
  104. ~DeviceNColorSpace() override = default;
  105. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  106. int number_of_components() const override;
  107. Vector<float> default_decode() const override;
  108. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceN; }
  109. private:
  110. DeviceNColorSpace(NonnullRefPtr<ColorSpace>, NonnullRefPtr<Function>);
  111. Vector<ByteString> m_names;
  112. NonnullRefPtr<ColorSpace> m_alternate_space;
  113. NonnullRefPtr<Function> m_tint_transform;
  114. Vector<Value> mutable m_tint_output_values;
  115. };
  116. class CalGrayColorSpace final : public ColorSpace {
  117. public:
  118. static PDFErrorOr<NonnullRefPtr<CalGrayColorSpace>> create(Document*, Vector<Value>&& parameters);
  119. ~CalGrayColorSpace() override = default;
  120. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  121. int number_of_components() const override { return 1; }
  122. Vector<float> default_decode() const override;
  123. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalGray; }
  124. private:
  125. CalGrayColorSpace() = default;
  126. Array<float, 3> m_whitepoint { 0, 0, 0 };
  127. Array<float, 3> m_blackpoint { 0, 0, 0 };
  128. float m_gamma { 1 };
  129. };
  130. class CalRGBColorSpace final : public ColorSpace {
  131. public:
  132. static PDFErrorOr<NonnullRefPtr<CalRGBColorSpace>> create(Document*, Vector<Value>&& parameters);
  133. ~CalRGBColorSpace() override = default;
  134. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  135. int number_of_components() const override { return 3; }
  136. Vector<float> default_decode() const override;
  137. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; }
  138. private:
  139. CalRGBColorSpace() = default;
  140. Array<float, 3> m_whitepoint { 0, 0, 0 };
  141. Array<float, 3> m_blackpoint { 0, 0, 0 };
  142. Array<float, 3> m_gamma { 1, 1, 1 };
  143. Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
  144. };
  145. class ICCBasedColorSpace final : public ColorSpace {
  146. public:
  147. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
  148. ~ICCBasedColorSpace() override = default;
  149. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  150. int number_of_components() const override;
  151. Vector<float> default_decode() const override;
  152. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; }
  153. static NonnullRefPtr<Gfx::ICC::Profile> sRGB();
  154. private:
  155. ICCBasedColorSpace(NonnullRefPtr<Gfx::ICC::Profile>);
  156. static RefPtr<Gfx::ICC::Profile> s_srgb_profile;
  157. NonnullRefPtr<Gfx::ICC::Profile> m_profile;
  158. mutable Vector<float, 4> m_components;
  159. mutable Vector<u8, 4> m_bytes;
  160. Optional<Gfx::ICC::MatrixMatrixConversion> m_map;
  161. };
  162. class LabColorSpace final : public ColorSpace {
  163. public:
  164. static PDFErrorOr<NonnullRefPtr<LabColorSpace>> create(Document*, Vector<Value>&& parameters);
  165. ~LabColorSpace() override = default;
  166. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  167. int number_of_components() const override { return 3; }
  168. Vector<float> default_decode() const override;
  169. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Lab; }
  170. private:
  171. LabColorSpace() = default;
  172. Array<float, 3> m_whitepoint { 0, 0, 0 };
  173. Array<float, 3> m_blackpoint { 0, 0, 0 };
  174. Array<float, 4> m_range { -100, 100, -100, 100 };
  175. };
  176. class IndexedColorSpace final : public ColorSpace {
  177. public:
  178. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
  179. ~IndexedColorSpace() override = default;
  180. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  181. int number_of_components() const override { return 1; }
  182. Vector<float> default_decode() const override;
  183. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Indexed; }
  184. private:
  185. IndexedColorSpace(NonnullRefPtr<ColorSpace>);
  186. NonnullRefPtr<ColorSpace> m_base;
  187. int m_hival { 0 };
  188. Vector<u8> m_lookup;
  189. };
  190. class SeparationColorSpace final : public ColorSpace {
  191. public:
  192. static PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> create(Document*, Vector<Value>&& parameters, Renderer&);
  193. ~SeparationColorSpace() override = default;
  194. PDFErrorOr<ColorOrStyle> style(ReadonlySpan<float> arguments) const override;
  195. int number_of_components() const override { return 1; }
  196. Vector<float> default_decode() const override;
  197. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Separation; }
  198. private:
  199. SeparationColorSpace(NonnullRefPtr<ColorSpace>, NonnullRefPtr<Function>);
  200. ByteString m_name;
  201. NonnullRefPtr<ColorSpace> m_alternate_space;
  202. NonnullRefPtr<Function> m_tint_transform;
  203. Vector<Value> mutable m_tint_output_values;
  204. };
  205. }