15 bool has_raster_cache,
16 bool impeller_enabled)
18 frame_size_(frame_size),
19 this_frame_paint_region_map_(this_frame_paint_region_map),
20 last_frame_paint_region_map_(last_frame_paint_region_map),
21 has_raster_cache_(has_raster_cache),
22 impeller_enabled_(impeller_enabled) {}
25 state_stack_.push_back(state_);
27 bool had_integral_transform = state_.integral_transform;
28 state_.rect_index = rects_->size();
29 state_.has_filter_bounds_adjustment =
false;
30 state_.has_texture =
false;
31 state_.integral_transform =
false;
33 if (had_integral_transform) {
34 MakeTransformIntegral(state_.matrix_clip);
40 if (state_.has_filter_bounds_adjustment) {
41 filter_bounds_adjustment_stack_.pop_back();
43 state_ = state_stack_.back();
44 state_stack_.pop_back();
53void DiffContext::MakeTransformIntegral(
66 FML_DCHECK(state_.has_filter_bounds_adjustment ==
false);
67 state_.has_filter_bounds_adjustment =
true;
68 filter_bounds_adjustment_stack_.push_back(filter);
71DlRect DiffContext::ApplyFilterBoundsAdjustment(
DlRect rect)
const {
73 for (
auto i = filter_bounds_adjustment_stack_.rbegin();
74 i != filter_bounds_adjustment_stack_.rend(); ++
i) {
80void DiffContext::AlignRect(
DlIRect& rect,
81 int horizontal_alignment,
82 int vertical_alignment)
const {
84 auto left = rect.GetLeft();
85 auto right = rect.GetRight();
86 auto bottom = rect.GetBottom();
87 if (top % vertical_alignment != 0) {
88 top -= top % vertical_alignment;
90 if (left % horizontal_alignment != 0) {
93 if (right % horizontal_alignment != 0) {
94 right += horizontal_alignment -
right % horizontal_alignment;
96 if (bottom % vertical_alignment != 0) {
97 bottom += vertical_alignment - bottom % vertical_alignment;
100 bottom = std::min(bottom, frame_size_.
height);
105 int horizontal_clip_alignment,
106 int vertical_clip_alignment)
const {
108 DlRect frame_damage(damage_);
110 for (
const auto& r : readbacks_) {
117 frame_damage = frame_damage.
Union(readback_rect).
Union(paint_rect);
118 buffer_damage = buffer_damage.
Union(readback_rect).
Union(paint_rect);
130 if (horizontal_clip_alignment > 1 || vertical_clip_alignment > 1) {
132 vertical_clip_alignment);
134 vertical_clip_alignment);
141 state_.matrix_clip.mapRect(&mapped_rect);
147 return !state_.matrix_clip.is_cull_rect_empty();
151 return state_.matrix_clip.matrix();
155 return state_.matrix_clip.GetLocalCullCoverage();
160 if (previous_paint_region.
is_valid()) {
176 auto transformed_rect = ApplyFilterBoundsAdjustment(
MapRect(rect));
177 if (transformed_rect.IntersectsWithRect(
178 state_.matrix_clip.GetDeviceCullCoverage())) {
179 if (state_.integral_transform) {
181 MakeTransformIntegral(temp_state);
182 temp_state.
mapRect(rect, &transformed_rect);
183 transformed_rect = ApplyFilterBoundsAdjustment(transformed_rect);
185 rects_->push_back(transformed_rect);
196 for (
auto& state : state_stack_) {
197 state.has_texture =
true;
199 state_.has_texture =
true;
207 rects_->insert(rects_->end(), region.
begin(), region.
end());
212 const DlIRect& readback_rect) {
214 readback.paint_rect = paint_rect;
215 readback.readback_rect = readback_rect;
216 readback.position = rects_->size();
218 rects_->push_back(
DlRect());
219 readbacks_.push_back(readback);
223 bool has_readback = std::any_of(
224 readbacks_.begin(), readbacks_.end(),
225 [&](
const Readback& r) { return r.position >= state_.rect_index; });
226 return PaintRegion(rects_, state_.rect_index, rects_->size(), has_readback,
232 for (
const auto& r : damage) {
233 damage_ = damage_.
Union(r);
238 damage_ = damage_.
Union(rect);
243 this_frame_paint_region_map_[layer->
unique_id()] = region;
247 auto i = last_frame_paint_region_map_.find(layer->
unique_id());
248 if (
i != last_frame_paint_region_map_.end()) {
260 "NewPictures", new_pictures_,
"PicturesTooComplexToCompare",
261 pictures_too_complex_to_compare_,
"DeepComparePictures",
262 deep_compare_pictures_,
"SameInstancePictures",
263 same_instance_pictures_,
264 "DifferentInstanceButEqualPictures",
265 different_instance_but_equal_pictures_);
DlRect GetCullRect() const
std::function< DlRect(DlRect)> FilterBoundsAdjustment
DiffContext(DlISize frame_size, PaintRegionMap &this_frame_paint_region_map, const PaintRegionMap &last_frame_paint_region_map, bool has_raster_cache, bool impeller_enabled)
bool PushCullRect(const DlRect &clip)
DlRect MapRect(const DlRect &rect)
Damage ComputeDamage(const DlIRect &additional_damage, int horizontal_clip_alignment=0, int vertical_clip_alignment=0) const
void SetLayerPaintRegion(const Layer *layer, const PaintRegion ®ion)
void MarkSubtreeDirty(const PaintRegion &previous_paint_region=PaintRegion())
void AddReadbackRegion(const DlIRect &paint_rect, const DlIRect &readback_rect)
void AddDamage(const PaintRegion &damage)
PaintRegion CurrentSubtreeRegion() const
void AddExistingPaintRegion(const PaintRegion ®ion)
void PushFilterBoundsAdjustment(const FilterBoundsAdjustment &filter)
PaintRegion GetOldLayerPaintRegion(const Layer *layer) const
void MarkSubtreeHasTextureLayer()
const DlMatrix & GetMatrix() const
bool IsSubtreeDirty() const
void AddLayerBounds(const DlRect &rect)
void PushTransform(const DlMatrix &transform)
bool mapRect(DlRect *rect) const
const DlMatrix & matrix() const
void setTransform(const DlMatrix &matrix)
uint64_t unique_id() const
std::vector< DlRect >::const_iterator end() const
std::vector< DlRect >::const_iterator begin() const
#define FML_DCHECK(condition)
std::map< uint64_t, PaintRegion > PaintRegionMap
impeller::IRect32 DlIRect
static constexpr DlRect kGiantRect
static bool ComputeIntegralTransCTM(const SkMatrix &in, SkMatrix *out)
Snap the translation components of the |in| matrix to integers and store the snapped matrix in |out|.
A 4x4 matrix using column-major storage.
constexpr auto GetTop() const
constexpr TRect Union(const TRect &o) const
static constexpr std::enable_if_t< std::is_floating_point_v< FT >, TRect > Make(const TRect< U > &rect)
constexpr bool IntersectsWithRect(const TRect &o) const
RoundOut(const TRect< U > &r)
static constexpr TRect MakeSize(const TSize< U > &size)
constexpr TRect IntersectionOrEmpty(const TRect &o) const
static constexpr TRect MakeLTRB(Type left, Type top, Type right, Type bottom)
#define FML_TRACE_COUNTER(category_group, name, counter_id, arg1,...)