BorderRadiusCornerClipper.h 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /*
  2. * Copyright (c) 2022, MacDue <macdue@dueutil.tech>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibGfx/AntiAliasingPainter.h>
  8. #include <LibWeb/Painting/BorderPainting.h>
  9. namespace Web::Painting {
  10. enum class CornerClip {
  11. Outside,
  12. Inside
  13. };
  14. struct BorderRadiusSamplingConfig {
  15. CornerRadii corner_radii;
  16. struct CornerLocations {
  17. Gfx::IntPoint top_left;
  18. Gfx::IntPoint top_right;
  19. Gfx::IntPoint bottom_right;
  20. Gfx::IntPoint bottom_left;
  21. };
  22. CornerLocations page_locations;
  23. CornerLocations bitmap_locations;
  24. Gfx::IntSize corners_bitmap_size;
  25. };
  26. BorderRadiusSamplingConfig calculate_border_radius_sampling_config(CornerRadii const& corner_radii, Gfx::IntRect const& border_rect);
  27. class BorderRadiusCornerClipper : public RefCounted<BorderRadiusCornerClipper> {
  28. public:
  29. static ErrorOr<NonnullRefPtr<BorderRadiusCornerClipper>> create(CornerRadii const&, DevicePixelRect const& border_rect, CornerClip corner_clip = CornerClip::Outside);
  30. void sample_under_corners(Gfx::Painter& page_painter);
  31. void blit_corner_clipping(Gfx::Painter& page_painter);
  32. BorderRadiusSamplingConfig m_data;
  33. DevicePixelRect border_rect() const { return m_border_rect; }
  34. BorderRadiusCornerClipper(BorderRadiusSamplingConfig corner_data, NonnullRefPtr<Gfx::Bitmap> corner_bitmap, CornerClip corner_clip, DevicePixelRect const& border_rect)
  35. : m_data(corner_data)
  36. , m_corner_bitmap(corner_bitmap)
  37. , m_corner_clip(corner_clip)
  38. , m_border_rect(border_rect)
  39. {
  40. }
  41. private:
  42. NonnullRefPtr<Gfx::Bitmap> m_corner_bitmap;
  43. bool m_has_sampled { false };
  44. CornerClip m_corner_clip { false };
  45. DevicePixelRect m_border_rect;
  46. };
  47. struct ScopedCornerRadiusClip {
  48. ScopedCornerRadiusClip(PaintContext& context, DevicePixelRect const& border_rect, BorderRadiiData const& border_radii, CornerClip corner_clip = CornerClip::Outside);
  49. ~ScopedCornerRadiusClip();
  50. AK_MAKE_NONMOVABLE(ScopedCornerRadiusClip);
  51. AK_MAKE_NONCOPYABLE(ScopedCornerRadiusClip);
  52. private:
  53. PaintContext& m_context;
  54. RefPtr<BorderRadiusCornerClipper> m_corner_clipper;
  55. u32 m_id;
  56. bool m_has_radius { false };
  57. Gfx::IntRect m_border_rect;
  58. };
  59. }