123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- // OpenSeadragon HTML Overlay plugin 0.0.2
- (function() {
- var $ = window.OpenSeadragon;
- if (!$) {
- $ = require('openseadragon');
- if (!$) {
- throw new Error('OpenSeadragon is missing.');
- }
- }
- // ----------
- $.Viewer.prototype.htmlOverlay = function (options) {
- options = options || {};
- if (this._htmlOverlayInfo) {
- return this._htmlOverlayInfo;
- }
- this._htmlOverlayInfo = new Overlay(this);
- if (options.scale) {
- this._htmlOverlayInfo._scale = options.scale; // arbitrary scale for created overlay element
- }
- else {
- this._htmlOverlayInfo._scale = 1;
- }
- return this._htmlOverlayInfo;
- };
- // ----------
- var Overlay = function(viewer) {
- var self = this;
- this._viewer = viewer;
- this._element = document.createElement('div');
- this._element.style.position = 'absolute';
- this._element.style.left = 0;
- this._element.style.top = 0;
- this._element.style.width = '100%';
- this._element.style.height = '100%';
- this._element.style.transformOrigin = '0 0';
- this._viewer.canvas.appendChild(this._element);
- // OpenSeadragon blocks the normal click event action, so we have to reestablish it for links here
- new OpenSeadragon.MouseTracker({
- element: this._element,
- clickHandler: function(event) {
- var clickTarget = event.originalEvent.target;
- if (/a/i.test(clickTarget.nodeName)) {
- if (clickTarget.target === '_blank') {
- window.open(clickTarget.href);
- } else {
- location.href = clickTarget.href;
- }
- }
- }
- });
- this._viewer.addHandler('animation', function() {
- self.resize();
- });
- this._viewer.addHandler('open', function() {
- self.resize();
- });
- this._viewer.addHandler('rotate', function(evt) {
- self.resize();
- });
- this._viewer.addHandler('resize', function() {
- self.resize();
- });
- this.resize();
- };
- // ----------
- Overlay.prototype = {
- // ----------
- element: function() {
- return this._element;
- },
- // ----------
- resize: function() {
- var p = this._viewer.viewport.pixelFromPoint(new $.Point(0, 0), true);
- var zoom = this._viewer.viewport.getZoom(true);
- var rotation = this._viewer.viewport.getRotation();
- // TODO: Expose an accessor for _containerInnerSize in the OSD API so we don't have to use the private variable.
- var scale = this._viewer.viewport._containerInnerSize.x * zoom / this._scale;
- this._element.style.transform =
- 'translate(' + p.x + 'px,' + p.y + 'px) scale(' + scale + ') rotate(' + rotation + ')';
- },
- // ----------
- onClick: function(element, handler) {
- // TODO: Fast click for mobile browsers
- new $.MouseTracker({
- element: element,
- clickHandler: handler
- }).setTracking(true);
- }
- };
- })();
|