mirror of
https://github.com/openseadragon/openseadragon.git
synced 2024-11-22 05:06:09 +03:00
Merge pull request #2136 from jonasengelmann/master
Viewport rotation animation
This commit is contained in:
commit
d3ef767487
@ -548,8 +548,8 @@ $.Drawer.prototype = {
|
|||||||
context.strokeStyle = this.debugGridColor[colorIndex];
|
context.strokeStyle = this.debugGridColor[colorIndex];
|
||||||
context.fillStyle = this.debugGridColor[colorIndex];
|
context.fillStyle = this.debugGridColor[colorIndex];
|
||||||
|
|
||||||
if ( this.viewport.degrees !== 0 ) {
|
if (this.viewport.getRotation(true) % 360 !== 0 ) {
|
||||||
this._offsetForRotation({degrees: this.viewport.degrees});
|
this._offsetForRotation({degrees: this.viewport.getRotation(true)});
|
||||||
}
|
}
|
||||||
if (tiledImage.getRotation(true) % 360 !== 0) {
|
if (tiledImage.getRotation(true) % 360 !== 0) {
|
||||||
this._offsetForRotation({
|
this._offsetForRotation({
|
||||||
@ -558,10 +558,11 @@ $.Drawer.prototype = {
|
|||||||
tiledImage._getRotationPoint(true), true)
|
tiledImage._getRotationPoint(true), true)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
if (tiledImage.viewport.getRotation(true) % 360 === 0 &&
|
||||||
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
tiledImage.getRotation(true) % 360 === 0) {
|
||||||
tiledImage._drawer._flip();
|
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
||||||
}
|
tiledImage._drawer._flip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.strokeRect(
|
context.strokeRect(
|
||||||
@ -576,7 +577,7 @@ $.Drawer.prototype = {
|
|||||||
|
|
||||||
// Rotate the text the right way around.
|
// Rotate the text the right way around.
|
||||||
context.translate( tileCenterX, tileCenterY );
|
context.translate( tileCenterX, tileCenterY );
|
||||||
context.rotate( Math.PI / 180 * -this.viewport.degrees );
|
context.rotate( Math.PI / 180 * -this.viewport.getRotation(true) );
|
||||||
context.translate( -tileCenterX, -tileCenterY );
|
context.translate( -tileCenterX, -tileCenterY );
|
||||||
|
|
||||||
if( tile.x === 0 && tile.y === 0 ){
|
if( tile.x === 0 && tile.y === 0 ){
|
||||||
@ -622,17 +623,18 @@ $.Drawer.prototype = {
|
|||||||
(tile.position.y + 70) * $.pixelDensityRatio
|
(tile.position.y + 70) * $.pixelDensityRatio
|
||||||
);
|
);
|
||||||
|
|
||||||
if ( this.viewport.degrees !== 0 ) {
|
if (this.viewport.getRotation(true) % 360 !== 0 ) {
|
||||||
this._restoreRotationChanges();
|
this._restoreRotationChanges();
|
||||||
}
|
}
|
||||||
if (tiledImage.getRotation(true) % 360 !== 0) {
|
if (tiledImage.getRotation(true) % 360 !== 0) {
|
||||||
this._restoreRotationChanges();
|
this._restoreRotationChanges();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
if (tiledImage.viewport.getRotation(true) % 360 === 0 &&
|
||||||
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
tiledImage.getRotation(true) % 360 === 0) {
|
||||||
tiledImage._drawer._flip();
|
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
||||||
}
|
tiledImage._drawer._flip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
context.restore();
|
context.restore();
|
||||||
|
@ -124,7 +124,7 @@ $.Navigator = function( options ){
|
|||||||
showSequenceControl: false,
|
showSequenceControl: false,
|
||||||
immediateRender: true,
|
immediateRender: true,
|
||||||
blendTime: 0,
|
blendTime: 0,
|
||||||
animationTime: 0,
|
animationTime: options.animationTime,
|
||||||
autoResize: options.autoResize,
|
autoResize: options.autoResize,
|
||||||
// prevent resizing the navigator from adding unwanted space around the image
|
// prevent resizing the navigator from adding unwanted space around the image
|
||||||
minZoomImageRatio: 1.0,
|
minZoomImageRatio: 1.0,
|
||||||
|
@ -332,7 +332,7 @@
|
|||||||
*
|
*
|
||||||
* @property {Number} [animationTime=1.2]
|
* @property {Number} [animationTime=1.2]
|
||||||
* Specifies the animation duration per each {@link OpenSeadragon.Spring}
|
* Specifies the animation duration per each {@link OpenSeadragon.Spring}
|
||||||
* which occur when the image is dragged or zoomed.
|
* which occur when the image is dragged, zoomed or rotated.
|
||||||
*
|
*
|
||||||
* @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]
|
* @property {OpenSeadragon.GestureSettings} [gestureSettingsMouse]
|
||||||
* Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})
|
* Settings for gestures generated by a mouse pointer device. (See {@link OpenSeadragon.GestureSettings})
|
||||||
@ -1640,8 +1640,8 @@ function OpenSeadragon( options ){
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Compute the modulo of a number but makes sure to always return
|
* Compute the modulo of a number but makes sure to always return
|
||||||
* a positive value.
|
* a positive value (also known as Euclidean modulo).
|
||||||
* @param {Number} number the number to computes the modulo of
|
* @param {Number} number the number to compute the modulo of
|
||||||
* @param {Number} modulo the modulo
|
* @param {Number} modulo the modulo
|
||||||
* @returns {Number} the result of the modulo of number
|
* @returns {Number} the result of the modulo of number
|
||||||
*/
|
*/
|
||||||
@ -1653,6 +1653,7 @@ function OpenSeadragon( options ){
|
|||||||
return result;
|
return result;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines if a point is within the bounding rectangle of the given element (hit-test).
|
* Determines if a point is within the bounding rectangle of the given element (hit-test).
|
||||||
* @function
|
* @function
|
||||||
|
@ -299,18 +299,18 @@
|
|||||||
this.adjust(position, size);
|
this.adjust(position, size);
|
||||||
|
|
||||||
var rotate = 0;
|
var rotate = 0;
|
||||||
if (viewport.degrees &&
|
if (viewport.getRotation(true) &&
|
||||||
this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {
|
this.rotationMode !== $.OverlayRotationMode.NO_ROTATION) {
|
||||||
// BOUNDING_BOX is only valid if both directions get scaled.
|
// BOUNDING_BOX is only valid if both directions get scaled.
|
||||||
// Get replaced by EXACT otherwise.
|
// Get replaced by EXACT otherwise.
|
||||||
if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&
|
if (this.rotationMode === $.OverlayRotationMode.BOUNDING_BOX &&
|
||||||
this.width !== null && this.height !== null) {
|
this.width !== null && this.height !== null) {
|
||||||
var rect = new $.Rect(position.x, position.y, size.x, size.y);
|
var rect = new $.Rect(position.x, position.y, size.x, size.y);
|
||||||
var boundingBox = this._getBoundingBox(rect, viewport.degrees);
|
var boundingBox = this._getBoundingBox(rect, viewport.getRotation(true));
|
||||||
position = boundingBox.getTopLeft();
|
position = boundingBox.getTopLeft();
|
||||||
size = boundingBox.getSize();
|
size = boundingBox.getSize();
|
||||||
} else {
|
} else {
|
||||||
rotate = viewport.degrees;
|
rotate = viewport.getRotation(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -447,7 +447,7 @@
|
|||||||
// private
|
// private
|
||||||
_adjustBoundsForRotation: function(viewport, bounds) {
|
_adjustBoundsForRotation: function(viewport, bounds) {
|
||||||
if (!viewport ||
|
if (!viewport ||
|
||||||
viewport.degrees === 0 ||
|
viewport.getRotation(true) === 0 ||
|
||||||
this.rotationMode === $.OverlayRotationMode.EXACT) {
|
this.rotationMode === $.OverlayRotationMode.EXACT) {
|
||||||
return bounds;
|
return bounds;
|
||||||
}
|
}
|
||||||
@ -467,7 +467,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// NO_ROTATION case
|
// NO_ROTATION case
|
||||||
return bounds.rotate(-viewport.degrees,
|
return bounds.rotate(-viewport.getRotation(true),
|
||||||
this._getPlacementPoint(bounds));
|
this._getPlacementPoint(bounds));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1886,7 +1886,8 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|||||||
.getIntegerBoundingBox();
|
.getIntegerBoundingBox();
|
||||||
|
|
||||||
if(this._drawer.viewer.viewport.getFlip()) {
|
if(this._drawer.viewer.viewport.getFlip()) {
|
||||||
if (this.viewport.degrees !== 0 || this.getRotation(true) % 360 !== 0) {
|
if (this.viewport.getRotation(true) % 360 !== 0 ||
|
||||||
|
this.getRotation(true) % 360 !== 0) {
|
||||||
bounds.x = this._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);
|
bounds.x = this._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1899,9 +1900,9 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|||||||
// When scaling, we must rotate only when blending the sketch canvas to
|
// When scaling, we must rotate only when blending the sketch canvas to
|
||||||
// avoid interpolation
|
// avoid interpolation
|
||||||
if (!sketchScale) {
|
if (!sketchScale) {
|
||||||
if (this.viewport.degrees !== 0) {
|
if (this.viewport.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._offsetForRotation({
|
this._drawer._offsetForRotation({
|
||||||
degrees: this.viewport.degrees,
|
degrees: this.viewport.getRotation(true),
|
||||||
useSketch: useSketch
|
useSketch: useSketch
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -1914,7 +1915,8 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.viewport.degrees === 0 && this.getRotation(true) % 360 === 0){
|
if (this.viewport.getRotation(true) % 360 === 0 &&
|
||||||
|
this.getRotation(true) % 360 === 0) {
|
||||||
if(this._drawer.viewer.viewport.getFlip()) {
|
if(this._drawer.viewer.viewport.getFlip()) {
|
||||||
this._drawer._flip();
|
this._drawer._flip();
|
||||||
}
|
}
|
||||||
@ -2026,16 +2028,16 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|||||||
if (this.getRotation(true) % 360 !== 0) {
|
if (this.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._restoreRotationChanges(useSketch);
|
this._drawer._restoreRotationChanges(useSketch);
|
||||||
}
|
}
|
||||||
if (this.viewport.degrees !== 0) {
|
if (this.viewport.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._restoreRotationChanges(useSketch);
|
this._drawer._restoreRotationChanges(useSketch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (useSketch) {
|
if (useSketch) {
|
||||||
if (sketchScale) {
|
if (sketchScale) {
|
||||||
if (this.viewport.degrees !== 0) {
|
if (this.viewport.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._offsetForRotation({
|
this._drawer._offsetForRotation({
|
||||||
degrees: this.viewport.degrees,
|
degrees: this.viewport.getRotation(true),
|
||||||
useSketch: false
|
useSketch: false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2059,14 +2061,15 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|||||||
if (this.getRotation(true) % 360 !== 0) {
|
if (this.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._restoreRotationChanges(false);
|
this._drawer._restoreRotationChanges(false);
|
||||||
}
|
}
|
||||||
if (this.viewport.degrees !== 0) {
|
if (this.viewport.getRotation(true) % 360 !== 0) {
|
||||||
this._drawer._restoreRotationChanges(false);
|
this._drawer._restoreRotationChanges(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sketchScale) {
|
if (!sketchScale) {
|
||||||
if (this.viewport.degrees === 0 && this.getRotation(true) % 360 === 0){
|
if (this.viewport.getRotation(true) % 360 === 0 &&
|
||||||
|
this.getRotation(true) % 360 === 0) {
|
||||||
if(this._drawer.viewer.viewport.getFlip()) {
|
if(this._drawer.viewer.viewport.getFlip()) {
|
||||||
this._drawer._flip();
|
this._drawer._flip();
|
||||||
}
|
}
|
||||||
|
@ -449,7 +449,8 @@ $.Viewer = function( options ) {
|
|||||||
opacity: this.navigatorOpacity,
|
opacity: this.navigatorOpacity,
|
||||||
borderColor: this.navigatorBorderColor,
|
borderColor: this.navigatorBorderColor,
|
||||||
displayRegionColor: this.navigatorDisplayRegionColor,
|
displayRegionColor: this.navigatorDisplayRegionColor,
|
||||||
crossOriginPolicy: this.crossOriginPolicy
|
crossOriginPolicy: this.crossOriginPolicy,
|
||||||
|
animationTime: this.animationTime,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2817,18 +2818,18 @@ function onCanvasKeyPress( event ) {
|
|||||||
break;
|
break;
|
||||||
case 114: //r - clockwise rotation
|
case 114: //r - clockwise rotation
|
||||||
if(this.viewport.flipped){
|
if(this.viewport.flipped){
|
||||||
this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
|
this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement);
|
||||||
} else{
|
} else{
|
||||||
this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
|
this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement);
|
||||||
}
|
}
|
||||||
this.viewport.applyConstraints();
|
this.viewport.applyConstraints();
|
||||||
event.preventDefault = true;
|
event.preventDefault = true;
|
||||||
break;
|
break;
|
||||||
case 82: //R - counterclockwise rotation
|
case 82: //R - counterclockwise rotation
|
||||||
if(this.viewport.flipped){
|
if(this.viewport.flipped){
|
||||||
this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
|
this.viewport.setRotation(this.viewport.getRotation() + this.rotationIncrement);
|
||||||
} else{
|
} else{
|
||||||
this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
|
this.viewport.setRotation(this.viewport.getRotation() - this.rotationIncrement);
|
||||||
}
|
}
|
||||||
this.viewport.applyConstraints();
|
this.viewport.applyConstraints();
|
||||||
event.preventDefault = true;
|
event.preventDefault = true;
|
||||||
@ -3715,9 +3716,9 @@ function onRotateLeft() {
|
|||||||
var currRotation = this.viewport.getRotation();
|
var currRotation = this.viewport.getRotation();
|
||||||
|
|
||||||
if ( this.viewport.flipped ){
|
if ( this.viewport.flipped ){
|
||||||
currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
|
currRotation += this.rotationIncrement;
|
||||||
} else {
|
} else {
|
||||||
currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
|
currRotation -= this.rotationIncrement;
|
||||||
}
|
}
|
||||||
this.viewport.setRotation(currRotation);
|
this.viewport.setRotation(currRotation);
|
||||||
}
|
}
|
||||||
@ -3728,9 +3729,9 @@ function onRotateRight() {
|
|||||||
var currRotation = this.viewport.getRotation();
|
var currRotation = this.viewport.getRotation();
|
||||||
|
|
||||||
if ( this.viewport.flipped ){
|
if ( this.viewport.flipped ){
|
||||||
currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
|
currRotation -= this.rotationIncrement;
|
||||||
} else {
|
} else {
|
||||||
currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
|
currRotation += this.rotationIncrement;
|
||||||
}
|
}
|
||||||
this.viewport.setRotation(currRotation);
|
this.viewport.setRotation(currRotation);
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,9 @@ $.Viewport = function( options ) {
|
|||||||
|
|
||||||
delete options.margins;
|
delete options.margins;
|
||||||
|
|
||||||
|
options.initialDegrees = options.degrees;
|
||||||
|
delete options.degrees;
|
||||||
|
|
||||||
$.extend( true, this, {
|
$.extend( true, this, {
|
||||||
|
|
||||||
//required settings
|
//required settings
|
||||||
@ -107,7 +110,7 @@ $.Viewport = function( options ) {
|
|||||||
defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel,
|
defaultZoomLevel: $.DEFAULT_SETTINGS.defaultZoomLevel,
|
||||||
minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,
|
minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,
|
||||||
maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,
|
maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,
|
||||||
degrees: $.DEFAULT_SETTINGS.degrees,
|
initialDegrees: $.DEFAULT_SETTINGS.degrees,
|
||||||
flipped: $.DEFAULT_SETTINGS.flipped,
|
flipped: $.DEFAULT_SETTINGS.flipped,
|
||||||
homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer,
|
homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer,
|
||||||
silenceMultiImageWarnings: $.DEFAULT_SETTINGS.silenceMultiImageWarnings
|
silenceMultiImageWarnings: $.DEFAULT_SETTINGS.silenceMultiImageWarnings
|
||||||
@ -133,9 +136,16 @@ $.Viewport = function( options ) {
|
|||||||
animationTime: this.animationTime
|
animationTime: this.animationTime
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.degreesSpring = new $.Spring({
|
||||||
|
initial: options.initialDegrees,
|
||||||
|
springStiffness: this.springStiffness,
|
||||||
|
animationTime: this.animationTime
|
||||||
|
});
|
||||||
|
|
||||||
this._oldCenterX = this.centerSpringX.current.value;
|
this._oldCenterX = this.centerSpringX.current.value;
|
||||||
this._oldCenterY = this.centerSpringY.current.value;
|
this._oldCenterY = this.centerSpringY.current.value;
|
||||||
this._oldZoom = this.zoomSpring.current.value;
|
this._oldZoom = this.zoomSpring.current.value;
|
||||||
|
this._oldDegrees = this.degreesSpring.current.value;
|
||||||
|
|
||||||
this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);
|
this._setContentBounds(new $.Rect(0, 0, 1, 1), 1);
|
||||||
|
|
||||||
@ -145,6 +155,19 @@ $.Viewport = function( options ) {
|
|||||||
|
|
||||||
/** @lends OpenSeadragon.Viewport.prototype */
|
/** @lends OpenSeadragon.Viewport.prototype */
|
||||||
$.Viewport.prototype = {
|
$.Viewport.prototype = {
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
get degrees () {
|
||||||
|
$.console.warn('Accessing [Viewport.degrees] is deprecated. Use viewport.getRotation instead.');
|
||||||
|
return this.getRotation();
|
||||||
|
},
|
||||||
|
|
||||||
|
// deprecated
|
||||||
|
set degrees (degrees) {
|
||||||
|
$.console.warn('Setting [Viewport.degrees] is deprecated. Use viewport.setRotation instead.');
|
||||||
|
this.setRotation(degrees);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the viewport's home bounds and constraints for the given content size.
|
* Updates the viewport's home bounds and constraints for the given content size.
|
||||||
* @function
|
* @function
|
||||||
@ -184,7 +207,7 @@ $.Viewport.prototype = {
|
|||||||
this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(
|
this._contentSizeNoRotate = this._contentBoundsNoRotate.getSize().times(
|
||||||
contentFactor);
|
contentFactor);
|
||||||
|
|
||||||
this._contentBounds = bounds.rotate(this.degrees).getBoundingBox();
|
this._contentBounds = bounds.rotate(this.getRotation()).getBoundingBox();
|
||||||
this._contentSize = this._contentBounds.getSize().times(contentFactor);
|
this._contentSize = this._contentBounds.getSize().times(contentFactor);
|
||||||
this._contentAspectRatio = this._contentSize.x / this._contentSize.y;
|
this._contentAspectRatio = this._contentSize.x / this._contentSize.y;
|
||||||
|
|
||||||
@ -367,7 +390,7 @@ $.Viewport.prototype = {
|
|||||||
* @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.
|
* @returns {OpenSeadragon.Rect} The location you are zoomed/panned to, in viewport coordinates.
|
||||||
*/
|
*/
|
||||||
getBounds: function(current) {
|
getBounds: function(current) {
|
||||||
return this.getBoundsNoRotate(current).rotate(-this.getRotation());
|
return this.getBoundsNoRotate(current).rotate(-this.getRotation(current));
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -399,7 +422,7 @@ $.Viewport.prototype = {
|
|||||||
*/
|
*/
|
||||||
getBoundsWithMargins: function(current) {
|
getBoundsWithMargins: function(current) {
|
||||||
return this.getBoundsNoRotateWithMargins(current).rotate(
|
return this.getBoundsNoRotateWithMargins(current).rotate(
|
||||||
-this.getRotation(), this.getCenter(current));
|
-this.getRotation(current), this.getCenter(current));
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -611,7 +634,7 @@ $.Viewport.prototype = {
|
|||||||
bounds.y !== constrainedBounds.y ||
|
bounds.y !== constrainedBounds.y ||
|
||||||
immediately) {
|
immediately) {
|
||||||
this.fitBounds(
|
this.fitBounds(
|
||||||
constrainedBounds.rotate(-this.getRotation()),
|
constrainedBounds.rotate(-this.getRotation(true)),
|
||||||
immediately);
|
immediately);
|
||||||
}
|
}
|
||||||
return this;
|
return this;
|
||||||
@ -904,13 +927,36 @@ $.Viewport.prototype = {
|
|||||||
* Rotates this viewport to the angle specified.
|
* Rotates this viewport to the angle specified.
|
||||||
* @function
|
* @function
|
||||||
* @param {Number} degrees The degrees to set the rotation to.
|
* @param {Number} degrees The degrees to set the rotation to.
|
||||||
|
* @param {Boolean} [immediately=false] Whether to animate to the new angle
|
||||||
|
* or rotate immediately.
|
||||||
* @return {OpenSeadragon.Viewport} Chainable.
|
* @return {OpenSeadragon.Viewport} Chainable.
|
||||||
*/
|
*/
|
||||||
setRotation: function(degrees) {
|
setRotation: function(degrees, immediately) {
|
||||||
if (!this.viewer || !this.viewer.drawer.canRotate()) {
|
if (!this.viewer || !this.viewer.drawer.canRotate()) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
this.degrees = $.positiveModulo(degrees, 360);
|
|
||||||
|
if (this.degreesSpring.target.value === degrees &&
|
||||||
|
this.degreesSpring.isAtTargetValue()) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
if (immediately) {
|
||||||
|
this.degreesSpring.resetTo(degrees);
|
||||||
|
} else {
|
||||||
|
var normalizedFrom = $.positiveModulo(this.degreesSpring.current.value, 360);
|
||||||
|
var normalizedTo = $.positiveModulo(degrees, 360);
|
||||||
|
var diff = normalizedTo - normalizedFrom;
|
||||||
|
if (diff > 180) {
|
||||||
|
normalizedTo -= 360;
|
||||||
|
} else if (diff < -180) {
|
||||||
|
normalizedTo += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
var reverseDiff = normalizedFrom - normalizedTo;
|
||||||
|
this.degreesSpring.resetTo(degrees + reverseDiff);
|
||||||
|
this.degreesSpring.springTo(degrees);
|
||||||
|
}
|
||||||
|
|
||||||
this._setContentBounds(
|
this._setContentBounds(
|
||||||
this.viewer.world.getHomeBounds(),
|
this.viewer.world.getHomeBounds(),
|
||||||
this.viewer.world.getContentFactor());
|
this.viewer.world.getContentFactor());
|
||||||
@ -933,10 +979,13 @@ $.Viewport.prototype = {
|
|||||||
/**
|
/**
|
||||||
* Gets the current rotation in degrees.
|
* Gets the current rotation in degrees.
|
||||||
* @function
|
* @function
|
||||||
|
* @param {Boolean} [current=false] True for current rotation, false for target.
|
||||||
* @return {Number} The current rotation in degrees.
|
* @return {Number} The current rotation in degrees.
|
||||||
*/
|
*/
|
||||||
getRotation: function() {
|
getRotation: function(current) {
|
||||||
return this.degrees;
|
return current ?
|
||||||
|
this.degreesSpring.current.value :
|
||||||
|
this.degreesSpring.target.value;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1004,13 +1053,18 @@ $.Viewport.prototype = {
|
|||||||
this.centerSpringX.update();
|
this.centerSpringX.update();
|
||||||
this.centerSpringY.update();
|
this.centerSpringY.update();
|
||||||
|
|
||||||
|
this.degreesSpring.update();
|
||||||
|
|
||||||
var changed = this.centerSpringX.current.value !== this._oldCenterX ||
|
var changed = this.centerSpringX.current.value !== this._oldCenterX ||
|
||||||
this.centerSpringY.current.value !== this._oldCenterY ||
|
this.centerSpringY.current.value !== this._oldCenterY ||
|
||||||
this.zoomSpring.current.value !== this._oldZoom;
|
this.zoomSpring.current.value !== this._oldZoom ||
|
||||||
|
this.degreesSpring.current.value !== this._oldDegrees;
|
||||||
|
|
||||||
|
|
||||||
this._oldCenterX = this.centerSpringX.current.value;
|
this._oldCenterX = this.centerSpringX.current.value;
|
||||||
this._oldCenterY = this.centerSpringY.current.value;
|
this._oldCenterY = this.centerSpringY.current.value;
|
||||||
this._oldZoom = this.zoomSpring.current.value;
|
this._oldZoom = this.zoomSpring.current.value;
|
||||||
|
this._oldDegrees = this.degreesSpring.current.value;
|
||||||
|
|
||||||
return changed;
|
return changed;
|
||||||
},
|
},
|
||||||
@ -1061,7 +1115,7 @@ $.Viewport.prototype = {
|
|||||||
*/
|
*/
|
||||||
deltaPixelsFromPoints: function(deltaPoints, current) {
|
deltaPixelsFromPoints: function(deltaPoints, current) {
|
||||||
return this.deltaPixelsFromPointsNoRotate(
|
return this.deltaPixelsFromPointsNoRotate(
|
||||||
deltaPoints.rotate(this.getRotation()),
|
deltaPoints.rotate(this.getRotation(current)),
|
||||||
current);
|
current);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1090,7 +1144,7 @@ $.Viewport.prototype = {
|
|||||||
*/
|
*/
|
||||||
deltaPointsFromPixels: function(deltaPixels, current) {
|
deltaPointsFromPixels: function(deltaPixels, current) {
|
||||||
return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)
|
return this.deltaPointsFromPixelsNoRotate(deltaPixels, current)
|
||||||
.rotate(-this.getRotation());
|
.rotate(-this.getRotation(current));
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1132,7 +1186,7 @@ $.Viewport.prototype = {
|
|||||||
// private
|
// private
|
||||||
_pixelFromPoint: function(point, bounds) {
|
_pixelFromPoint: function(point, bounds) {
|
||||||
return this._pixelFromPointNoRotate(
|
return this._pixelFromPointNoRotate(
|
||||||
point.rotate(this.getRotation(), this.getCenter(true)),
|
point.rotate(this.getRotation(true), this.getCenter(true)),
|
||||||
bounds);
|
bounds);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1165,8 +1219,8 @@ $.Viewport.prototype = {
|
|||||||
*/
|
*/
|
||||||
pointFromPixel: function(pixel, current) {
|
pointFromPixel: function(pixel, current) {
|
||||||
return this.pointFromPixelNoRotate(pixel, current).rotate(
|
return this.pointFromPixelNoRotate(pixel, current).rotate(
|
||||||
-this.getRotation(),
|
-this.getRotation(current),
|
||||||
this.getCenter(true)
|
this.getCenter(current)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
6
test/modules/controls.js
vendored
6
test/modules/controls.js
vendored
@ -230,11 +230,11 @@
|
|||||||
|
|
||||||
// Now simulate the left/right button clicks.
|
// Now simulate the left/right button clicks.
|
||||||
// TODO: re-factor simulateViewerClickWithDrag so it'll accept any element, and use that.
|
// TODO: re-factor simulateViewerClickWithDrag so it'll accept any element, and use that.
|
||||||
assert.equal(viewer.viewport.degrees, 0, "Image should start at 0 degrees rotation");
|
assert.equal(viewer.viewport.getRotation(), 0, "Image should start at 0 degrees rotation");
|
||||||
viewer.rotateLeftButton.onRelease();
|
viewer.rotateLeftButton.onRelease();
|
||||||
assert.equal(viewer.viewport.degrees, 270, "Image should be 270 degrees rotation (left)");
|
assert.equal(viewer.viewport.getRotation(), -90, "Image should be -90 degrees rotation (left)");
|
||||||
viewer.rotateRightButton.onRelease();
|
viewer.rotateRightButton.onRelease();
|
||||||
assert.equal(viewer.viewport.degrees, 0, "Image should be 270 degrees rotation (right)");
|
assert.equal(viewer.viewport.getRotation(), 0, "Image should be 0 degrees rotation (right)");
|
||||||
|
|
||||||
viewer.close();
|
viewer.close();
|
||||||
done();
|
done();
|
||||||
|
@ -45,7 +45,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
viewer.addHandler('open', function handler(event) {
|
viewer.addHandler('open', function handler(event) {
|
||||||
viewer.viewport.setRotation(30);
|
viewer.viewport.setRotation(30, true);
|
||||||
Util.spyOnce(viewer.drawer.context, 'rotate', function() {
|
Util.spyOnce(viewer.drawer.context, 'rotate', function() {
|
||||||
assert.ok(true, 'drawing with new rotation');
|
assert.ok(true, 'drawing with new rotation');
|
||||||
done();
|
done();
|
||||||
|
@ -210,13 +210,13 @@
|
|||||||
checkPoint(assert, ' after zoom and pan');
|
checkPoint(assert, ' after zoom and pan');
|
||||||
|
|
||||||
//Restore rotation
|
//Restore rotation
|
||||||
viewer.viewport.setRotation(0);
|
viewer.viewport.setRotation(0, true);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
viewer.viewport.zoomTo(0.8).panTo(new OpenSeadragon.Point(0.1, 0.2));
|
viewer.viewport.zoomTo(0.8).panTo(new OpenSeadragon.Point(0.1, 0.2));
|
||||||
});
|
});
|
||||||
|
|
||||||
viewer.viewport.setRotation(45);
|
viewer.viewport.setRotation(45, true);
|
||||||
viewer.open([{
|
viewer.open([{
|
||||||
tileSource: "/test/data/testpattern.dzi"
|
tileSource: "/test/data/testpattern.dzi"
|
||||||
}, {
|
}, {
|
||||||
|
@ -245,7 +245,7 @@
|
|||||||
function openHandler() {
|
function openHandler() {
|
||||||
viewer.removeHandler('open', openHandler);
|
viewer.removeHandler('open', openHandler);
|
||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
viewport.setRotation(-675);
|
viewport.setRotation(-675, true);
|
||||||
Util.assertRectangleEquals(
|
Util.assertRectangleEquals(
|
||||||
assert,
|
assert,
|
||||||
viewport.getHomeBoundsNoRotate(),
|
viewport.getHomeBoundsNoRotate(),
|
||||||
@ -267,7 +267,7 @@
|
|||||||
function openHandler() {
|
function openHandler() {
|
||||||
viewer.removeHandler('open', openHandler);
|
viewer.removeHandler('open', openHandler);
|
||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
viewport.setRotation(-675);
|
viewport.setRotation(-675, true);
|
||||||
Util.assertRectangleEquals(
|
Util.assertRectangleEquals(
|
||||||
assert,
|
assert,
|
||||||
viewport.getHomeBounds(),
|
viewport.getHomeBounds(),
|
||||||
@ -531,7 +531,7 @@
|
|||||||
var openHandler = function() {
|
var openHandler = function() {
|
||||||
viewer.removeHandler('open', openHandler);
|
viewer.removeHandler('open', openHandler);
|
||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
viewport.setRotation(45);
|
viewport.setRotation(45, true);
|
||||||
viewport.fitBounds(new OpenSeadragon.Rect(1, 1, 1, 1), true);
|
viewport.fitBounds(new OpenSeadragon.Rect(1, 1, 1, 1), true);
|
||||||
viewport.applyConstraints(true);
|
viewport.applyConstraints(true);
|
||||||
var bounds = viewport.getBounds();
|
var bounds = viewport.getBounds();
|
||||||
@ -555,7 +555,7 @@
|
|||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
|
|
||||||
viewport.setFlip(true);
|
viewport.setFlip(true);
|
||||||
viewport.setRotation(45);
|
viewport.setRotation(45, true);
|
||||||
|
|
||||||
viewport.fitBounds(new OpenSeadragon.Rect(1, 1, 1, 1), true);
|
viewport.fitBounds(new OpenSeadragon.Rect(1, 1, 1, 1), true);
|
||||||
viewport.applyConstraints(true);
|
viewport.applyConstraints(true);
|
||||||
@ -657,7 +657,7 @@
|
|||||||
var openHandler = function(event) {
|
var openHandler = function(event) {
|
||||||
viewer.removeHandler('open', openHandler);
|
viewer.removeHandler('open', openHandler);
|
||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
viewport.setRotation(45);
|
viewport.setRotation(45, true);
|
||||||
|
|
||||||
for(var i = 0; i < testRectsFitBounds.length; i++){
|
for(var i = 0; i < testRectsFitBounds.length; i++){
|
||||||
var rect = testRectsFitBounds[i];
|
var rect = testRectsFitBounds[i];
|
||||||
@ -1064,11 +1064,23 @@
|
|||||||
var viewport = viewer.viewport;
|
var viewport = viewer.viewport;
|
||||||
|
|
||||||
assert.propEqual(viewport.getRotation, 0, "Original rotation should be 0 degrees");
|
assert.propEqual(viewport.getRotation, 0, "Original rotation should be 0 degrees");
|
||||||
viewport.setRotation(90);
|
viewport.setRotation(90, true);
|
||||||
assert.propEqual(viewport.getRotation, 90, "Rotation should be 90 degrees");
|
assert.propEqual(viewport.getRotation, 90, "Rotation should be 90 degrees");
|
||||||
viewport.setRotation(-75);
|
viewport.setRotation(-75, true);
|
||||||
assert.propEqual(viewport.getRotation, -75, "Rotation should be -75 degrees");
|
assert.propEqual(viewport.getRotation, -75, "Rotation should be -75 degrees");
|
||||||
|
|
||||||
|
viewport.setRotation(0, true);
|
||||||
|
assert.strictEqual(viewport.getRotation(true), 0, 'viewport has default current rotation');
|
||||||
|
assert.strictEqual(viewport.getRotation(false), 0, 'viewport has default target rotation');
|
||||||
|
|
||||||
|
viewport.setRotation(400);
|
||||||
|
assert.strictEqual(viewport.getRotation(true), 0, 'current rotation is not changed');
|
||||||
|
assert.strictEqual(viewport.getRotation(false), 400, 'target rotation is set correctly');
|
||||||
|
|
||||||
|
viewport.setRotation(200, true);
|
||||||
|
assert.strictEqual(viewport.getRotation(true), 200, 'current rotation is set correctly');
|
||||||
|
assert.strictEqual(viewport.getRotation(false), 200, 'target rotation is set correctly');
|
||||||
|
|
||||||
done();
|
done();
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1085,9 +1097,9 @@
|
|||||||
viewport.setFlip(true);
|
viewport.setFlip(true);
|
||||||
|
|
||||||
assert.propEqual(viewport.getRotation, 0, "Original flipped rotation should be 0 degrees");
|
assert.propEqual(viewport.getRotation, 0, "Original flipped rotation should be 0 degrees");
|
||||||
viewport.setRotation(90);
|
viewport.setRotation(90, true);
|
||||||
assert.propEqual(viewport.getRotation, 90, "Flipped rotation should be 90 degrees");
|
assert.propEqual(viewport.getRotation, 90, "Flipped rotation should be 90 degrees");
|
||||||
viewport.setRotation(-75);
|
viewport.setRotation(-75, true);
|
||||||
assert.propEqual(viewport.getRotation, -75, "Flipped rotation should be -75 degrees");
|
assert.propEqual(viewport.getRotation, -75, "Flipped rotation should be -75 degrees");
|
||||||
|
|
||||||
done();
|
done();
|
||||||
|
Loading…
Reference in New Issue
Block a user