Skip to content

Commit 97e3fe7

Browse files
committed
Only preserve the viewport if the preserved viewport 'makes sense'
1 parent 8e1a0c9 commit 97e3fe7

File tree

4 files changed

+34
-9
lines changed

4 files changed

+34
-9
lines changed

__tests__/integration/mirador/mirador-configs/index.js

+1-7
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ export default {
2020
transitions: {},
2121
},
2222
windows: [{
23-
canvasId: 'https://iiif.harvardartmuseums.org/manifests/object/299843/canvas/canvas-47174892',
24-
manifestId: 'https://iiif.harvardartmuseums.org/manifests/object/299843',
25-
},
26-
{
27-
canvasId: 'https://iiif.bodleian.ox.ac.uk/iiif/canvas/e58b8c60-005c-4c41-a22f-07d49cb25ede.json',
28-
manifestId: 'https://iiif.bodleian.ox.ac.uk/iiif/manifest/e32a277e-91e2-4a6d-8ba6-cc4bad230410.json',
29-
thumbnailNavigationPosition: 'far-bottom',
23+
manifestId: 'https://wellcomelibrary.org/iiif/b18035723/manifest',
3024
}],
3125
};

src/components/OpenSeadragonComponent.js

+30-1
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ function OpenSeadragonComponent({
3333
bounds: viewport.getBounds(),
3434
flip: viewport.getFlip(),
3535
rotation: viewport.getRotation(),
36+
worldBounds: (() => {
37+
const homeBounds = viewport.viewer.world.getHomeBounds();
38+
39+
return [homeBounds.x, homeBounds.y, homeBounds.width, homeBounds.height];
40+
})(),
3641
x: Math.round(viewport.centerSpringX.target.value),
3742
y: Math.round(viewport.centerSpringY.target.value),
3843
zoom: viewport.zoomSpring.target.value,
@@ -105,17 +110,41 @@ function OpenSeadragonComponent({
105110
const bounds = viewerConfig.bounds || worldBounds;
106111
if (bounds && !viewerConfig.x && !viewerConfig.y && !viewerConfig.zoom) {
107112
const rect = new Openseadragon.Rect(...bounds);
108-
if (rect.equals(viewport.getBounds())) {
113+
if (!rect.equals(viewport.getBounds())) {
109114
viewport.fitBounds(rect, false);
110115
}
111116
}
112117
}, [initialViewportSet, setInitialBounds, viewerConfig, viewerRef, worldBounds]);
113118

119+
useEffect(() => {
120+
if (!osdConfig.preserveViewport) return;
121+
if (!viewerConfig?.worldBounds || !worldBounds) return;
122+
123+
const viewer = viewerRef.current;
124+
if (!viewer) return;
125+
const { viewport } = viewer;
126+
127+
const [_x, _y, width, height] = viewerConfig.worldBounds;
128+
const [_x1, _y1, width1, height1] = worldBounds;
129+
130+
const previousAspectRatio = (1.0 * width) / height;
131+
const newAspectRatio = (1.0 * width1) / height1;
132+
133+
if ((previousAspectRatio < (1 - osdConfig.resetViewportAfterAspectRatioDelta) * newAspectRatio)
134+
|| (previousAspectRatio > (1 + osdConfig.resetViewportAfterAspectRatioDelta) * newAspectRatio)) {
135+
const rect = new Openseadragon.Rect(...worldBounds);
136+
if (!rect.equals(viewport.getBounds())) {
137+
viewport.fitBounds(rect, false);
138+
}
139+
}
140+
}, [osdConfig, viewerConfig, worldBounds, viewerRef]);
141+
114142
// initialize OSD stuff when this component is mounted
115143
useEffect(() => {
116144
const viewer = Openseadragon({
117145
element: ref.current,
118146
...osdConfig,
147+
preserveViewportAspectRatio: undefined,
119148
});
120149

121150
viewer.addHandler('canvas-drag', () => {

src/components/OpenSeadragonViewer.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ export function OpenSeadragonViewer({
3333
const apiRef = useRef();
3434
const [viewer, setViewer] = useState(null);
3535
const onViewportChange = useCallback(({
36-
flip, rotation, x, y, zoom,
36+
flip, rotation, worldBounds, x, y, zoom,
3737
}) => {
3838
updateViewport(windowId, {
3939
flip,
4040
rotation,
41+
worldBounds,
4142
x,
4243
y,
4344
zoom,

src/config/settings.js

+1
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,7 @@ export default {
545545
blendTime: 0.1,
546546
preserveImageSizeOnResize: true,
547547
preserveViewport: true,
548+
resetViewportAfterAspectRatioDelta: 0.25,
548549
showNavigationControl: false,
549550
zoomPerClick: 1, // disable zoom-to-click
550551
zoomPerDoubleClick: 2.0

0 commit comments

Comments
 (0)