@@ -33,6 +33,13 @@ 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+ if ( ! homeBounds ) return undefined ;
40+
41+ return [ homeBounds . x , homeBounds . y , homeBounds . width , homeBounds . height ] ;
42+ } ) ( ) ,
3643 x : Math . round ( viewport . centerSpringX . target . value ) ,
3744 y : Math . round ( viewport . centerSpringY . target . value ) ,
3845 zoom : viewport . zoomSpring . target . value ,
@@ -105,17 +112,41 @@ function OpenSeadragonComponent({
105112 const bounds = viewerConfig . bounds || worldBounds ;
106113 if ( bounds && ! viewerConfig . x && ! viewerConfig . y && ! viewerConfig . zoom ) {
107114 const rect = new Openseadragon . Rect ( ...bounds ) ;
108- if ( rect . equals ( viewport . getBounds ( ) ) ) {
115+ if ( ! rect . equals ( viewport . getBounds ( ) ) ) {
109116 viewport . fitBounds ( rect , false ) ;
110117 }
111118 }
112119 } , [ initialViewportSet , setInitialBounds , viewerConfig , viewerRef , worldBounds ] ) ;
113120
121+ useEffect ( ( ) => {
122+ if ( ! osdConfig . preserveViewport ) return ;
123+ if ( ! viewerConfig ?. worldBounds || ! worldBounds ) return ;
124+
125+ const viewer = viewerRef . current ;
126+ if ( ! viewer ) return ;
127+ const { viewport } = viewer ;
128+
129+ const [ _x , _y , width , height ] = viewerConfig . worldBounds ;
130+ const [ _x1 , _y1 , width1 , height1 ] = worldBounds ;
131+
132+ const previousAspectRatio = ( 1.0 * width ) / height ;
133+ const newAspectRatio = ( 1.0 * width1 ) / height1 ;
134+
135+ if ( ( previousAspectRatio < ( 1 - osdConfig . resetViewportAfterAspectRatioDelta ) * newAspectRatio )
136+ || ( previousAspectRatio > ( 1 + osdConfig . resetViewportAfterAspectRatioDelta ) * newAspectRatio ) ) {
137+ const rect = new Openseadragon . Rect ( ...worldBounds ) ;
138+ if ( ! rect . equals ( viewport . getBounds ( ) ) ) {
139+ viewport . fitBounds ( rect , false ) ;
140+ }
141+ }
142+ } , [ osdConfig , viewerConfig , worldBounds , viewerRef ] ) ;
143+
114144 // initialize OSD stuff when this component is mounted
115145 useEffect ( ( ) => {
116146 const viewer = Openseadragon ( {
117147 element : ref . current ,
118148 ...osdConfig ,
149+ preserveViewportAspectRatio : undefined ,
119150 } ) ;
120151
121152 viewer . addHandler ( 'canvas-drag' , ( ) => {
0 commit comments