ColorSpace.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  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/Value.h>
  12. #define ENUMERATE_COLOR_SPACE_FAMILIES(V) \
  13. V(DeviceGray, true) \
  14. V(DeviceRGB, true) \
  15. V(DeviceCMYK, true) \
  16. V(CalGray, false) \
  17. V(CalRGB, false) \
  18. V(Lab, false) \
  19. V(ICCBased, false) \
  20. V(Indexed, false) \
  21. V(Pattern, false) \
  22. V(Separation, false) \
  23. V(DeviceN, false)
  24. namespace PDF {
  25. class ColorSpaceFamily {
  26. public:
  27. ColorSpaceFamily(DeprecatedFlyString name, bool never_needs_paramaters_p)
  28. : m_name(move(name))
  29. , m_never_needs_parameters(never_needs_paramaters_p)
  30. {
  31. }
  32. DeprecatedFlyString name() const { return m_name; }
  33. bool never_needs_parameters() const { return m_never_needs_parameters; }
  34. static PDFErrorOr<ColorSpaceFamily> get(DeprecatedFlyString const&);
  35. #define ENUMERATE(name, ever_needs_parameters) static ColorSpaceFamily name;
  36. ENUMERATE_COLOR_SPACE_FAMILIES(ENUMERATE)
  37. #undef ENUMERATE
  38. private:
  39. DeprecatedFlyString m_name;
  40. bool m_never_needs_parameters;
  41. };
  42. class ColorSpace : public RefCounted<ColorSpace> {
  43. public:
  44. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(DeprecatedFlyString const&);
  45. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, NonnullRefPtr<ArrayObject>);
  46. virtual ~ColorSpace() = default;
  47. virtual PDFErrorOr<Color> color(Vector<Value> const& arguments) const = 0;
  48. virtual int number_of_components() const = 0;
  49. virtual Vector<float> default_decode() const = 0;
  50. virtual ColorSpaceFamily const& family() const = 0;
  51. };
  52. class DeviceGrayColorSpace final : public ColorSpace {
  53. public:
  54. static NonnullRefPtr<DeviceGrayColorSpace> the();
  55. ~DeviceGrayColorSpace() override = default;
  56. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  57. int number_of_components() const override { return 1; }
  58. Vector<float> default_decode() const override;
  59. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceGray; }
  60. private:
  61. DeviceGrayColorSpace() = default;
  62. };
  63. class DeviceRGBColorSpace final : public ColorSpace {
  64. public:
  65. static NonnullRefPtr<DeviceRGBColorSpace> the();
  66. ~DeviceRGBColorSpace() override = default;
  67. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  68. int number_of_components() const override { return 3; }
  69. Vector<float> default_decode() const override;
  70. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceRGB; }
  71. private:
  72. DeviceRGBColorSpace() = default;
  73. };
  74. class DeviceCMYKColorSpace final : public ColorSpace {
  75. public:
  76. static NonnullRefPtr<DeviceCMYKColorSpace> the();
  77. ~DeviceCMYKColorSpace() override = default;
  78. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  79. int number_of_components() const override { return 4; }
  80. Vector<float> default_decode() const override;
  81. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::DeviceCMYK; }
  82. private:
  83. DeviceCMYKColorSpace() = default;
  84. };
  85. class CalRGBColorSpace final : public ColorSpace {
  86. public:
  87. static PDFErrorOr<NonnullRefPtr<CalRGBColorSpace>> create(Document*, Vector<Value>&& parameters);
  88. ~CalRGBColorSpace() override = default;
  89. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  90. int number_of_components() const override { return 3; }
  91. Vector<float> default_decode() const override;
  92. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::CalRGB; }
  93. private:
  94. CalRGBColorSpace() = default;
  95. Array<float, 3> m_whitepoint { 0, 0, 0 };
  96. Array<float, 3> m_blackpoint { 0, 0, 0 };
  97. Array<float, 3> m_gamma { 1, 1, 1 };
  98. Array<float, 9> m_matrix { 1, 0, 0, 0, 1, 0, 0, 0, 1 };
  99. };
  100. class ICCBasedColorSpace final : public ColorSpace {
  101. public:
  102. static PDFErrorOr<NonnullRefPtr<ColorSpace>> create(Document*, Vector<Value>&& parameters);
  103. ~ICCBasedColorSpace() override = default;
  104. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  105. int number_of_components() const override { VERIFY_NOT_REACHED(); }
  106. Vector<float> default_decode() const override;
  107. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::ICCBased; }
  108. private:
  109. ICCBasedColorSpace(NonnullRefPtr<Gfx::ICC::Profile>);
  110. static RefPtr<Gfx::ICC::Profile> s_srgb_profile;
  111. NonnullRefPtr<Gfx::ICC::Profile> m_profile;
  112. };
  113. class SeparationColorSpace final : public ColorSpace {
  114. public:
  115. static PDFErrorOr<NonnullRefPtr<SeparationColorSpace>> create(Document*, Vector<Value>&& parameters);
  116. ~SeparationColorSpace() override = default;
  117. PDFErrorOr<Color> color(Vector<Value> const& arguments) const override;
  118. int number_of_components() const override { TODO(); }
  119. Vector<float> default_decode() const override;
  120. ColorSpaceFamily const& family() const override { return ColorSpaceFamily::Separation; }
  121. private:
  122. SeparationColorSpace() = default;
  123. };
  124. }