Skip to content

Commit d904cf2

Browse files
committed
Improve rendering reliability if baking fails
1 parent bd31a95 commit d904cf2

2 files changed

Lines changed: 61 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(isDialog: 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(isDialog: true),
48+
),
49+
),
50+
],
4351
),
4452
),
4553
barrierDismissible: true,

app/lib/cubits/current_index.dart

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

Comments
 (0)