CSSColorValue.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (c) 2018-2020, Andreas Kling <andreas@ladybird.org>
  3. * Copyright (c) 2021, Tobias Christiansen <tobyase@serenityos.org>
  4. * Copyright (c) 2021-2024, Sam Atkins <sam@ladybird.org>
  5. * Copyright (c) 2022-2023, MacDue <macdue@dueutil.tech>
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause
  8. */
  9. #include "CSSColorValue.h"
  10. #include <LibWeb/CSS/Serialize.h>
  11. #include <LibWeb/CSS/StyleValues/AngleStyleValue.h>
  12. #include <LibWeb/CSS/StyleValues/CSSMathValue.h>
  13. #include <LibWeb/CSS/StyleValues/CSSRGB.h>
  14. #include <LibWeb/CSS/StyleValues/NumberStyleValue.h>
  15. #include <LibWeb/CSS/StyleValues/PercentageStyleValue.h>
  16. namespace Web::CSS {
  17. ValueComparingNonnullRefPtr<CSSColorValue> CSSColorValue::create_from_color(Color color, Optional<FlyString> name)
  18. {
  19. return CSSRGB::create(
  20. NumberStyleValue::create(color.red()),
  21. NumberStyleValue::create(color.green()),
  22. NumberStyleValue::create(color.blue()),
  23. NumberStyleValue::create(color.alpha() / 255.0),
  24. name);
  25. }
  26. Optional<double> CSSColorValue::resolve_hue(CSSStyleValue const& style_value)
  27. {
  28. // <number> | <angle> | none
  29. auto normalized = [](double number) {
  30. return fmod(number, 360.0);
  31. };
  32. if (style_value.is_number())
  33. return normalized(style_value.as_number().number());
  34. if (style_value.is_angle())
  35. return normalized(style_value.as_angle().angle().to_degrees());
  36. if (style_value.is_math() && style_value.as_math().resolves_to_angle())
  37. return normalized(style_value.as_math().resolve_angle().value().to_degrees());
  38. if (style_value.is_keyword() && style_value.to_keyword() == Keyword::None)
  39. return 0;
  40. return {};
  41. }
  42. Optional<double> CSSColorValue::resolve_with_reference_value(CSSStyleValue const& style_value, float one_hundred_percent_value)
  43. {
  44. // <percentage> | <number> | none
  45. auto normalize_percentage = [one_hundred_percent_value](Percentage const& percentage) {
  46. return percentage.as_fraction() * one_hundred_percent_value;
  47. };
  48. if (style_value.is_percentage())
  49. return normalize_percentage(style_value.as_percentage().percentage());
  50. if (style_value.is_number())
  51. return style_value.as_number().number();
  52. if (style_value.is_math()) {
  53. auto const& calculated = style_value.as_math();
  54. if (calculated.resolves_to_number())
  55. return calculated.resolve_number().value();
  56. if (calculated.resolves_to_percentage())
  57. return normalize_percentage(calculated.resolve_percentage().value());
  58. }
  59. if (style_value.is_keyword() && style_value.to_keyword() == Keyword::None)
  60. return 0;
  61. return {};
  62. }
  63. Optional<double> CSSColorValue::resolve_alpha(CSSStyleValue const& style_value)
  64. {
  65. // <number> | <percentage> | none
  66. auto normalized = [](double number) {
  67. if (isnan(number))
  68. number = 0;
  69. return clamp(number, 0.0, 1.0);
  70. };
  71. if (style_value.is_number())
  72. return normalized(style_value.as_number().number());
  73. if (style_value.is_percentage())
  74. return normalized(style_value.as_percentage().percentage().as_fraction());
  75. if (style_value.is_math()) {
  76. auto const& calculated = style_value.as_math();
  77. if (calculated.resolves_to_number())
  78. return normalized(calculated.resolve_number().value());
  79. if (calculated.resolves_to_percentage())
  80. return normalized(calculated.resolve_percentage().value().as_fraction());
  81. }
  82. if (style_value.is_keyword() && style_value.to_keyword() == Keyword::None)
  83. return 0;
  84. return {};
  85. }
  86. }