CMYKBitmap.h 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (c) 2024, Nico Weber <thakis@chromium.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/ByteBuffer.h>
  8. #include <AK/NonnullRefPtr.h>
  9. #include <AK/RefCounted.h>
  10. #include <LibGfx/Bitmap.h>
  11. #include <LibGfx/Size.h>
  12. namespace Gfx {
  13. struct CMYK {
  14. u8 c;
  15. u8 m;
  16. u8 y;
  17. u8 k;
  18. int operator<=>(CMYK const&) const = default;
  19. };
  20. class CMYKBitmap : public RefCounted<CMYKBitmap> {
  21. public:
  22. static ErrorOr<NonnullRefPtr<CMYKBitmap>> create_with_size(IntSize const& size);
  23. IntSize const& size() const { return m_size; }
  24. [[nodiscard]] CMYK* scanline(int y);
  25. [[nodiscard]] CMYK const* scanline(int y) const;
  26. [[nodiscard]] CMYK* begin();
  27. [[nodiscard]] CMYK* end();
  28. [[nodiscard]] size_t data_size() const { return m_data.size(); }
  29. ErrorOr<RefPtr<Bitmap>> to_low_quality_rgb() const;
  30. private:
  31. CMYKBitmap(IntSize const& size, ByteBuffer data)
  32. : m_size(size)
  33. , m_data(move(data))
  34. {
  35. }
  36. IntSize m_size;
  37. ByteBuffer m_data;
  38. mutable RefPtr<Bitmap> m_rgb_bitmap;
  39. };
  40. inline CMYK* CMYKBitmap::scanline(int y)
  41. {
  42. VERIFY(y >= 0 && y < m_size.height());
  43. return reinterpret_cast<CMYK*>(m_data.data() + y * m_size.width() * sizeof(CMYK));
  44. }
  45. inline CMYK const* CMYKBitmap::scanline(int y) const
  46. {
  47. VERIFY(y >= 0 && y < m_size.height());
  48. return reinterpret_cast<CMYK const*>(m_data.data() + y * m_size.width() * sizeof(CMYK));
  49. }
  50. inline CMYK* CMYKBitmap::begin()
  51. {
  52. return reinterpret_cast<CMYK*>(m_data.data());
  53. }
  54. inline CMYK* CMYKBitmap::end()
  55. {
  56. return reinterpret_cast<CMYK*>(m_data.data() + data_size());
  57. }
  58. }