Skip to content
Snippets Groups Projects
Unverified Commit 0254d5a8 authored by Jack Reed's avatar Jack Reed Committed by GitHub
Browse files

Merge pull request #3140 from ProjectMirador/anno-rotate

Rotate the annotation layer to match OSD
parents 52031fa9 407ad714
No related branches found
No related tags found
No related merge requests found
...@@ -285,6 +285,8 @@ describe('OpenSeadragonViewer', () => { ...@@ -285,6 +285,8 @@ describe('OpenSeadragonViewer', () => {
it('calls the OSD viewport panTo and zoomTo with the component state and forces a redraw', () => { it('calls the OSD viewport panTo and zoomTo with the component state and forces a redraw', () => {
const panTo = jest.fn(); const panTo = jest.fn();
const zoomTo = jest.fn(); const zoomTo = jest.fn();
const setFlip = jest.fn();
const setRotation = jest.fn();
const forceRedraw = jest.fn(); const forceRedraw = jest.fn();
wrapper.setState({ wrapper.setState({
...@@ -293,22 +295,37 @@ describe('OpenSeadragonViewer', () => { ...@@ -293,22 +295,37 @@ describe('OpenSeadragonViewer', () => {
viewport: { viewport: {
centerSpringX: { target: { value: 10 } }, centerSpringX: { target: { value: 10 } },
centerSpringY: { target: { value: 10 } }, centerSpringY: { target: { value: 10 } },
getFlip: () => false,
getRotation: () => (0),
panTo, panTo,
setFlip,
setRotation,
zoomSpring: { target: { value: 1 } }, zoomSpring: { target: { value: 1 } },
zoomTo, zoomTo,
}, },
}, },
}); });
wrapper.setProps({ viewerConfig: { x: 0.5, y: 0.5, zoom: 0.1 } }); wrapper.setProps({
wrapper.setProps({ viewerConfig: { x: 1, y: 0, zoom: 0.5 } }); viewerConfig: {
flip: false, rotation: 90, x: 0.5, y: 0.5, zoom: 0.1,
},
});
wrapper.setProps({
viewerConfig: {
flip: true, rotation: 0, x: 1, y: 0, zoom: 0.5,
},
});
expect(panTo).toHaveBeenCalledWith( expect(panTo).toHaveBeenCalledWith(
{ x: 1, y: 0, zoom: 0.5 }, false, expect.objectContaining({ x: 1, y: 0, zoom: 0.5 }), false,
); );
expect(zoomTo).toHaveBeenCalledWith( expect(zoomTo).toHaveBeenCalledWith(
0.5, { x: 1, y: 0, zoom: 0.5 }, false, 0.5, expect.objectContaining({ x: 1, y: 0, zoom: 0.5 }), false,
); );
expect(setRotation).toHaveBeenCalledWith(90);
expect(setFlip).toHaveBeenCalledWith(true);
expect(forceRedraw).not.toHaveBeenCalled(); expect(forceRedraw).not.toHaveBeenCalled();
}); });
}); });
...@@ -320,6 +337,8 @@ describe('OpenSeadragonViewer', () => { ...@@ -320,6 +337,8 @@ describe('OpenSeadragonViewer', () => {
viewport: { viewport: {
centerSpringX: { target: { value: 1 } }, centerSpringX: { target: { value: 1 } },
centerSpringY: { target: { value: 0 } }, centerSpringY: { target: { value: 0 } },
getFlip: () => false,
getRotation: () => 90,
zoomSpring: { target: { value: 0.5 } }, zoomSpring: { target: { value: 0.5 } },
}, },
}, },
...@@ -327,7 +346,9 @@ describe('OpenSeadragonViewer', () => { ...@@ -327,7 +346,9 @@ describe('OpenSeadragonViewer', () => {
expect(updateViewport).toHaveBeenCalledWith( expect(updateViewport).toHaveBeenCalledWith(
'base', 'base',
{ x: 1, y: 0, zoom: 0.5 }, {
flip: false, rotation: 90, x: 1, y: 0, zoom: 0.5,
},
); );
}); });
}); });
......
...@@ -17,12 +17,15 @@ describe('OpenSeadragonCanvasOverlay', () => { ...@@ -17,12 +17,15 @@ describe('OpenSeadragonCanvasOverlay', () => {
clientWidth: 200, clientWidth: 200,
}, },
viewport: { viewport: {
getBounds: jest.fn(() => ({ getBoundsNoRotate: jest.fn(() => ({
height: 300, height: 300,
width: 200, width: 200,
x: 40, x: 40,
y: 80, y: 80,
})), })),
getCenter: () => ({ x: 0, y: 0 }),
getFlip: () => false,
getRotation: () => 0,
getZoom: jest.fn(() => (0.75)), getZoom: jest.fn(() => (0.75)),
}, },
world: { world: {
...@@ -89,7 +92,7 @@ describe('OpenSeadragonCanvasOverlay', () => { ...@@ -89,7 +92,7 @@ describe('OpenSeadragonCanvasOverlay', () => {
clientWidth: 200, clientWidth: 200,
}, },
viewport: { viewport: {
getBounds: jest.fn(() => (new OpenSeadragon.Rect(0, 0, 200, 200))), getBoundsNoRotate: jest.fn(() => (new OpenSeadragon.Rect(0, 0, 200, 200))),
}, },
world: { world: {
getItemAt: jest.fn(), getItemAt: jest.fn(),
......
...@@ -82,6 +82,8 @@ export class OpenSeadragonViewer extends Component { ...@@ -82,6 +82,8 @@ export class OpenSeadragonViewer extends Component {
if (viewerConfig) { if (viewerConfig) {
viewer.viewport.panTo(viewerConfig, true); viewer.viewport.panTo(viewerConfig, true);
viewer.viewport.zoomTo(viewerConfig.zoom, viewerConfig, true); viewer.viewport.zoomTo(viewerConfig.zoom, viewerConfig, true);
viewerConfig.degrees !== undefined && viewer.viewport.setRotation(viewerConfig.degrees);
viewerConfig.flip !== undefined && viewer.viewport.setFlip(viewerConfig.flip);
} }
this.addAllImageSources(!(viewerConfig)); this.addAllImageSources(!(viewerConfig));
...@@ -102,11 +104,19 @@ export class OpenSeadragonViewer extends Component { ...@@ -102,11 +104,19 @@ export class OpenSeadragonViewer extends Component {
if (viewerConfig.x !== viewport.centerSpringX.target.value if (viewerConfig.x !== viewport.centerSpringX.target.value
|| viewerConfig.y !== viewport.centerSpringY.target.value) { || viewerConfig.y !== viewport.centerSpringY.target.value) {
viewer.viewport.panTo(viewerConfig, false); viewport.panTo(viewerConfig, false);
} }
if (viewerConfig.zoom !== viewport.zoomSpring.target.value) { if (viewerConfig.zoom !== viewport.zoomSpring.target.value) {
viewer.viewport.zoomTo(viewerConfig.zoom, viewerConfig, false); viewport.zoomTo(viewerConfig.zoom, viewerConfig, false);
}
if (viewerConfig.rotation !== viewport.getRotation()) {
viewport.setRotation(viewerConfig.rotation);
}
if (viewerConfig.flip !== viewport.getFlip()) {
viewport.setFlip(viewerConfig.flip);
} }
} }
} }
...@@ -129,6 +139,8 @@ export class OpenSeadragonViewer extends Component { ...@@ -129,6 +139,8 @@ export class OpenSeadragonViewer extends Component {
const { viewport } = event.eventSource; const { viewport } = event.eventSource;
updateViewport(windowId, { updateViewport(windowId, {
flip: viewport.getFlip(),
rotation: viewport.getRotation(),
x: Math.round(viewport.centerSpringX.target.value), x: Math.round(viewport.centerSpringX.target.value),
y: Math.round(viewport.centerSpringY.target.value), y: Math.round(viewport.centerSpringY.target.value),
zoom: viewport.zoomSpring.target.value, zoom: viewport.zoomSpring.target.value,
......
...@@ -58,7 +58,7 @@ export default class OpenSeadragonCanvasOverlay { ...@@ -58,7 +58,7 @@ export default class OpenSeadragonCanvasOverlay {
} }
this.viewportOrigin = new OpenSeadragon.Point(0, 0); this.viewportOrigin = new OpenSeadragon.Point(0, 0);
const boundsRect = this.viewer.viewport.getBounds(true); const boundsRect = this.viewer.viewport.getBoundsNoRotate(true);
this.viewportOrigin.x = boundsRect.x; this.viewportOrigin.x = boundsRect.x;
this.viewportOrigin.y = boundsRect.y * this.imgAspectRatio; this.viewportOrigin.y = boundsRect.y * this.imgAspectRatio;
...@@ -93,6 +93,20 @@ export default class OpenSeadragonCanvasOverlay { ...@@ -93,6 +93,20 @@ export default class OpenSeadragonCanvasOverlay {
this.context2d.translate(x, y); this.context2d.translate(x, y);
this.context2d.scale(zoom, zoom); this.context2d.scale(zoom, zoom);
const center = this.viewer.viewport.getCenter();
const flip = this.viewer.viewport.getFlip();
if (flip) {
this.context2d.translate(center.x * 2, 0);
this.context2d.scale(-1, 1);
}
const rotation = this.viewer.viewport.getRotation();
if (rotation !== 0) {
this.context2d.translate(center.x, center.y);
this.context2d.rotate(rotation * Math.PI / 180);
this.context2d.translate(-1 * center.x, -1 * center.y);
}
update(); update();
this.context2d.setTransform(1, 0, 0, 1, 0, 0); this.context2d.setTransform(1, 0, 0, 1, 0, 0);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment