@@ -1253,6 +1253,7 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
12531253 final _delayedBakeRunner = CoalescedAsyncRunner (
12541254 delay: const Duration (milliseconds: 100 ),
12551255 );
1256+ bool _useDirectRendering = false ;
12561257
12571258 bool _rectContains (Rect outer, Rect inner) {
12581259 const tolerance = precisionErrorTolerance;
@@ -1284,8 +1285,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
12841285 }
12851286 var transform = state.transformCubit.state;
12861287 var renderers = List <Renderer <PadElement >>.from (this .renderers);
1287- final recorder = ui.PictureRecorder ();
1288- final canvas = ui.Canvas (recorder);
12891288 final rect = getViewportRect (viewportSize: size);
12901289 size = rect.size * transform.size;
12911290 final renderTransform = transform.improve (resolution, rect);
@@ -1357,8 +1356,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
13571356 targetSize: size,
13581357 );
13591358
1360- canvas.scale (ratio);
1361-
13621359 if (viewChanged && visibleElements.isNotEmpty) {
13631360 await Future .wait (
13641361 visibleElements.map (
@@ -1371,6 +1368,41 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
13711368 // Wait one frame
13721369 await Future .delayed (const Duration (milliseconds: 1 ));
13731370
1371+ void useDirectRendering () {
1372+ if (isClosed ||
1373+ ! identical (state.cameraViewport, startViewport) ||
1374+ state.transformCubit.state != startTransform) {
1375+ return ;
1376+ }
1377+ emit (
1378+ state.copyWith (
1379+ cameraViewport: CameraViewport .unbaked (
1380+ backgrounds: cameraViewport.backgrounds,
1381+ unbakedElements: renderers,
1382+ visibleElements: visibleElements,
1383+ visibleUnbakedElements: visibleElements,
1384+ width: size.width,
1385+ height: size.height,
1386+ pixelRatio: ratio,
1387+ resolution: resolution,
1388+ scale: transform.size,
1389+ x: renderTransform.position.dx,
1390+ y: renderTransform.position.dy,
1391+ rendererStates: allRendererStates,
1392+ invisibleLayers: invisibleLayers,
1393+ ),
1394+ ),
1395+ );
1396+ }
1397+
1398+ if (_useDirectRendering) {
1399+ useDirectRendering ();
1400+ return ;
1401+ }
1402+
1403+ final recorder = ui.PictureRecorder ();
1404+ final canvas = ui.Canvas (recorder)..scale (ratio);
1405+
13741406 ViewPainter (
13751407 document,
13761408 page,
@@ -1395,6 +1427,15 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
13951427 ui.Image newImage;
13961428 try {
13971429 newImage = await picture.toImage (imageWidth, imageHeight);
1430+ } catch (error, stackTrace) {
1431+ _useDirectRendering = true ;
1432+ talker.warning (
1433+ 'Viewport image baking failed; using direct rendering' ,
1434+ error,
1435+ stackTrace,
1436+ );
1437+ useDirectRendering ();
1438+ return ;
13981439 } finally {
13991440 picture.dispose ();
14001441 }
0 commit comments