5#ifndef FLUTTER_FLOW_LAYERS_LAYER_STATE_STACK_H_
6#define FLUTTER_FLOW_LAYERS_LAYER_STATE_STACK_H_
8#include "flutter/display_list/dl_canvas.h"
9#include "flutter/flow/embedded_views.h"
10#include "flutter/flow/paint_utils.h"
144 layer_state_stack_->restore_to_count(stack_restore_count_);
149 : layer_state_stack_(stack),
150 stack_restore_count_(stack->stack_count()) {
151 if (stack->needs_save_layer(
flags)) {
152 stack->save_layer(bounds);
158 const size_t stack_restore_count_;
166 layer_state_stack_->restore_to_count(stack_restore_count_);
187 const std::shared_ptr<const DlImageFilter>& filter);
195 const std::shared_ptr<const DlColorFilter>& filter);
206 const std::shared_ptr<const DlImageFilter>& filter,
221 : layer_state_stack_(stack),
222 stack_restore_count_(stack->stack_count()) {}
226 const size_t stack_restore_count_;
227 bool save_needed_ =
true;
251 int can_apply_flags) {
258 return outstanding_.color_filter;
262 return outstanding_.image_filter;
313 return delegate_->content_culled(content_bounds);
324 bool is_empty()
const {
return state_stack_.empty(); }
327 size_t stack_count()
const {
return state_stack_.size(); }
328 void restore_to_count(
size_t restore_count);
331 void apply_last_entry() { state_stack_.back()->apply(
this); }
338 void push_color_filter(
const SkRect& bounds,
339 const std::shared_ptr<const DlColorFilter>& filter);
340 void push_image_filter(
const SkRect& bounds,
341 const std::shared_ptr<const DlImageFilter>& filter);
342 void push_backdrop(
const SkRect& bounds,
343 const std::shared_ptr<const DlImageFilter>& filter,
347 void push_transform(
const SkM44& matrix);
348 void push_transform(
const SkMatrix& matrix);
349 void push_integral_transform();
351 void push_clip_rect(
const SkRect& rect,
bool is_aa);
352 void push_clip_rrect(
const SkRRect& rrect,
bool is_aa);
353 void push_clip_path(
const SkPath&
path,
bool is_aa);
362 bool needs_save_layer(
int flags)
const;
364 void save_layer(
const SkRect& bounds);
365 void maybe_save_layer_for_transform(
bool needs_save);
366 void maybe_save_layer_for_clip(
bool needs_save);
368 void maybe_save_layer(
SkScalar opacity);
369 void maybe_save_layer(
const std::shared_ptr<const DlColorFilter>& filter);
370 void maybe_save_layer(
const std::shared_ptr<const DlImageFilter>& filter);
373 struct RenderingAttributes {
383 SkRect save_layer_bounds{0, 0, 0, 0};
386 std::shared_ptr<const DlColorFilter> color_filter;
387 std::shared_ptr<const DlImageFilter> image_filter;
389 DlPaint* fill(DlPaint&
paint,
392 bool operator==(
const RenderingAttributes& other)
const {
393 return save_layer_bounds == other.save_layer_bounds &&
394 opacity == other.opacity &&
395 Equals(color_filter, other.color_filter) &&
396 Equals(image_filter, other.image_filter);
402 virtual ~StateEntry() =
default;
407 virtual void update_mutators(MutatorsStack* mutators_stack)
const {}
410 StateEntry() =
default;
434 virtual ~Delegate() =
default;
443 virtual void decommission() = 0;
445 virtual DlCanvas* canvas()
const {
return nullptr; }
447 virtual SkRect local_cull_rect()
const = 0;
448 virtual SkRect device_cull_rect()
const = 0;
449 virtual SkM44 matrix_4x4()
const = 0;
450 virtual SkMatrix matrix_3x3()
const = 0;
451 virtual bool content_culled(
const SkRect& content_bounds)
const = 0;
453 virtual void save() = 0;
454 virtual void saveLayer(
const SkRect& bounds,
455 RenderingAttributes& attributes,
458 virtual void restore() = 0;
461 virtual void transform(
const SkM44& m44) = 0;
462 virtual void transform(
const SkMatrix& matrix) = 0;
463 virtual void integralTransform() = 0;
465 virtual void clipRect(
const SkRect& rect, ClipOp op,
bool is_aa) = 0;
466 virtual void clipRRect(
const SkRRect& rrect, ClipOp op,
bool is_aa) = 0;
467 virtual void clipPath(
const SkPath&
path, ClipOp op,
bool is_aa) = 0;
473 std::vector<std::unique_ptr<StateEntry>> state_stack_;
477 RenderingAttributes outstanding_;
static void apply_flags(SkFont *font, unsigned flags)
Developer-facing API for rendering anything within the engine.
void applyColorFilter(const SkRect &bounds, const std::shared_ptr< const DlColorFilter > &filter)
void translate(SkScalar tx, SkScalar ty)
void applyImageFilter(const SkRect &bounds, const std::shared_ptr< const DlImageFilter > &filter)
void clipPath(const SkPath &path, bool is_aa)
void applyBackdropFilter(const SkRect &bounds, const std::shared_ptr< const DlImageFilter > &filter, DlBlendMode blend_mode)
void clipRRect(const SkRRect &rrect, bool is_aa)
void clipRect(const SkRect &rect, bool is_aa)
void applyOpacity(const SkRect &bounds, SkScalar opacity)
void saveLayer(const SkRect &bounds)
void transform(const SkM44 &m44)
void translate(SkPoint tp)
std::shared_ptr< const DlImageFilter > outstanding_image_filter() const
SkRect outstanding_bounds() const
SkMatrix transform_3x3() const
void fill(MutatorsStack *mutators)
DlCanvas * canvas_delegate()
AutoRestore applyState(const SkRect &bounds, int can_apply_flags)
DlPaint * fill(DlPaint &paint) const
CheckerboardFunc checkerboard_func() const
void set_preroll_delegate(const SkRect &cull_rect, const SkMatrix &matrix)
bool painting_is_nop() const
SkM44 transform_4x4() const
SkScalar outstanding_opacity() const
SkRect device_cull_rect() const
static constexpr int kCallerCanApplyAnything
static constexpr int kCallerCanApplyColorFilter
SkRect local_cull_rect() const
void set_checkerboard_func(CheckerboardFunc checkerboard_func)
void set_delegate(DlCanvas *canvas)
bool content_culled(const SkRect &content_bounds) const
std::shared_ptr< const DlColorFilter > outstanding_color_filter() const
static constexpr int kCallerCanApplyImageFilter
static constexpr int kCallerCanApplyOpacity
FlutterSemanticsFlag flags
#define FML_DISALLOW_COPY_ASSIGN_AND_MOVE(TypeName)
static SkColor blend(SkColor dst, SkColor src, void(*mode)(float, float, float, float *, float *, float *))
bool Equals(const T *a, const T *b)
void(* CheckerboardFunc)(DlCanvas *, const SkRect &)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
@ kSrcOver
r = s + (1-sa)*d
bool operator==(C p1, const scoped_nsprotocol< C > &p2)