ClipFrame.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. /*
  2. * Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <LibWeb/Painting/ClipFrame.h>
  7. namespace Web::Painting {
  8. void ClipFrame::add_clip_rect(CSSPixelRect rect, BorderRadiiData radii, RefPtr<ScrollFrame const> enclosing_scroll_frame)
  9. {
  10. for (auto& existing_clip : m_clip_rects) {
  11. if (rect == existing_clip.rect && enclosing_scroll_frame == existing_clip.enclosing_scroll_frame) {
  12. existing_clip.corner_radii.union_max_radii(radii);
  13. return;
  14. }
  15. }
  16. m_clip_rects.append({ rect, radii, move(enclosing_scroll_frame) });
  17. }
  18. CSSPixelRect ClipFrame::clip_rect_for_hit_testing() const
  19. {
  20. VERIFY(!m_clip_rects.is_empty());
  21. auto rect = m_clip_rects[0].rect;
  22. if (m_clip_rects[0].enclosing_scroll_frame) {
  23. rect.translate_by(m_clip_rects[0].enclosing_scroll_frame->cumulative_offset());
  24. }
  25. for (size_t i = 1; i < m_clip_rects.size(); ++i) {
  26. auto clip_rect = m_clip_rects[i].rect;
  27. if (m_clip_rects[i].enclosing_scroll_frame) {
  28. clip_rect.translate_by(m_clip_rects[i].enclosing_scroll_frame->cumulative_offset());
  29. }
  30. rect.intersect(clip_rect);
  31. }
  32. return rect;
  33. }
  34. }