ColorSpace.h 4.5 KB

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