@@ -103,6 +103,7 @@ class RendererCubit extends Cubit<RendererRuntimeState> {
103103 _RendererSpatialIndex ? _spatialIndex;
104104 List <Renderer <PadElement >>? _indexedRenderers;
105105 Set <Renderer <PadElement >>? _indexedUnbaked;
106+ bool _useDirectRendering = false ;
106107
107108 void bindController (EditorController controller) {
108109 _controller = controller;
@@ -455,8 +456,6 @@ class RendererCubit extends Cubit<RendererRuntimeState> {
455456 size /= resolution.multiplier;
456457 }
457458 var transform = transformCubit.state;
458- final recorder = ui.PictureRecorder ();
459- final canvas = ui.Canvas (recorder);
460459 final rect = rendererCubit.getViewportRect (
461460 transformCubit,
462461 viewportSize: size,
@@ -529,8 +528,6 @@ class RendererCubit extends Cubit<RendererRuntimeState> {
529528 targetSize: size,
530529 );
531530
532- canvas.scale (ratio);
533-
534531 if (viewChanged && visibleElements.isNotEmpty) {
535532 await Future .wait (
536533 visibleElements.map (
@@ -543,6 +540,43 @@ class RendererCubit extends Cubit<RendererRuntimeState> {
543540 // Wait one frame
544541 await Future .delayed (const Duration (milliseconds: 1 ));
545542
543+ void useDirectRendering () {
544+ if (controller.isClosed ||
545+ ! identical (rendererCubit.state.cameraViewport, startViewport) ||
546+ transformCubit.state != startTransform) {
547+ return ;
548+ }
549+ rendererCubit._invalidateSpatialIndex ();
550+ rendererCubit.setViewport (
551+ cameraViewport
552+ .unbake (
553+ unbakedElements: renderers,
554+ visibleElements: visibleElements,
555+ visibleUnbakedElements: visibleElements,
556+ rendererStates: allRendererStates,
557+ )
558+ .copyWith (
559+ width: size.width,
560+ height: size.height,
561+ viewportSize: measuredViewportSize,
562+ pixelRatio: ratio,
563+ resolution: resolution,
564+ scale: transform.size,
565+ x: renderTransform.position.dx,
566+ y: renderTransform.position.dy,
567+ invisibleLayers: invisibleLayers,
568+ ),
569+ );
570+ }
571+
572+ if (_useDirectRendering) {
573+ useDirectRendering ();
574+ return ;
575+ }
576+
577+ final recorder = ui.PictureRecorder ();
578+ final canvas = ui.Canvas (recorder)..scale (ratio);
579+
546580 ViewPainter (
547581 document,
548582 page,
@@ -567,6 +601,15 @@ class RendererCubit extends Cubit<RendererRuntimeState> {
567601 ui.Image newImage;
568602 try {
569603 newImage = await picture.toImage (imageWidth, imageHeight);
604+ } catch (error, stackTrace) {
605+ _useDirectRendering = true ;
606+ talker.warning (
607+ 'Viewport image baking failed; using direct rendering' ,
608+ error,
609+ stackTrace,
610+ );
611+ useDirectRendering ();
612+ return ;
570613 } finally {
571614 picture.dispose ();
572615 }
0 commit comments