5#include "flutter/flow/diff_context.h"
6#include "flutter/flow/layers/layer.h"
13 bool has_raster_cache,
14 bool impeller_enabled)
17 frame_size_(frame_size),
18 this_frame_paint_region_map_(this_frame_paint_region_map),
19 last_frame_paint_region_map_(last_frame_paint_region_map),
20 has_raster_cache_(has_raster_cache),
21 impeller_enabled_(impeller_enabled) {}
24 state_stack_.push_back(state_);
26 bool had_integral_transform = state_.integral_transform;
27 state_.rect_index = rects_->size();
28 state_.has_filter_bounds_adjustment =
false;
29 state_.has_texture =
false;
30 state_.integral_transform =
false;
32 state_.clip_tracker_save_count = clip_tracker_.
getSaveCount();
35 if (had_integral_transform) {
36 MakeCurrentTransformIntegral();
42 if (state_.has_filter_bounds_adjustment) {
43 filter_bounds_adjustment_stack_.pop_back();
46 state_ = state_stack_.back();
47 state_stack_.pop_back();
50DiffContext::State::State() {}
60void DiffContext::MakeCurrentTransformIntegral() {
80 FML_DCHECK(state_.has_filter_bounds_adjustment ==
false);
81 state_.has_filter_bounds_adjustment =
true;
82 filter_bounds_adjustment_stack_.push_back(filter);
85SkRect DiffContext::ApplyFilterBoundsAdjustment(
SkRect rect)
const {
87 for (
auto i = filter_bounds_adjustment_stack_.rbegin();
88 i != filter_bounds_adjustment_stack_.rend(); ++i) {
94void DiffContext::AlignRect(
SkIRect& rect,
95 int horizontal_alignment,
96 int vertical_alignment)
const {
97 auto top =
rect.top();
100 auto bottom =
rect.bottom();
101 if (top % vertical_alignment != 0) {
102 top -= top % vertical_alignment;
104 if (
left % horizontal_alignment != 0) {
105 left -=
left % horizontal_alignment;
107 if (
right % horizontal_alignment != 0) {
108 right += horizontal_alignment -
right % horizontal_alignment;
110 if (bottom % vertical_alignment != 0) {
111 bottom += vertical_alignment - bottom % vertical_alignment;
114 bottom = std::min(bottom, frame_size_.
height());
119 int horizontal_clip_alignment,
120 int vertical_clip_alignment)
const {
122 buffer_damage.
join(damage_);
123 SkRect frame_damage(damage_);
125 for (
const auto& r : readbacks_) {
132 frame_damage.
join(readback_rect);
133 frame_damage.
join(paint_rect);
134 buffer_damage.
join(readback_rect);
135 buffer_damage.
join(paint_rect);
147 if (horizontal_clip_alignment > 1 || vertical_clip_alignment > 1) {
149 vertical_clip_alignment);
151 vertical_clip_alignment);
158 clip_tracker_.
mapRect(&mapped_rect);
177 if (previous_paint_region.
is_valid()) {
193 auto transformed_rect = ApplyFilterBoundsAdjustment(
MapRect(rect));
195 if (state_.integral_transform) {
196 clip_tracker_.
save();
197 MakeCurrentTransformIntegral();
198 transformed_rect = ApplyFilterBoundsAdjustment(
MapRect(rect));
201 rects_->push_back(transformed_rect);
212 for (
auto&
state : state_stack_) {
213 state.has_texture =
true;
215 state_.has_texture =
true;
222 if (region.is_valid()) {
223 rects_->insert(rects_->end(), region.begin(), region.end());
228 const SkIRect& readback_rect) {
231 readback.readback_rect = readback_rect;
239 bool has_readback = std::any_of(
240 readbacks_.begin(), readbacks_.end(),
241 [&](
const Readback& r) { return r.position >= state_.rect_index; });
242 return PaintRegion(rects_, state_.rect_index, rects_->size(), has_readback,
248 for (
const auto& r : damage) {
259 this_frame_paint_region_map_[layer->
unique_id()] = region;
263 auto i = last_frame_paint_region_map_.find(layer->
unique_id());
264 if (i != last_frame_paint_region_map_.end()) {
276 "NewPictures", new_pictures_,
"PicturesTooComplexToCompare",
277 pictures_too_complex_to_compare_,
"DeepComparePictures",
278 deep_compare_pictures_,
"SameInstancePictures",
279 same_instance_pictures_,
280 "DifferentInstanceButEqualPictures",
281 different_instance_but_equal_pictures_);
static void readback(const SkBitmap &src, int *result, int resultCount)
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
static bool left(const SkPoint &p0, const SkPoint &p1)
static bool right(const SkPoint &p0, const SkPoint &p1)
SkMatrix GetTransform3x3() const
void PushTransform(const SkMatrix &transform)
void AddLayerBounds(const SkRect &rect)
void SetLayerPaintRegion(const Layer *layer, const PaintRegion ®ion)
void MarkSubtreeDirty(const PaintRegion &previous_paint_region=PaintRegion())
void AddDamage(const PaintRegion &damage)
PaintRegion CurrentSubtreeRegion() const
void AddExistingPaintRegion(const PaintRegion ®ion)
void PushFilterBoundsAdjustment(const FilterBoundsAdjustment &filter)
PaintRegion GetOldLayerPaintRegion(const Layer *layer) const
SkRect MapRect(const SkRect &rect)
bool PushCullRect(const SkRect &clip)
Damage ComputeDamage(const SkIRect &additional_damage, int horizontal_clip_alignment=0, int vertical_clip_alignment=0) const
void MarkSubtreeHasTextureLayer()
bool IsSubtreeDirty() const
void AddReadbackRegion(const SkIRect &paint_rect, const SkIRect &readback_rect)
std::function< SkRect(SkRect)> FilterBoundsAdjustment
DiffContext(SkISize frame_size, PaintRegionMap &this_frame_paint_region_map, const PaintRegionMap &last_frame_paint_region_map, bool has_raster_cache, bool impeller_enabled)
SkRect GetCullRect() const
void clipRect(const DlRect &rect, ClipOp op, bool is_aa)
bool using_4x4_matrix() const
SkRect local_cull_rect() const
SkRect device_cull_rect() const
void transform(const DlMatrix &matrix)
void setTransform(const DlMatrix &matrix)
void restoreToCount(int restore_count)
SkMatrix matrix_3x3() const
bool mapRect(DlRect *rect) const
uint64_t unique_id() const
#define FML_DCHECK(condition)
sk_sp< SkBlender > blender SkRect rect
std::map< uint64_t, PaintRegion > PaintRegionMap
static constexpr SkRect kGiantRect
static SkColor4f transform(SkColor4f c, SkColorSpace *src, SkColorSpace *dst)
bool intersect(const SkIRect &r)
static constexpr SkIRect MakeLTRB(int32_t l, int32_t t, int32_t r, int32_t b)
static constexpr SkIRect MakeSize(const SkISize &size)
constexpr int32_t width() const
constexpr int32_t height() const
static SkRect Make(const SkISize &size)
static constexpr SkRect MakeEmpty()
bool intersects(const SkRect &r) const
void roundOut(SkIRect *dst) const
void join(const SkRect &r)
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|.
#define FML_TRACE_COUNTER(category_group, name, counter_id, arg1,...)