@@ -86,7 +86,7 @@ static bool IsPictureWorthRasterizing(SkPicture* picture,
8686}
8787
8888// / @note Procedure doesn't copy all closures.
89- static RasterCacheResult Rasterize (
89+ static std::unique_ptr< RasterCacheResult> Rasterize (
9090 GrContext* context,
9191 const SkMatrix& ctm,
9292 SkColorSpace* dst_color_space,
@@ -105,7 +105,7 @@ static RasterCacheResult Rasterize(
105105 : SkSurface::MakeRaster (image_info);
106106
107107 if (!surface) {
108- return {} ;
108+ return nullptr ;
109109 }
110110
111111 SkCanvas* canvas = surface->getCanvas ();
@@ -118,14 +118,16 @@ static RasterCacheResult Rasterize(
118118 DrawCheckerboard (canvas, logical_rect);
119119 }
120120
121- return {surface->makeImageSnapshot (), logical_rect};
121+ return std::make_unique<RasterCacheResult>(surface->makeImageSnapshot (),
122+ logical_rect);
122123}
123124
124- RasterCacheResult RasterizePicture (SkPicture* picture,
125- GrContext* context,
126- const SkMatrix& ctm,
127- SkColorSpace* dst_color_space,
128- bool checkerboard) {
125+ std::unique_ptr<RasterCacheResult> RasterCache::RasterizePicture (
126+ SkPicture* picture,
127+ GrContext* context,
128+ const SkMatrix& ctm,
129+ SkColorSpace* dst_color_space,
130+ bool checkerboard) const {
129131 return Rasterize (context, ctm, dst_color_space, checkerboard,
130132 picture->cullRect (),
131133 [=](SkCanvas* canvas) { canvas->drawPicture (picture); });
@@ -138,34 +140,41 @@ void RasterCache::Prepare(PrerollContext* context,
138140 Entry& entry = layer_cache_[cache_key];
139141 entry.access_count ++;
140142 entry.used_this_frame = true ;
141- if (!entry.image .is_valid ()) {
142- entry.image = Rasterize (
143- context->gr_context , ctm, context->dst_color_space ,
144- checkerboard_images_, layer->paint_bounds (),
145- [layer, context](SkCanvas* canvas) {
146- SkISize canvas_size = canvas->getBaseLayerSize ();
147- SkNWayCanvas internal_nodes_canvas (canvas_size.width (),
148- canvas_size.height ());
149- internal_nodes_canvas.addCanvas (canvas);
150- Layer::PaintContext paintContext = {
151- (SkCanvas*)&internal_nodes_canvas,
152- canvas,
153- context->gr_context ,
154- nullptr ,
155- context->raster_time ,
156- context->ui_time ,
157- context->texture_registry ,
158- context->has_platform_view ? nullptr : context->raster_cache ,
159- context->checkerboard_offscreen_layers ,
160- context->frame_physical_depth ,
161- context->frame_device_pixel_ratio };
162- if (layer->needs_painting ()) {
163- layer->Paint (paintContext);
164- }
165- });
143+ if (!entry.image ) {
144+ entry.image = RasterizeLayer (context, layer, ctm, checkerboard_images_);
166145 }
167146}
168147
148+ std::unique_ptr<RasterCacheResult> RasterCache::RasterizeLayer (
149+ PrerollContext* context,
150+ Layer* layer,
151+ const SkMatrix& ctm,
152+ bool checkerboard) const {
153+ return Rasterize (
154+ context->gr_context , ctm, context->dst_color_space , checkerboard,
155+ layer->paint_bounds (), [layer, context](SkCanvas* canvas) {
156+ SkISize canvas_size = canvas->getBaseLayerSize ();
157+ SkNWayCanvas internal_nodes_canvas (canvas_size.width (),
158+ canvas_size.height ());
159+ internal_nodes_canvas.addCanvas (canvas);
160+ Layer::PaintContext paintContext = {
161+ (SkCanvas*)&internal_nodes_canvas, // internal_nodes_canvas
162+ canvas, // leaf_nodes_canvas
163+ context->gr_context , // gr_context
164+ nullptr , // view_embedder
165+ context->raster_time ,
166+ context->ui_time ,
167+ context->texture_registry ,
168+ context->has_platform_view ? nullptr : context->raster_cache ,
169+ context->checkerboard_offscreen_layers ,
170+ context->frame_physical_depth ,
171+ context->frame_device_pixel_ratio };
172+ if (layer->needs_painting ()) {
173+ layer->Paint (paintContext);
174+ }
175+ });
176+ }
177+
169178bool RasterCache::Prepare (GrContext* context,
170179 SkPicture* picture,
171180 const SkMatrix& transformation_matrix,
@@ -202,7 +211,7 @@ bool RasterCache::Prepare(GrContext* context,
202211 return false ;
203212 }
204213
205- if (!entry.image . is_valid () ) {
214+ if (!entry.image ) {
206215 entry.image = RasterizePicture (picture, context, transformation_matrix,
207216 dst_color_space, checkerboard_images_);
208217 picture_cached_this_frame_++;
@@ -221,8 +230,8 @@ bool RasterCache::Draw(const SkPicture& picture, SkCanvas& canvas) const {
221230 entry.access_count ++;
222231 entry.used_this_frame = true ;
223232
224- if (entry.image . is_valid () ) {
225- entry.image . draw (canvas);
233+ if (entry.image ) {
234+ entry.image -> draw (canvas);
226235 return true ;
227236 }
228237
@@ -242,8 +251,8 @@ bool RasterCache::Draw(const Layer* layer,
242251 entry.access_count ++;
243252 entry.used_this_frame = true ;
244253
245- if (entry.image . is_valid () ) {
246- entry.image . draw (canvas, paint);
254+ if (entry.image ) {
255+ entry.image -> draw (canvas, paint);
247256 return true ;
248257 }
249258
@@ -266,6 +275,14 @@ size_t RasterCache::GetCachedEntriesCount() const {
266275 return layer_cache_.size () + picture_cache_.size ();
267276}
268277
278+ size_t RasterCache::GetLayerCachedEntriesCount () const {
279+ return layer_cache_.size ();
280+ }
281+
282+ size_t RasterCache::GetPictureCachedEntriesCount () const {
283+ return picture_cache_.size ();
284+ }
285+
269286void RasterCache::SetCheckboardCacheImages (bool checkerboard) {
270287 if (checkerboard_images_ == checkerboard) {
271288 return ;
@@ -287,15 +304,17 @@ void RasterCache::TraceStatsToTimeline() const {
287304 size_t picture_cache_bytes = 0 ;
288305
289306 for (const auto & item : layer_cache_) {
290- const auto dimensions = item.second .image .image_dimensions ();
291307 layer_cache_count++;
292- layer_cache_bytes += dimensions.width () * dimensions.height () * 4 ;
308+ if (item.second .image ) {
309+ layer_cache_bytes += item.second .image ->image_bytes ();
310+ }
293311 }
294312
295313 for (const auto & item : picture_cache_) {
296- const auto dimensions = item.second .image .image_dimensions ();
297314 picture_cache_count++;
298- picture_cache_bytes += dimensions.width () * dimensions.height () * 4 ;
315+ if (item.second .image ) {
316+ picture_cache_bytes += item.second .image ->image_bytes ();
317+ }
299318 }
300319
301320 FML_TRACE_COUNTER (" flutter" , " RasterCache" ,
0 commit comments