5#include "flutter/flow/layers/layer_raster_cache_item.h"
6#include "flutter/flow/layers/container_layer.h"
7#include "flutter/flow/raster_cache_item.h"
8#include "flutter/flow/raster_cache_util.h"
14 int layer_cached_threshold,
15 bool can_cache_children)
21 layer_cached_threshold_(layer_cached_threshold),
22 can_cache_children_(can_cache_children) {}
26 cache_state_ = CacheState::kNone;
36 int layer_cache_threshold,
37 bool can_cache_children) {
38 return std::make_unique<LayerRasterCacheItem>(layer, layer_cache_threshold,
55 if (num_cache_attempts_ >= layer_cached_threshold_) {
57 cache_state_ = CacheState::kCurrent;
60 num_cache_attempts_++;
62 if (can_cache_children_) {
63 if (!layer_children_id_.has_value()) {
65 if (!ids.has_value()) {
68 layer_children_id_.emplace(std::move(ids.value()),
71 cache_state_ = CacheState::kChildren;
79 switch (cache_state_) {
83 return layer_children_id_;
90 switch (cache_state_) {
91 case CacheState::kCurrent:
92 return &(layer_->paint_bounds());
93 case CacheState::kChildren:
95 return &(layer_->as_container_layer()->child_paint_bounds());
119 .ui_time = paint_context.
ui_time,
125 switch (cache_state) {
128 layer->
Paint(context);
143 bool parent_cached)
const {
144 auto maybe_id = GetId();
145 if (!maybe_id.has_value() || !context.
raster_cache || parent_cached) {
148 if (cache_state_ !=
kNone) {
149 if (
const SkRect* paint_bounds = GetPaintBoundsFromLayer()) {
155 .logical_rect = *paint_bounds,
159 auto id = maybe_id.value();
162 [ctx = context, cache_state = cache_state_,
164 Rasterize(cache_state, layer, ctx, canvas);
182 switch (cache_state_) {
190 if (!layer_children_id_.has_value()) {
Developer-facing API for rendering anything within the engine.
static std::unique_ptr< LayerRasterCacheItem > Make(Layer *, int layer_cache_threshold, bool can_cache_children=false)
Create a LayerRasterCacheItem, connect a layer and manage the Layer's raster cache.
std::optional< RasterCacheKeyID > GetId() const override
void PrerollSetup(PrerollContext *context, const SkMatrix &matrix) override
LayerRasterCacheItem(Layer *layer, int layer_cached_threshold=1, bool can_cache_children=false)
bool Draw(const PaintContext &context, const DlPaint *paint) const override
bool TryToPrepareRasterCache(const PaintContext &context, bool parent_cached=false) const override
const SkRect * GetPaintBoundsFromLayer() const
void PrerollFinalize(PrerollContext *context, const SkMatrix &matrix) override
CheckerboardFunc checkerboard_func() const
void set_checkerboard_func(CheckerboardFunc checkerboard_func)
void set_delegate(DlCanvas *canvas)
bool content_culled(const SkRect &content_bounds) const
virtual void PaintChildren(PaintContext &context) const
bool needs_painting(PaintContext &context) const
virtual void Paint(PaintContext &context) const =0
static std::optional< std::vector< RasterCacheKeyID > > LayerChildrenIds(const Layer *layer)
bool Draw(const RasterCacheKeyID &id, DlCanvas &canvas, const DlPaint *paint, bool preserve_rtree=false) const
CacheInfo MarkSeen(const RasterCacheKeyID &id, const SkMatrix &matrix, bool visible) const
The entry whose RasterCacheKey is generated by RasterCacheKeyID and matrix is marked as encountered b...
bool UpdateCacheEntry(const RasterCacheKeyID &id, const Context &raster_cache_context, const std::function< void(DlCanvas *)> &render_function, sk_sp< const DlRTree > rtree=nullptr) const
static void Draw(SkCanvas *canvas, const SkRect &rect)
#define FML_DCHECK(condition)
static const auto * flow_type
bool Rasterize(RasterCacheItem::CacheState cache_state, Layer *layer, const PaintContext &paint_context, DlCanvas *canvas)
ExternalViewEmbedder * view_embedder
bool rendering_above_platform_view
sk_sp< SkColorSpace > dst_color_space
const Stopwatch & raster_time
const Stopwatch & ui_time
std::shared_ptr< TextureRegistry > texture_registry
GrDirectContext * gr_context
LayerStateStack & state_stack
const RasterCache * raster_cache
std::vector< RasterCacheItem * > * raster_cached_entries
RasterCache * raster_cache
LayerStateStack & state_stack
GrDirectContext * gr_context