2013-05-01 08:46:16 +04:00
|
|
|
/*
|
2013-05-14 08:00:24 +04:00
|
|
|
* OpenSeadragon - Drawer
|
2013-05-01 08:46:16 +04:00
|
|
|
*
|
|
|
|
* Copyright (C) 2009 CodePlex Foundation
|
2013-05-14 07:32:09 +04:00
|
|
|
* Copyright (C) 2010-2013 OpenSeadragon contributors
|
2013-05-01 08:46:16 +04:00
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are
|
|
|
|
* met:
|
|
|
|
*
|
|
|
|
* - Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* - Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* - Neither the name of CodePlex Foundation nor the names of its
|
|
|
|
* contributors may be used to endorse or promote products derived from
|
|
|
|
* this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
|
|
|
* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
|
|
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
|
|
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2011-12-06 07:50:25 +04:00
|
|
|
(function( $ ){
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2013-01-31 01:51:37 +04:00
|
|
|
var DEVICE_SCREEN = $.getWindowSize(),
|
2012-01-18 03:30:41 +04:00
|
|
|
BROWSER = $.Browser.vendor,
|
|
|
|
BROWSER_VERSION = $.Browser.version,
|
2012-01-12 03:22:13 +04:00
|
|
|
|
|
|
|
SUBPIXEL_RENDERING = (
|
2012-01-18 03:30:41 +04:00
|
|
|
( BROWSER == $.BROWSERS.FIREFOX ) ||
|
|
|
|
( BROWSER == $.BROWSERS.OPERA ) ||
|
|
|
|
( BROWSER == $.BROWSERS.SAFARI && BROWSER_VERSION >= 4 ) ||
|
2012-04-03 11:08:27 +04:00
|
|
|
( BROWSER == $.BROWSERS.CHROME && BROWSER_VERSION >= 2 ) ||
|
|
|
|
( BROWSER == $.BROWSERS.IE && BROWSER_VERSION >= 9 )
|
2013-11-02 00:02:28 +04:00
|
|
|
);
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2012-03-01 17:38:15 +04:00
|
|
|
|
2012-01-25 23:14:02 +04:00
|
|
|
/**
|
2013-11-16 10:19:53 +04:00
|
|
|
* @class Drawer
|
2014-07-18 03:24:28 +04:00
|
|
|
* @classdesc Handles rendering of tiles for an {@link OpenSeadragon.Viewer}.
|
2013-11-25 20:48:44 +04:00
|
|
|
*
|
2013-11-16 10:19:53 +04:00
|
|
|
* @memberof OpenSeadragon
|
2012-02-01 00:59:09 +04:00
|
|
|
* @param {OpenSeadragon.TileSource} source - Reference to Viewer tile source.
|
|
|
|
* @param {OpenSeadragon.Viewport} viewport - Reference to Viewer viewport.
|
2013-11-25 20:48:44 +04:00
|
|
|
* @param {Element} element - Parent element.
|
2012-01-25 23:14:02 +04:00
|
|
|
*/
|
2012-03-01 17:38:15 +04:00
|
|
|
$.Drawer = function( options ) {
|
2014-08-07 00:48:18 +04:00
|
|
|
var self = this;
|
|
|
|
|
|
|
|
$.console.assert( options.viewer, "[Drawer] options.viewer is required" );
|
2013-06-19 21:33:25 +04:00
|
|
|
|
|
|
|
//backward compatibility for positional args while prefering more
|
2012-03-01 17:38:15 +04:00
|
|
|
//idiomatic javascript options object as the only argument
|
2012-03-16 19:36:28 +04:00
|
|
|
var args = arguments,
|
|
|
|
i;
|
|
|
|
|
2012-03-01 17:38:15 +04:00
|
|
|
if( !$.isPlainObject( options ) ){
|
|
|
|
options = {
|
2013-11-25 20:48:44 +04:00
|
|
|
source: args[ 0 ], // Reference to Viewer tile source.
|
|
|
|
viewport: args[ 1 ], // Reference to Viewer viewport.
|
|
|
|
element: args[ 2 ] // Parent element.
|
2012-03-01 17:38:15 +04:00
|
|
|
};
|
|
|
|
}
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
if ( options.source ) {
|
|
|
|
$.console.error( "[Drawer] options.source is no longer accepted; use TiledImage instead" );
|
2014-08-01 02:54:20 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
$.extend( true, this, {
|
2014-07-18 03:24:28 +04:00
|
|
|
|
2012-03-01 17:38:15 +04:00
|
|
|
//internal state properties
|
2013-05-16 10:49:29 +04:00
|
|
|
viewer: null,
|
2014-05-05 06:11:50 +04:00
|
|
|
imageLoader: new $.ImageLoader(),
|
2013-11-25 20:48:44 +04:00
|
|
|
tilesMatrix: {}, // A '3d' dictionary [level][x][y] --> Tile.
|
|
|
|
tilesLoaded: [], // An unordered list of Tiles with loaded images.
|
|
|
|
coverage: {}, // A '3d' dictionary [level][x][y] --> Boolean.
|
|
|
|
lastDrawn: [], // An unordered list of Tiles drawn last frame.
|
|
|
|
lastResetTime: 0, // Last time for which the drawer was reset.
|
|
|
|
midUpdate: false, // Is the drawer currently updating the viewport?
|
2014-08-01 02:54:20 +04:00
|
|
|
updateAgain: true, // Does the drawer need to update the viewport again?
|
2012-03-01 17:38:15 +04:00
|
|
|
|
2013-01-31 01:51:37 +04:00
|
|
|
|
2013-06-19 21:33:25 +04:00
|
|
|
//internal state / configurable settings
|
2014-01-31 00:38:37 +04:00
|
|
|
collectionOverlays: {}, // For collection mode. Here an overlay is actually a viewer.
|
2012-03-16 19:36:28 +04:00
|
|
|
|
2012-03-01 17:38:15 +04:00
|
|
|
//configurable settings
|
2013-12-09 18:26:36 +04:00
|
|
|
opacity: $.DEFAULT_SETTINGS.opacity,
|
2012-03-01 17:38:15 +04:00
|
|
|
maxImageCacheCount: $.DEFAULT_SETTINGS.maxImageCacheCount,
|
|
|
|
minZoomImageRatio: $.DEFAULT_SETTINGS.minZoomImageRatio,
|
|
|
|
wrapHorizontal: $.DEFAULT_SETTINGS.wrapHorizontal,
|
|
|
|
wrapVertical: $.DEFAULT_SETTINGS.wrapVertical,
|
|
|
|
immediateRender: $.DEFAULT_SETTINGS.immediateRender,
|
|
|
|
blendTime: $.DEFAULT_SETTINGS.blendTime,
|
|
|
|
alwaysBlend: $.DEFAULT_SETTINGS.alwaysBlend,
|
2013-01-24 08:00:11 +04:00
|
|
|
minPixelRatio: $.DEFAULT_SETTINGS.minPixelRatio,
|
2013-01-31 01:51:37 +04:00
|
|
|
debugMode: $.DEFAULT_SETTINGS.debugMode,
|
2014-03-20 21:30:46 +04:00
|
|
|
timeout: $.DEFAULT_SETTINGS.timeout,
|
|
|
|
crossOriginPolicy: $.DEFAULT_SETTINGS.crossOriginPolicy
|
2012-03-01 17:38:15 +04:00
|
|
|
|
|
|
|
}, options );
|
|
|
|
|
2013-11-02 00:02:28 +04:00
|
|
|
this.useCanvas = $.supportsCanvas && ( this.viewer ? this.viewer.useCanvas : true );
|
2013-11-25 20:48:44 +04:00
|
|
|
/**
|
|
|
|
* The parent element of this Drawer instance, passed in when the Drawer was created.
|
|
|
|
* The parent of {@link OpenSeadragon.Drawer#canvas}.
|
|
|
|
* @member {Element} container
|
|
|
|
* @memberof OpenSeadragon.Drawer#
|
|
|
|
*/
|
2012-03-01 17:38:15 +04:00
|
|
|
this.container = $.getElement( this.element );
|
2013-11-25 20:48:44 +04:00
|
|
|
/**
|
|
|
|
* A <canvas> element if the browser supports them, otherwise a <div> element.
|
|
|
|
* Child element of {@link OpenSeadragon.Drawer#container}.
|
|
|
|
* @member {Element} canvas
|
|
|
|
* @memberof OpenSeadragon.Drawer#
|
|
|
|
*/
|
2013-11-02 00:02:28 +04:00
|
|
|
this.canvas = $.makeNeutralElement( this.useCanvas ? "canvas" : "div" );
|
2013-11-25 20:48:44 +04:00
|
|
|
/**
|
|
|
|
* 2d drawing context for {@link OpenSeadragon.Drawer#canvas} if it's a <canvas> element, otherwise null.
|
|
|
|
* @member {Object} context
|
|
|
|
* @memberof OpenSeadragon.Drawer#
|
|
|
|
*/
|
2013-11-02 00:02:28 +04:00
|
|
|
this.context = this.useCanvas ? this.canvas.getContext( "2d" ) : null;
|
2014-07-22 22:13:22 +04:00
|
|
|
|
2013-11-25 20:48:44 +04:00
|
|
|
/**
|
|
|
|
* @member {Element} element
|
|
|
|
* @memberof OpenSeadragon.Drawer#
|
|
|
|
* @deprecated Alias for {@link OpenSeadragon.Drawer#container}.
|
|
|
|
*/
|
2012-03-01 17:38:15 +04:00
|
|
|
this.element = this.container;
|
|
|
|
|
2013-08-15 23:54:32 +04:00
|
|
|
// We force our container to ltr because our drawing math doesn't work in rtl.
|
|
|
|
// This issue only affects our canvas renderer, but we do it always for consistency.
|
|
|
|
// Note that this means overlays you want to be rtl need to be explicitly set to rtl.
|
|
|
|
this.container.dir = 'ltr';
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2012-02-01 00:59:09 +04:00
|
|
|
this.canvas.style.width = "100%";
|
|
|
|
this.canvas.style.height = "100%";
|
|
|
|
this.canvas.style.position = "absolute";
|
2013-12-09 18:26:36 +04:00
|
|
|
$.setElementOpacity( this.canvas, this.opacity, true );
|
2013-06-19 21:33:25 +04:00
|
|
|
|
2012-01-12 03:22:13 +04:00
|
|
|
// explicit left-align
|
|
|
|
this.container.style.textAlign = "left";
|
2012-02-01 00:59:09 +04:00
|
|
|
this.container.appendChild( this.canvas );
|
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
// We need a callback to give image manipulation a chance to happen
|
|
|
|
this._drawingHandler = function(args) {
|
|
|
|
if (self.viewer) {
|
|
|
|
/**
|
|
|
|
* This event is fired just before the tile is drawn giving the application a chance to alter the image.
|
|
|
|
*
|
|
|
|
* NOTE: This event is only fired when the drawer is using a <canvas>.
|
|
|
|
*
|
|
|
|
* @event tile-drawing
|
|
|
|
* @memberof OpenSeadragon.Viewer
|
|
|
|
* @type {object}
|
|
|
|
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
|
|
|
|
* @property {OpenSeadragon.Tile} tile
|
|
|
|
* @property {?Object} userData - 'context', 'tile' and 'rendered'.
|
|
|
|
*/
|
|
|
|
self.viewer.raiseEvent('tile-drawing', args);
|
|
|
|
}
|
|
|
|
};
|
2011-12-06 07:50:25 +04:00
|
|
|
};
|
|
|
|
|
2013-11-16 10:19:53 +04:00
|
|
|
$.Drawer.prototype = /** @lends OpenSeadragon.Drawer.prototype */{
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
|
|
|
* Adds an html element as an overlay to the current viewport. Useful for
|
|
|
|
* highlighting words or areas of interest on an image or other zoomable
|
|
|
|
* interface.
|
|
|
|
* @method
|
2013-07-31 11:01:48 +04:00
|
|
|
* @param {Element|String|Object} element - A reference to an element or an id for
|
|
|
|
* the element which will overlayed. Or an Object specifying the configuration for the overlay
|
2013-06-19 21:33:25 +04:00
|
|
|
* @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
|
2012-02-01 06:01:37 +04:00
|
|
|
* rectangle which will be overlayed.
|
2013-06-19 21:33:25 +04:00
|
|
|
* @param {OpenSeadragon.OverlayPlacement} placement - The position of the
|
|
|
|
* viewport which the location coordinates will be treated as relative
|
|
|
|
* to.
|
2014-03-01 17:32:38 +04:00
|
|
|
* @param {function} onDraw - If supplied the callback is called when the overlay
|
2013-07-31 11:01:48 +04:00
|
|
|
* needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.
|
|
|
|
* It is passed position, size and element.
|
2013-11-22 00:19:07 +04:00
|
|
|
* @fires OpenSeadragon.Viewer.event:add-overlay
|
2014-03-01 17:32:38 +04:00
|
|
|
* @deprecated - use {@link OpenSeadragon.Viewer#addOverlay} instead.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2013-07-31 11:01:48 +04:00
|
|
|
addOverlay: function( element, location, placement, onDraw ) {
|
2014-03-01 17:32:38 +04:00
|
|
|
$.console.error("drawer.addOverlay is deprecated. Use viewer.addOverlay instead.");
|
|
|
|
this.viewer.addOverlay( element, location, placement, onDraw );
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2011-12-06 07:50:25 +04:00
|
|
|
},
|
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
2013-06-19 21:33:25 +04:00
|
|
|
* Updates the overlay represented by the reference to the element or
|
2012-02-01 06:01:37 +04:00
|
|
|
* element id moving it to the new location, relative to the new placement.
|
|
|
|
* @method
|
2013-06-19 21:33:25 +04:00
|
|
|
* @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
|
2012-02-01 06:01:37 +04:00
|
|
|
* rectangle which will be overlayed.
|
2013-06-19 21:33:25 +04:00
|
|
|
* @param {OpenSeadragon.OverlayPlacement} placement - The position of the
|
|
|
|
* viewport which the location coordinates will be treated as relative
|
|
|
|
* to.
|
2013-02-14 04:44:23 +04:00
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
2013-11-22 00:19:07 +04:00
|
|
|
* @fires OpenSeadragon.Viewer.event:update-overlay
|
2014-03-01 17:32:38 +04:00
|
|
|
* @deprecated - use {@link OpenSeadragon.Viewer#updateOverlay} instead.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
updateOverlay: function( element, location, placement ) {
|
2014-03-01 17:32:38 +04:00
|
|
|
$.console.error("drawer.updateOverlay is deprecated. Use viewer.updateOverlay instead.");
|
|
|
|
this.viewer.updateOverlay( element, location, placement );
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2012-02-01 00:59:09 +04:00
|
|
|
},
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
2013-06-19 21:33:25 +04:00
|
|
|
* Removes and overlay identified by the reference element or element id
|
2012-02-01 06:01:37 +04:00
|
|
|
* and schedules and update.
|
|
|
|
* @method
|
2013-06-19 21:33:25 +04:00
|
|
|
* @param {Element|String} element - A reference to the element or an
|
2012-02-01 06:01:37 +04:00
|
|
|
* element id which represent the ovelay content to be removed.
|
2013-02-14 04:44:23 +04:00
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
2013-11-22 00:19:07 +04:00
|
|
|
* @fires OpenSeadragon.Viewer.event:remove-overlay
|
2014-03-01 17:32:38 +04:00
|
|
|
* @deprecated - use {@link OpenSeadragon.Viewer#removeOverlay} instead.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
removeOverlay: function( element ) {
|
2014-03-01 17:32:38 +04:00
|
|
|
$.console.error("drawer.removeOverlay is deprecated. Use viewer.removeOverlay instead.");
|
2014-03-26 23:28:35 +04:00
|
|
|
this.viewer.removeOverlay( element );
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2011-12-06 07:50:25 +04:00
|
|
|
},
|
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
|
|
|
* Removes all currently configured Overlays from this Drawer and schedules
|
|
|
|
* and update.
|
|
|
|
* @method
|
2013-02-14 04:44:23 +04:00
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
2013-11-22 00:19:07 +04:00
|
|
|
* @fires OpenSeadragon.Viewer.event:clear-overlay
|
2014-03-01 17:32:38 +04:00
|
|
|
* @deprecated - use {@link OpenSeadragon.Viewer#clearOverlays} instead.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
clearOverlays: function() {
|
2014-03-01 17:32:38 +04:00
|
|
|
$.console.error("drawer.clearOverlays is deprecated. Use viewer.clearOverlays instead.");
|
|
|
|
this.viewer.clearOverlays();
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2012-02-01 00:59:09 +04:00
|
|
|
},
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2013-12-09 18:26:36 +04:00
|
|
|
/**
|
|
|
|
* Set the opacity of the drawer.
|
|
|
|
* @method
|
|
|
|
* @param {Number} opacity
|
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
|
|
|
*/
|
|
|
|
setOpacity: function( opacity ) {
|
|
|
|
this.opacity = opacity;
|
|
|
|
$.setElementOpacity( this.canvas, this.opacity, true );
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get the opacity of the drawer.
|
|
|
|
* @method
|
|
|
|
* @returns {Number}
|
|
|
|
*/
|
|
|
|
getOpacity: function() {
|
|
|
|
return this.opacity;
|
|
|
|
},
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
2013-06-19 21:33:25 +04:00
|
|
|
* Returns whether the Drawer is scheduled for an update at the
|
2012-02-01 06:01:37 +04:00
|
|
|
* soonest possible opportunity.
|
|
|
|
* @method
|
2013-06-19 21:33:25 +04:00
|
|
|
* @returns {Boolean} - Whether the Drawer is scheduled for an update at the
|
2012-02-01 06:01:37 +04:00
|
|
|
* soonest possible opportunity.
|
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
needsUpdate: function() {
|
|
|
|
return this.updateAgain;
|
|
|
|
},
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
|
|
|
* Returns the total number of tiles that have been loaded by this Drawer.
|
|
|
|
* @method
|
2013-06-19 21:33:25 +04:00
|
|
|
* @returns {Number} - The total number of tiles that have been loaded by
|
2012-02-01 06:01:37 +04:00
|
|
|
* this Drawer.
|
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
numTilesLoaded: function() {
|
|
|
|
return this.tilesLoaded.length;
|
|
|
|
},
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
2013-06-19 21:33:25 +04:00
|
|
|
* Clears all tiles and triggers an update on the next call to
|
2012-02-01 06:01:37 +04:00
|
|
|
* Drawer.prototype.update().
|
|
|
|
* @method
|
2013-02-14 04:44:23 +04:00
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
reset: function() {
|
2013-06-21 00:15:04 +04:00
|
|
|
this.lastResetTime = $.now();
|
2012-01-12 03:22:13 +04:00
|
|
|
this.updateAgain = true;
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2011-12-06 07:50:25 +04:00
|
|
|
},
|
|
|
|
|
2012-02-01 06:01:37 +04:00
|
|
|
/**
|
|
|
|
* Forces the Drawer to update.
|
|
|
|
* @method
|
2013-02-14 04:44:23 +04:00
|
|
|
* @return {OpenSeadragon.Drawer} Chainable.
|
2012-02-01 06:01:37 +04:00
|
|
|
*/
|
2012-02-01 00:59:09 +04:00
|
|
|
update: function() {
|
|
|
|
//this.profiler.beginUpdate();
|
|
|
|
this.midUpdate = true;
|
|
|
|
this.midUpdate = false;
|
|
|
|
//this.profiler.endUpdate();
|
2013-02-14 04:44:23 +04:00
|
|
|
return this;
|
2011-12-06 07:50:25 +04:00
|
|
|
},
|
|
|
|
|
2013-11-25 20:48:44 +04:00
|
|
|
/**
|
|
|
|
* Returns whether rotation is supported or not.
|
|
|
|
* @method
|
|
|
|
* @return {Boolean} True if rotation is supported.
|
|
|
|
*/
|
2013-08-16 21:32:21 +04:00
|
|
|
canRotate: function() {
|
2013-11-02 00:02:28 +04:00
|
|
|
return this.useCanvas;
|
2014-06-18 04:26:10 +04:00
|
|
|
},
|
2014-06-18 21:35:23 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Destroy the drawer (unload current loaded tiles)
|
|
|
|
* @method
|
|
|
|
* @return null
|
|
|
|
*/
|
|
|
|
destroy: function() {
|
|
|
|
//unload current loaded tiles (=empty TILE_CACHE)
|
|
|
|
for ( var i = 0; i < this.tilesLoaded.length; ++i ) {
|
|
|
|
this.tilesLoaded[i].unload();
|
|
|
|
}
|
|
|
|
|
|
|
|
//force unloading of current canvas (1x1 will be gc later, trick not necessarily needed)
|
|
|
|
this.canvas.width = 1;
|
|
|
|
this.canvas.height = 1;
|
2014-08-07 00:48:18 +04:00
|
|
|
},
|
2011-12-06 07:50:25 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
clear: function() {
|
|
|
|
this.canvas.innerHTML = "";
|
|
|
|
if ( this.useCanvas ) {
|
|
|
|
var viewportSize = this.viewport.getContainerSize();
|
|
|
|
if( this.canvas.width != viewportSize.x ||
|
|
|
|
this.canvas.height != viewportSize.y ) {
|
|
|
|
this.canvas.width = viewportSize.x;
|
|
|
|
this.canvas.height = viewportSize.y;
|
2012-02-01 00:59:09 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.clearRect( 0, 0, viewportSize.x, viewportSize.y );
|
2012-02-01 00:59:09 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
},
|
2011-12-28 03:17:24 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
drawTile: function( tile ) {
|
|
|
|
if ( this.useCanvas ) {
|
|
|
|
// TODO do this in a more performant way
|
|
|
|
// specifically, don't save,rotate,restore every time we draw a tile
|
|
|
|
if( this.viewport.degrees !== 0 ) {
|
|
|
|
this._offsetForRotation( tile, this.viewport.degrees );
|
|
|
|
tile.drawCanvas( this.context, this._drawingHandler );
|
|
|
|
this._restoreRotationChanges( tile );
|
2013-01-24 08:00:11 +04:00
|
|
|
} else {
|
2014-08-07 00:48:18 +04:00
|
|
|
tile.drawCanvas( this.context, this._drawingHandler );
|
2013-01-24 08:00:11 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
} else {
|
|
|
|
tile.drawHTML( this.canvas );
|
2012-02-01 00:59:09 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
},
|
2013-02-02 00:18:53 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
drawDebugInfo: function( tile, count, i ){
|
|
|
|
if ( this.useCanvas ) {
|
|
|
|
this.context.save();
|
|
|
|
this.context.lineWidth = 2;
|
|
|
|
this.context.font = 'small-caps bold 13px ariel';
|
|
|
|
this.context.strokeStyle = this.debugGridColor;
|
|
|
|
this.context.fillStyle = this.debugGridColor;
|
2013-01-24 08:00:11 +04:00
|
|
|
|
2014-08-08 22:38:13 +04:00
|
|
|
this._offsetForRotation( tile, this.canvas, this.context, this.viewport.degrees );
|
2013-02-02 00:18:53 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.strokeRect(
|
|
|
|
tile.position.x,
|
|
|
|
tile.position.y,
|
|
|
|
tile.size.x,
|
|
|
|
tile.size.y
|
|
|
|
);
|
2013-02-02 00:18:53 +04:00
|
|
|
|
2014-08-08 22:38:13 +04:00
|
|
|
var tileCenterX = tile.position.x + (tile.size.x / 2);
|
|
|
|
var tileCenterY = tile.position.y + (tile.size.y / 2);
|
|
|
|
|
|
|
|
// Rotate the text the right way around.
|
|
|
|
this.context.translate( tileCenterX, tileCenterY );
|
|
|
|
this.context.rotate( Math.PI / 180 * -this.viewport.degrees );
|
|
|
|
this.context.translate( -tileCenterX, -tileCenterY );
|
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
if( tile.x === 0 && tile.y === 0 ){
|
|
|
|
this.context.fillText(
|
|
|
|
"Zoom: " + this.viewport.getZoom(),
|
|
|
|
tile.position.x,
|
|
|
|
tile.position.y - 30
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Pan: " + this.viewport.getBounds().toString(),
|
|
|
|
tile.position.x,
|
|
|
|
tile.position.y - 20
|
|
|
|
);
|
2013-02-02 00:18:53 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.fillText(
|
|
|
|
"Level: " + tile.level,
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 20
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Column: " + tile.x,
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 30
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Row: " + tile.y,
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 40
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Order: " + i + " of " + count,
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 50
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Size: " + tile.size.toString(),
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 60
|
|
|
|
);
|
|
|
|
this.context.fillText(
|
|
|
|
"Position: " + tile.position.toString(),
|
|
|
|
tile.position.x + 10,
|
|
|
|
tile.position.y + 70
|
|
|
|
);
|
2014-08-08 22:38:13 +04:00
|
|
|
this._restoreRotationChanges( tile, this.canvas, this.context );
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.restore();
|
2013-02-02 00:18:53 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
},
|
2013-02-14 04:44:23 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
_offsetForRotation: function( tile, degrees ){
|
|
|
|
var cx = this.canvas.width / 2,
|
|
|
|
cy = this.canvas.height / 2,
|
|
|
|
px = tile.position.x - cx,
|
|
|
|
py = tile.position.y - cy;
|
2013-08-14 01:39:22 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.save();
|
2013-08-14 01:39:22 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.translate(cx, cy);
|
|
|
|
this.context.rotate( Math.PI / 180 * degrees);
|
|
|
|
tile.position.x = px;
|
|
|
|
tile.position.y = py;
|
|
|
|
},
|
2013-08-14 01:39:22 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
_restoreRotationChanges: function( tile ){
|
|
|
|
var cx = this.canvas.width / 2,
|
|
|
|
cy = this.canvas.height / 2,
|
|
|
|
px = tile.position.x + cx,
|
|
|
|
py = tile.position.y + cy;
|
2013-01-24 08:00:11 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
tile.position.x = px;
|
|
|
|
tile.position.y = py;
|
2013-01-24 08:00:11 +04:00
|
|
|
|
2014-08-07 00:48:18 +04:00
|
|
|
this.context.restore();
|
2012-02-01 00:59:09 +04:00
|
|
|
}
|
2014-08-07 00:48:18 +04:00
|
|
|
};
|
2013-01-24 08:00:11 +04:00
|
|
|
|
2011-12-06 07:50:25 +04:00
|
|
|
}( OpenSeadragon ));
|