5#include "flutter/display_list/utils/dl_bounds_accumulator.h"
17 saved_rects_.emplace_back(rect_);
18 rect_ = AccumulationRect();
21 if (!saved_rects_.empty()) {
22 SkRect layer_bounds = rect_.bounds();
23 pop_and_accumulate(layer_bounds,
nullptr);
30 if (!saved_rects_.empty()) {
31 SkRect layer_bounds = rect_.bounds();
32 success = mapper(layer_bounds, layer_bounds);
33 pop_and_accumulate(layer_bounds,
clip);
37void RectBoundsAccumulator::pop_and_accumulate(
SkRect& layer_bounds,
41 rect_ = saved_rects_.back();
42 saved_rects_.pop_back();
49RectBoundsAccumulator::AccumulationRect::AccumulationRect() {
50 min_x_ = std::numeric_limits<SkScalar>::infinity();
51 min_y_ = std::numeric_limits<SkScalar>::infinity();
52 max_x_ = -std::numeric_limits<SkScalar>::infinity();
53 max_y_ = -std::numeric_limits<SkScalar>::infinity();
55void RectBoundsAccumulator::AccumulationRect::accumulate(
SkScalar x,
70SkRect RectBoundsAccumulator::AccumulationRect::bounds()
const {
71 return (max_x_ >= min_x_ && max_y_ >= min_y_)
79 rect_indices_.push_back(index);
83 saved_offsets_.push_back(rects_.size());
86 if (saved_offsets_.empty()) {
90 saved_offsets_.pop_back();
93 std::function<
bool(
const SkRect& original,
SkRect& modified)> map,
95 if (saved_offsets_.empty()) {
99 size_t previous_size = saved_offsets_.back();
100 saved_offsets_.pop_back();
103 for (
size_t i = previous_size; i < rects_.size(); i++) {
104 SkRect original = rects_[i];
105 if (!map(original, original)) {
109 rect_indices_[previous_size] = rect_indices_[i];
110 rects_[previous_size] = original;
114 rects_.resize(previous_size);
115 rect_indices_.resize(previous_size);
122 for (
auto& rect : rects_) {
125 return accumulator.
bounds();
130 return sk_make_sp<DlRTree>(rects_.data(), rects_.size(), rect_indices_.data(),
131 [](
int id) { return id >= 0; });
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
SkRect bounds() const override
void accumulate(const SkRect &r, int index) override
sk_sp< DlRTree > rtree() const override
SkRect bounds() const override
void accumulate(SkScalar x, SkScalar y)
#define FML_DCHECK(condition)
SkScalar fBottom
larger y-axis bounds
bool intersect(const SkRect &r)
SkScalar fLeft
smaller x-axis bounds
SkScalar fRight
larger x-axis bounds
static constexpr SkRect MakeLTRB(float l, float t, float r, float b)
SkScalar fTop
smaller y-axis bounds