CanvasFillStrokeStyles.h 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /*
  2. * Copyright (c) 2020-2022, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
  4. * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
  5. * Copyright (c) 2023, MacDue <macdue@dueutil.tech>
  6. *
  7. * SPDX-License-Identifier: BSD-2-Clause
  8. */
  9. #pragma once
  10. #include <AK/String.h>
  11. #include <LibWeb/HTML/Canvas/CanvasState.h>
  12. #include <LibWeb/HTML/CanvasGradient.h>
  13. #include <LibWeb/HTML/CanvasPattern.h>
  14. namespace Web::HTML {
  15. // https://html.spec.whatwg.org/multipage/canvas.html#canvasfillstrokestyles
  16. template<typename IncludingClass>
  17. class CanvasFillStrokeStyles {
  18. public:
  19. ~CanvasFillStrokeStyles() = default;
  20. using FillOrStrokeStyleVariant = Variant<String, JS::Handle<CanvasGradient>, JS::Handle<CanvasPattern>>;
  21. static CanvasState::FillOrStrokeStyle to_canvas_state_fill_or_stroke_style(auto const& style)
  22. {
  23. return style.visit(
  24. [&](String const& string) -> CanvasState::FillOrStrokeStyle {
  25. return Gfx::Color::from_string(string).value_or(Color::Black);
  26. },
  27. [&](auto fill_or_stroke_style) -> CanvasState::FillOrStrokeStyle {
  28. return fill_or_stroke_style;
  29. });
  30. }
  31. void set_fill_style(FillOrStrokeStyleVariant style)
  32. {
  33. // FIXME: 2. If the given value is a CanvasPattern object that is marked as not origin-clean, then set this's origin-clean flag to false.
  34. my_drawing_state().fill_style = to_canvas_state_fill_or_stroke_style(style);
  35. }
  36. FillOrStrokeStyleVariant fill_style() const
  37. {
  38. return my_drawing_state().fill_style.to_js_fill_or_stroke_style();
  39. }
  40. void set_stroke_style(FillOrStrokeStyleVariant style)
  41. {
  42. // FIXME: 2. If the given value is a CanvasPattern object that is marked as not origin-clean, then set this's origin-clean flag to false.
  43. my_drawing_state().stroke_style = to_canvas_state_fill_or_stroke_style(style);
  44. }
  45. FillOrStrokeStyleVariant stroke_style() const
  46. {
  47. return my_drawing_state().stroke_style.to_js_fill_or_stroke_style();
  48. }
  49. WebIDL::ExceptionOr<JS::NonnullGCPtr<CanvasGradient>> create_radial_gradient(double x0, double y0, double r0, double x1, double y1, double r1)
  50. {
  51. auto& realm = static_cast<IncludingClass&>(*this).realm();
  52. return CanvasGradient::create_radial(realm, x0, y0, r0, x1, y1, r1);
  53. }
  54. JS::NonnullGCPtr<CanvasGradient> create_linear_gradient(double x0, double y0, double x1, double y1)
  55. {
  56. auto& realm = static_cast<IncludingClass&>(*this).realm();
  57. return CanvasGradient::create_linear(realm, x0, y0, x1, y1).release_value_but_fixme_should_propagate_errors();
  58. }
  59. JS::NonnullGCPtr<CanvasGradient> create_conic_gradient(double start_angle, double x, double y)
  60. {
  61. auto& realm = static_cast<IncludingClass&>(*this).realm();
  62. return CanvasGradient::create_conic(realm, start_angle, x, y).release_value_but_fixme_should_propagate_errors();
  63. }
  64. WebIDL::ExceptionOr<JS::GCPtr<CanvasPattern>> create_pattern(CanvasImageSource const& image, StringView repetition)
  65. {
  66. auto& realm = static_cast<IncludingClass&>(*this).realm();
  67. return CanvasPattern::create(realm, image, repetition);
  68. }
  69. protected:
  70. CanvasFillStrokeStyles() = default;
  71. private:
  72. CanvasState::DrawingState& my_drawing_state() { return reinterpret_cast<IncludingClass&>(*this).drawing_state(); }
  73. CanvasState::DrawingState const& my_drawing_state() const { return reinterpret_cast<IncludingClass const&>(*this).drawing_state(); }
  74. };
  75. }