CSSLabLike.h 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. /*
  2. * Copyright (c) 2024, Sam Atkins <sam@ladybird.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibWeb/CSS/StyleValues/CSSColorValue.h>
  8. #include <LibWeb/CSS/StyleValues/NumberStyleValue.h>
  9. namespace Web::CSS {
  10. class CSSLabLike : public CSSColorValue {
  11. public:
  12. virtual ~CSSLabLike() override = default;
  13. CSSStyleValue const& l() const { return *m_properties.l; }
  14. CSSStyleValue const& a() const { return *m_properties.a; }
  15. CSSStyleValue const& b() const { return *m_properties.b; }
  16. CSSStyleValue const& alpha() const { return *m_properties.alpha; }
  17. virtual bool equals(CSSStyleValue const& other) const override;
  18. protected:
  19. CSSLabLike(ColorType color_type, ValueComparingNonnullRefPtr<CSSStyleValue> l, ValueComparingNonnullRefPtr<CSSStyleValue> a, ValueComparingNonnullRefPtr<CSSStyleValue> b, ValueComparingNonnullRefPtr<CSSStyleValue> alpha)
  20. : CSSColorValue(color_type)
  21. , m_properties { .l = move(l), .a = move(a), .b = move(b), .alpha = move(alpha) }
  22. {
  23. }
  24. struct Properties {
  25. ValueComparingNonnullRefPtr<CSSStyleValue> l;
  26. ValueComparingNonnullRefPtr<CSSStyleValue> a;
  27. ValueComparingNonnullRefPtr<CSSStyleValue> b;
  28. ValueComparingNonnullRefPtr<CSSStyleValue> alpha;
  29. bool operator==(Properties const&) const = default;
  30. } m_properties;
  31. };
  32. // https://drafts.css-houdini.org/css-typed-om-1/#cssoklab
  33. class CSSOKLab final : public CSSLabLike {
  34. public:
  35. static ValueComparingNonnullRefPtr<CSSOKLab> create(ValueComparingNonnullRefPtr<CSSStyleValue> l, ValueComparingNonnullRefPtr<CSSStyleValue> a, ValueComparingNonnullRefPtr<CSSStyleValue> b, ValueComparingRefPtr<CSSStyleValue> alpha = {})
  36. {
  37. // alpha defaults to 1
  38. if (!alpha)
  39. return adopt_ref(*new (nothrow) CSSOKLab(move(l), move(a), move(b), NumberStyleValue::create(1)));
  40. return adopt_ref(*new (nothrow) CSSOKLab(move(l), move(a), move(b), alpha.release_nonnull()));
  41. }
  42. virtual Color to_color(Optional<Layout::NodeWithStyle const&>) const override;
  43. virtual String to_string() const override;
  44. private:
  45. CSSOKLab(ValueComparingNonnullRefPtr<CSSStyleValue> l, ValueComparingNonnullRefPtr<CSSStyleValue> a, ValueComparingNonnullRefPtr<CSSStyleValue> b, ValueComparingNonnullRefPtr<CSSStyleValue> alpha)
  46. : CSSLabLike(ColorType::OKLab, move(l), move(a), move(b), move(alpha))
  47. {
  48. }
  49. };
  50. // https://drafts.css-houdini.org/css-typed-om-1/#csslab
  51. class CSSLab final : public CSSLabLike {
  52. public:
  53. static ValueComparingNonnullRefPtr<CSSLab> create(ValueComparingNonnullRefPtr<CSSStyleValue> l, ValueComparingNonnullRefPtr<CSSStyleValue> a, ValueComparingNonnullRefPtr<CSSStyleValue> b, ValueComparingRefPtr<CSSStyleValue> alpha = {})
  54. {
  55. // alpha defaults to 1
  56. if (!alpha)
  57. return adopt_ref(*new (nothrow) CSSLab(move(l), move(a), move(b), NumberStyleValue::create(1)));
  58. return adopt_ref(*new (nothrow) CSSLab(move(l), move(a), move(b), alpha.release_nonnull()));
  59. }
  60. virtual Color to_color(Optional<Layout::NodeWithStyle const&>) const override;
  61. virtual String to_string() const override;
  62. private:
  63. CSSLab(ValueComparingNonnullRefPtr<CSSStyleValue> l, ValueComparingNonnullRefPtr<CSSStyleValue> a, ValueComparingNonnullRefPtr<CSSStyleValue> b, ValueComparingNonnullRefPtr<CSSStyleValue> alpha)
  64. : CSSLabLike(ColorType::Lab, move(l), move(a), move(b), move(alpha))
  65. {
  66. }
  67. };
  68. }