@@ -839,6 +839,40 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
839
839
Renderer ? getRenderer (PadElement element) =>
840
840
renderers.firstWhereOrNull ((renderer) => renderer.element == element);
841
841
842
+ Rect getViewportRect ({Size ? viewportSize}) {
843
+ var size = viewportSize ?? state.cameraViewport.toSize ();
844
+
845
+ var transform = state.transformCubit.state;
846
+ final resolution = state.settingsCubit.state.renderResolution;
847
+
848
+ final friction = transform.friction;
849
+ final realWidth = size.width / transform.size;
850
+ final realHeight = size.height / transform.size;
851
+ var rect = Rect .fromLTWH (
852
+ transform.position.dx,
853
+ transform.position.dy,
854
+ realWidth / resolution.multiplier,
855
+ realHeight / resolution.multiplier,
856
+ );
857
+ if (friction != null ) {
858
+ final topLeft = Offset (
859
+ min (transform.position.dx, friction.beginPosition.dx),
860
+ min (transform.position.dy, friction.beginPosition.dy),
861
+ );
862
+ final bottomRight = Offset (
863
+ max (transform.position.dx, friction.beginPosition.dx),
864
+ max (transform.position.dy, friction.beginPosition.dy),
865
+ ).translate (size.width, size.height);
866
+ transform = transform.withPosition (topLeft);
867
+ rect = Rect .fromPoints (topLeft, bottomRight);
868
+ size =
869
+ Size (bottomRight.dx - topLeft.dx, bottomRight.dy - topLeft.dy) *
870
+ transform.size;
871
+ }
872
+ rect = resolution.getRect (rect);
873
+ return rect;
874
+ }
875
+
842
876
bool _isBaking = false ;
843
877
Function ? _queuedBake;
844
878
Completer <void >? _bakeCompleter;
@@ -879,37 +913,13 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
879
913
size *= resolution.multiplier;
880
914
}
881
915
var transform = state.transformCubit.state;
882
- final realWidth = size.width / transform.size;
883
- final realHeight = size.height / transform.size;
884
- var rect = Rect .fromLTWH (
885
- transform.position.dx,
886
- transform.position.dy,
887
- realWidth / resolution.multiplier,
888
- realHeight / resolution.multiplier,
889
- );
890
916
var renderers = List <Renderer <PadElement >>.from (
891
917
cameraViewport.unbakedElements,
892
918
);
893
919
final recorder = ui.PictureRecorder ();
894
920
final canvas = ui.Canvas (recorder);
895
- final friction = transform.friction;
896
- if (friction != null ) {
897
- final topLeft = Offset (
898
- min (transform.position.dx, friction.beginPosition.dx),
899
- min (transform.position.dy, friction.beginPosition.dy),
900
- );
901
- final bottomRight = Offset (
902
- max (transform.position.dx, friction.beginPosition.dx),
903
- max (transform.position.dy, friction.beginPosition.dy),
904
- ).translate (size.width, size.height);
905
- transform = transform.withPosition (topLeft);
906
- rect = Rect .fromPoints (topLeft, bottomRight);
907
- size =
908
- Size (bottomRight.dx - topLeft.dx, bottomRight.dy - topLeft.dy) *
909
- transform.size;
910
- }
911
- final renderTransform = transform.improve (resolution, rect.size);
912
- rect = resolution.getRect (rect);
921
+ final rect = getViewportRect (viewportSize: size);
922
+ final renderTransform = transform.improve (resolution, rect);
913
923
final document = blocState.data;
914
924
final page = blocState.page;
915
925
final info = blocState.info;
@@ -932,7 +942,7 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
932
942
if (reset) {
933
943
renderers = List <Renderer <PadElement >>.from (this .renderers);
934
944
visibleElements = renderers
935
- .where ((renderer) => renderer.expandedRect ? . overlaps (rect) ?? true )
945
+ .where ((renderer) => renderer.isVisible (rect))
936
946
.toList ();
937
947
} else {
938
948
visibleElements = List .from (oldVisible)..addAll (renderers);
@@ -1170,6 +1180,9 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
1170
1180
}) async {
1171
1181
final newViewport = state.cameraViewport.unbake (
1172
1182
unbakedElements: unbakedElements,
1183
+ visibleElements: unbakedElements
1184
+ ? .where ((e) => e.isVisible (getViewportRect ()))
1185
+ .toList (),
1173
1186
backgrounds: backgrounds,
1174
1187
);
1175
1188
await _updateOnVisible (newViewport, blocState);
@@ -1242,11 +1255,19 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
1242
1255
);
1243
1256
}
1244
1257
1245
- Future <void > withUnbaked (
1258
+ Future <void > addUnbaked (
1246
1259
DocumentLoaded blocState,
1247
- List <Renderer <PadElement >> unbakedElements,
1248
- ) async {
1249
- final newViewport = state.cameraViewport.withUnbaked (unbakedElements);
1260
+ List <Renderer <PadElement >> unbakedElements, [
1261
+ List <Renderer <PadElement >>? visibleElements,
1262
+ ]) async {
1263
+ final rect = getViewportRect ();
1264
+ visibleElements ?? = unbakedElements
1265
+ .where ((e) => e.isVisible (rect))
1266
+ .toList ();
1267
+ final newViewport = state.cameraViewport.withUnbaked (
1268
+ [...state.cameraViewport.unbakedElements, ...unbakedElements],
1269
+ [...state.cameraViewport.visibleElements, ...visibleElements],
1270
+ );
1250
1271
await _updateOnVisible (newViewport, blocState);
1251
1272
emit (state.copyWith (cameraViewport: newViewport));
1252
1273
}
@@ -1547,9 +1568,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
1547
1568
bool updateIndex = false ,
1548
1569
}) async {
1549
1570
final cameraViewport = current.cameraViewport;
1550
- final elements = List <Renderer <PadElement >>.from (
1551
- cameraViewport.unbakedElements,
1552
- );
1553
1571
for (var renderer in {
1554
1572
...? backgrounds,
1555
1573
...? replacedElements,
@@ -1562,7 +1580,6 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
1562
1580
current.page,
1563
1581
);
1564
1582
}
1565
- elements.addAll (addedElements);
1566
1583
final blocState = bloc.state;
1567
1584
if (blocState is ! DocumentLoadSuccess ) return ;
1568
1585
@@ -1577,7 +1594,11 @@ class CurrentIndexCubit extends Cubit<CurrentIndex> {
1577
1594
} else if (backgrounds != null ) {
1578
1595
await this .unbake (blocState, backgrounds: backgrounds);
1579
1596
} else {
1580
- await withUnbaked (blocState, elements);
1597
+ final elements = List <Renderer <PadElement >>.from (
1598
+ cameraViewport.unbakedElements,
1599
+ );
1600
+ elements.addAll (addedElements);
1601
+ await addUnbaked (blocState, elements);
1581
1602
}
1582
1603
1583
1604
setSaveState (saved: SaveState .unsaved);
0 commit comments