ladybird/Userland/Libraries/LibWeb/Painting/ClipFrame.h
Aliaksandr Kalenik c74fc4c171 LibWeb: Clean previous border radii clips in refresh_clip_state()
The list of border radii clips needs to be reset before being populated
with new clips that have refreshed positions. Besides fixing painting,
this also improves performance because the number of sample/blit
commands does not increase as we scroll.
2024-02-28 07:44:12 -05:00

41 lines
1.1 KiB
C++

/*
* Copyright (c) 2024, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#include <LibWeb/Painting/BorderRadiiData.h>
#include <LibWeb/PixelUnits.h>
namespace Web::Painting {
struct BorderRadiiClip {
CSSPixelRect rect;
BorderRadiiData radii;
};
struct ClipFrame : public RefCounted<ClipFrame> {
Vector<BorderRadiiClip> const& border_radii_clips() const { return m_border_radii_clips; }
void add_border_radii_clip(BorderRadiiClip border_radii_clip)
{
for (auto& existing_clip : m_border_radii_clips) {
if (border_radii_clip.rect == existing_clip.rect) {
existing_clip.radii.union_max_radii(border_radii_clip.radii);
return;
}
}
m_border_radii_clips.append(border_radii_clip);
}
void clear_border_radii_clips() { m_border_radii_clips.clear(); }
CSSPixelRect rect() const { return m_rect; }
void set_rect(CSSPixelRect rect) { m_rect = rect; }
private:
CSSPixelRect m_rect;
Vector<BorderRadiiClip> m_border_radii_clips;
};
}