Skip to content

Commit 1c8a856

Browse files
committed
Improve rendering reliability if baking fails
1 parent 7e44d1c commit 1c8a856

3 files changed

Lines changed: 64 additions & 12 deletions

File tree

app/lib/actions/settings.dart

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,23 @@ class SettingsAction extends Action<SettingsIntent> {
3131
Future<void> openSettings(BuildContext context) => showGeneralDialog<void>(
3232
context: context,
3333
pageBuilder: (context, animation, secondaryAnimation) => ScaffoldMessenger(
34-
child: BackdropFilter(
35-
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
36-
child: Dialog(
37-
clipBehavior: Clip.antiAlias,
38-
child: ConstrainedBox(
39-
constraints: const BoxConstraints(maxHeight: 800, maxWidth: 1000),
40-
child: const SettingsPage(inView: true),
34+
child: Stack(
35+
alignment: Alignment.center,
36+
children: [
37+
Positioned.fill(
38+
child: BackdropFilter(
39+
filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5),
40+
child: const SizedBox.expand(),
41+
),
4142
),
42-
),
43+
Dialog(
44+
clipBehavior: Clip.antiAlias,
45+
child: ConstrainedBox(
46+
constraints: const BoxConstraints(maxHeight: 800, maxWidth: 1000),
47+
child: const SettingsPage(inView: true),
48+
),
49+
),
50+
],
4351
),
4452
),
4553
barrierDismissible: true,

app/lib/cubits/editor_renderer.dart

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

metadata/en-US/changelogs/189.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* Remove unused view options
1313
* Improve negative scaling
1414
* Improve rotated elements transformtion ([#1099](https://github.com/LinwoodDev/Butterfly/issues/1099))
15+
* Improve rendering reliability if baking fails
1516
* Fix crash with android saf on folders with many files
1617
* Fix blur resetting on color change
1718
* Fix polygon collision aabb tests if closed ([#1162](https://github.com/LinwoodDev/Butterfly/pull/1162))

0 commit comments

Comments
 (0)