@@ -33,6 +33,11 @@ function OpenSeadragonComponent({
33
33
bounds : viewport . getBounds ( ) ,
34
34
flip : viewport . getFlip ( ) ,
35
35
rotation : viewport . getRotation ( ) ,
36
+ worldBounds : ( ( ) => {
37
+ const homeBounds = viewport . viewer . world . getHomeBounds ( ) ;
38
+
39
+ return [ homeBounds . x , homeBounds . y , homeBounds . width , homeBounds . height ] ;
40
+ } ) ( ) ,
36
41
x : Math . round ( viewport . centerSpringX . target . value ) ,
37
42
y : Math . round ( viewport . centerSpringY . target . value ) ,
38
43
zoom : viewport . zoomSpring . target . value ,
@@ -105,17 +110,41 @@ function OpenSeadragonComponent({
105
110
const bounds = viewerConfig . bounds || worldBounds ;
106
111
if ( bounds && ! viewerConfig . x && ! viewerConfig . y && ! viewerConfig . zoom ) {
107
112
const rect = new Openseadragon . Rect ( ...bounds ) ;
108
- if ( rect . equals ( viewport . getBounds ( ) ) ) {
113
+ if ( ! rect . equals ( viewport . getBounds ( ) ) ) {
109
114
viewport . fitBounds ( rect , false ) ;
110
115
}
111
116
}
112
117
} , [ initialViewportSet , setInitialBounds , viewerConfig , viewerRef , worldBounds ] ) ;
113
118
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
+
114
142
// initialize OSD stuff when this component is mounted
115
143
useEffect ( ( ) => {
116
144
const viewer = Openseadragon ( {
117
145
element : ref . current ,
118
146
...osdConfig ,
147
+ preserveViewportAspectRatio : undefined ,
119
148
} ) ;
120
149
121
150
viewer . addHandler ( 'canvas-drag' , ( ) => {
0 commit comments