openseadragon 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +45 -0
- data/Gemfile +3 -10
- data/app/assets/config/openseadragon-assets.js +1 -0
- data/lib/generators/openseadragon/install_generator.rb +6 -2
- data/lib/openseadragon/engine.rb +1 -1
- data/lib/openseadragon/version.rb +1 -1
- data/openseadragon.gemspec +1 -1
- data/vendor/assets/images/openseadragon/flip_grouphover.png +0 -0
- data/vendor/assets/images/openseadragon/flip_hover.png +0 -0
- data/vendor/assets/images/openseadragon/flip_pressed.png +0 -0
- data/vendor/assets/images/openseadragon/flip_rest.png +0 -0
- data/vendor/assets/javascripts/openseadragon/openseadragon.js +1026 -288
- data/vendor/assets/javascripts/openseadragon/openseadragon.js.map +1 -1
- metadata +16 -12
- data/.travis.yml +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 67814ae82d0be47642e41c48f3d7b5bad24091a61cd4f64cf7ff1051058c12ff
|
4
|
+
data.tar.gz: 8ad5f8638aeb244c6c16edfc0e3c8fa929301b6e982e241ab27b46d148abe91f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6c06d4052b7ef3b3f02b97ed260afe69e94910c6e19161bddbb5756d13a929356059843c24fd8d6c782298aefdb94f87c5ad7f89f5d02ba1fab43c206022cefd
|
7
|
+
data.tar.gz: a5d2d03f9472d3c6333c5ebdd390a4157e5d6f6f0eea10e66e1c9c03d43adf628284ca3043206548178df39c7b28b487acb0a8d4227fe6572a2d5abeb9405ee3
|
@@ -0,0 +1,45 @@
|
|
1
|
+
name: CI
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ master ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ master ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
runs-on: ubuntu-latest
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
rails_version: [6.1.1, 6.0.3.2]
|
15
|
+
ruby: [2.7, 3.0]
|
16
|
+
env:
|
17
|
+
RAILS_VERSION: ${{ matrix.rails_version }}
|
18
|
+
steps:
|
19
|
+
- uses: actions/checkout@v2
|
20
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
21
|
+
uses: ruby/setup-ruby@v1
|
22
|
+
with:
|
23
|
+
ruby-version: ${{ matrix.ruby }}
|
24
|
+
- name: Install dependencies with Rails ${{ matrix.rails_version }}
|
25
|
+
run: bundle install
|
26
|
+
- name: Run tests
|
27
|
+
run: bundle exec rake
|
28
|
+
test_rails52:
|
29
|
+
runs-on: ubuntu-latest
|
30
|
+
strategy:
|
31
|
+
matrix:
|
32
|
+
rails_version: [5.2.4.4]
|
33
|
+
ruby: [2.7]
|
34
|
+
env:
|
35
|
+
RAILS_VERSION: ${{ matrix.rails_version }}
|
36
|
+
steps:
|
37
|
+
- uses: actions/checkout@v2
|
38
|
+
- name: Set up Ruby ${{ matrix.ruby }}
|
39
|
+
uses: ruby/setup-ruby@v1
|
40
|
+
with:
|
41
|
+
ruby-version: ${{ matrix.ruby }}
|
42
|
+
- name: Install dependencies with Rails ${{ matrix.rails_version }}
|
43
|
+
run: bundle install
|
44
|
+
- name: Run tests
|
45
|
+
run: bundle exec rake
|
data/Gemfile
CHANGED
@@ -21,19 +21,12 @@ else
|
|
21
21
|
if ENV['RAILS_VERSION']
|
22
22
|
if ENV['RAILS_VERSION'] == 'edge'
|
23
23
|
gem 'rails', github: 'rails/rails'
|
24
|
-
ENV['ENGINE_CART_RAILS_OPTIONS']=
|
24
|
+
ENV['ENGINE_CART_RAILS_OPTIONS'] = '--edge --skip-turbolinks'
|
25
|
+
elsif ENV['RAILS_VERSION'] < '6'
|
26
|
+
gem 'sprockets', '< 4'
|
25
27
|
else
|
26
28
|
gem 'rails', ENV['RAILS_VERSION']
|
27
29
|
end
|
28
30
|
end
|
29
|
-
|
30
|
-
if ENV['RAILS_VERSION'].nil? || ENV['RAILS_VERSION'] =~ /^4.2/
|
31
|
-
gem 'responders', "~> 2.0"
|
32
|
-
gem 'sass-rails', ">= 5.0"
|
33
|
-
elsif ENV['RAILS_VERSION'] =~ /^5.0/ || ENV['RAILS_VERSION'] == 'edge'
|
34
|
-
# nop
|
35
|
-
else
|
36
|
-
gem 'sass-rails', "< 5.0"
|
37
|
-
end
|
38
31
|
end
|
39
32
|
# END ENGINE_CART BLOCK
|
@@ -0,0 +1 @@
|
|
1
|
+
//= link_tree ../../../vendor/assets/images
|
@@ -3,10 +3,14 @@ require 'rails/generators'
|
|
3
3
|
module Openseadragon
|
4
4
|
class Install < Rails::Generators::Base
|
5
5
|
source_root File.expand_path('../templates', __FILE__)
|
6
|
-
|
6
|
+
|
7
7
|
def assets
|
8
8
|
copy_file "openseadragon.css", "app/assets/stylesheets/openseadragon.css"
|
9
9
|
copy_file "openseadragon.js", "app/assets/javascripts/openseadragon.js"
|
10
|
+
|
11
|
+
if File.exist? 'app/assets/config/manifest.js'
|
12
|
+
append_to_file 'app/assets/config/manifest.js', "\n//= link openseadragon-assets\n"
|
13
|
+
end
|
10
14
|
end
|
11
15
|
|
12
16
|
def inject_helper
|
@@ -15,4 +19,4 @@ module Openseadragon
|
|
15
19
|
end
|
16
20
|
end
|
17
21
|
end
|
18
|
-
end
|
22
|
+
end
|
data/lib/openseadragon/engine.rb
CHANGED
data/openseadragon.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_development_dependency "bundler"
|
21
|
+
spec.add_development_dependency "bundler"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
spec.add_development_dependency "engine_cart"
|
24
24
|
spec.add_development_dependency "rspec-rails", '~> 3.1'
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -1,6 +1,6 @@
|
|
1
|
-
//! openseadragon 2.
|
2
|
-
//! Built on
|
3
|
-
//! Git commit: v2.
|
1
|
+
//! openseadragon 2.4.2
|
2
|
+
//! Built on 2020-03-05
|
3
|
+
//! Git commit: v2.4.2-0-c450749
|
4
4
|
//! http://openseadragon.github.io
|
5
5
|
//! License: http://openseadragon.github.io/license/
|
6
6
|
|
@@ -90,7 +90,7 @@
|
|
90
90
|
|
91
91
|
/**
|
92
92
|
* @namespace OpenSeadragon
|
93
|
-
* @version openseadragon 2.
|
93
|
+
* @version openseadragon 2.4.2
|
94
94
|
* @classdesc The root namespace for OpenSeadragon. All utility methods
|
95
95
|
* and classes are defined on or below this namespace.
|
96
96
|
*
|
@@ -165,7 +165,9 @@
|
|
165
165
|
* @property {Boolean} [debugMode=false]
|
166
166
|
* TODO: provide an in-screen panel providing event detail feedback.
|
167
167
|
*
|
168
|
-
* @property {String} [debugGridColor='#437AB2']
|
168
|
+
* @property {String} [debugGridColor=['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']]
|
169
|
+
* The colors of grids in debug mode. Each tiled image's grid uses a consecutive color.
|
170
|
+
* If there are more tiled images than provided colors, the color vector is recycled.
|
169
171
|
*
|
170
172
|
* @property {Number} [blendTime=0]
|
171
173
|
* Specifies the duration of animation as higher or lower level tiles are
|
@@ -202,6 +204,11 @@
|
|
202
204
|
* 'destination-over', 'destination-atop', 'destination-in',
|
203
205
|
* 'destination-out', 'lighter', 'copy' or 'xor'
|
204
206
|
*
|
207
|
+
* @property {Boolean} [imageSmoothingEnabled=true]
|
208
|
+
* Image smoothing for canvas rendering (only if canvas is used). Note: Ignored
|
209
|
+
* by some (especially older) browsers which do not support this canvas property.
|
210
|
+
* This property can be changed in {@link Viewer.Drawer.setImageSmoothingEnabled}.
|
211
|
+
*
|
205
212
|
* @property {String|CanvasGradient|CanvasPattern|Function} [placeholderFillStyle=null]
|
206
213
|
* Draws a colored rectangle behind the tile if it is not loaded yet.
|
207
214
|
* You can pass a CSS color value like "#FF8800".
|
@@ -210,6 +217,9 @@
|
|
210
217
|
* @property {Number} [degrees=0]
|
211
218
|
* Initial rotation.
|
212
219
|
*
|
220
|
+
* @property {Boolean} [flipped=false]
|
221
|
+
* Initial flip state.
|
222
|
+
*
|
213
223
|
* @property {Number} [minZoomLevel=null]
|
214
224
|
*
|
215
225
|
* @property {Number} [maxZoomLevel=null]
|
@@ -243,7 +253,7 @@
|
|
243
253
|
* The maximum ratio to allow a zoom-in to affect the highest level pixel
|
244
254
|
* ratio. This can be set to Infinity to allow 'infinite' zooming into the
|
245
255
|
* image though it is less effective visually if the HTML5 Canvas is not
|
246
|
-
*
|
256
|
+
* available on the viewing device.
|
247
257
|
*
|
248
258
|
* @property {Number} [smoothTileEdgesMinZoom=1.1]
|
249
259
|
* A zoom percentage ( where 1 is 100% ) of the highest resolution level.
|
@@ -267,9 +277,15 @@
|
|
267
277
|
* events between different devices, causing the faster devices to slow down enough to make the zoom control
|
268
278
|
* more manageable.
|
269
279
|
*
|
280
|
+
* @property {Number} [rotationIncrement=90]
|
281
|
+
* The number of degrees to rotate right or left when the rotate buttons or keyboard shortcuts are activated.
|
282
|
+
*
|
270
283
|
* @property {Number} [pixelsPerWheelLine=40]
|
271
284
|
* For pixel-resolution scrolling devices, the number of pixels equal to one scroll line.
|
272
285
|
*
|
286
|
+
* @property {Number} [pixelsPerArrowPress=40]
|
287
|
+
* The number of pixels viewport moves when an arrow key is pressed.
|
288
|
+
*
|
273
289
|
* @property {Number} [visibilityRatio=0.5]
|
274
290
|
* The percentage ( as a number from 0 to 1 ) of the source image which
|
275
291
|
* must be kept within the viewport. If the image is dragged beyond that
|
@@ -315,6 +331,8 @@
|
|
315
331
|
* @property {Boolean} [gestureSettingsMouse.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true
|
316
332
|
* then clickToZoom should be set to false to prevent multiple zooms.
|
317
333
|
* @property {Boolean} [gestureSettingsMouse.pinchToZoom=false] - Zoom on pinch gesture
|
334
|
+
* @property {Boolean} [gestureSettingsMouse.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
|
335
|
+
* the zoom is centered at the canvas center.
|
318
336
|
* @property {Boolean} [gestureSettingsMouse.flickEnabled=false] - Enable flick gesture
|
319
337
|
* @property {Number} [gestureSettingsMouse.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
|
320
338
|
* @property {Number} [gestureSettingsMouse.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
|
@@ -327,6 +345,8 @@
|
|
327
345
|
* @property {Boolean} [gestureSettingsTouch.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true
|
328
346
|
* then clickToZoom should be set to false to prevent multiple zooms.
|
329
347
|
* @property {Boolean} [gestureSettingsTouch.pinchToZoom=true] - Zoom on pinch gesture
|
348
|
+
* @property {Boolean} [gestureSettingsTouch.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
|
349
|
+
* the zoom is centered at the canvas center.
|
330
350
|
* @property {Boolean} [gestureSettingsTouch.flickEnabled=true] - Enable flick gesture
|
331
351
|
* @property {Number} [gestureSettingsTouch.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
|
332
352
|
* @property {Number} [gestureSettingsTouch.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
|
@@ -339,6 +359,8 @@
|
|
339
359
|
* @property {Boolean} [gestureSettingsPen.dblClickToZoom=false] - Zoom on double-click gesture. Note: If set to true
|
340
360
|
* then clickToZoom should be set to false to prevent multiple zooms.
|
341
361
|
* @property {Boolean} [gestureSettingsPen.pinchToZoom=false] - Zoom on pinch gesture
|
362
|
+
* @property {Boolean} [gestureSettingsPen.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
|
363
|
+
* the zoom is centered at the canvas center.
|
342
364
|
* @property {Boolean} [gestureSettingsPen.flickEnabled=false] - Enable flick gesture
|
343
365
|
* @property {Number} [gestureSettingsPen.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
|
344
366
|
* @property {Number} [gestureSettingsPen.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
|
@@ -351,6 +373,8 @@
|
|
351
373
|
* @property {Boolean} [gestureSettingsUnknown.dblClickToZoom=true] - Zoom on double-click gesture. Note: If set to true
|
352
374
|
* then clickToZoom should be set to false to prevent multiple zooms.
|
353
375
|
* @property {Boolean} [gestureSettingsUnknown.pinchToZoom=true] - Zoom on pinch gesture
|
376
|
+
* @property {Boolean} [gestureSettingsUnknown.zoomToRefPoint=true] - If zoomToRefPoint is true, the zoom is centered at the pointer position. Otherwise,
|
377
|
+
* the zoom is centered at the canvas center.
|
354
378
|
* @property {Boolean} [gestureSettingsUnknown.flickEnabled=true] - Enable flick gesture
|
355
379
|
* @property {Number} [gestureSettingsUnknown.flickMinSpeed=120] - If flickEnabled is true, the minimum speed to initiate a flick gesture (pixels-per-second)
|
356
380
|
* @property {Number} [gestureSettingsUnknown.flickMomentum=0.25] - If flickEnabled is true, the momentum factor for the flick gesture
|
@@ -409,9 +433,21 @@
|
|
409
433
|
* @property {Boolean} [navigatorRotate=true]
|
410
434
|
* If true, the navigator will be rotated together with the viewer.
|
411
435
|
*
|
436
|
+
* @property {String} [navigatorBackground='#000']
|
437
|
+
* Specifies the background color of the navigator minimap
|
438
|
+
*
|
439
|
+
* @property {Number} [navigatorOpacity=0.8]
|
440
|
+
* Specifies the opacity of the navigator minimap.
|
441
|
+
*
|
442
|
+
* @property {String} [navigatorBorderColor='#555']
|
443
|
+
* Specifies the border color of the navigator minimap
|
444
|
+
*
|
445
|
+
* @property {String} [navigatorDisplayRegionColor='#900']
|
446
|
+
* Specifies the border color of the display region rectangle of the navigator minimap
|
447
|
+
*
|
412
448
|
* @property {Number} [controlsFadeDelay=2000]
|
413
449
|
* The number of milliseconds to wait once the user has stopped interacting
|
414
|
-
* with the interface before
|
450
|
+
* with the interface before beginning to fade the controls. Assumes
|
415
451
|
* showNavigationControl and autoHideControls are both true.
|
416
452
|
*
|
417
453
|
* @property {Number} [controlsFadeLength=1500]
|
@@ -429,7 +465,7 @@
|
|
429
465
|
* @property {Number} [minPixelRatio=0.5]
|
430
466
|
* The higher the minPixelRatio, the lower the quality of the image that
|
431
467
|
* is considered sufficient to stop rendering a given zoom level. For
|
432
|
-
* example, if you are targeting mobile devices with less
|
468
|
+
* example, if you are targeting mobile devices with less bandwidth you may
|
433
469
|
* try setting this to 1.5 or higher.
|
434
470
|
*
|
435
471
|
* @property {Boolean} [mouseNavEnabled=true]
|
@@ -471,6 +507,10 @@
|
|
471
507
|
* Note: {@link OpenSeadragon.Options.showNavigationControl} is overriding
|
472
508
|
* this setting when set to false.
|
473
509
|
*
|
510
|
+
* @property {Boolean} [showFlipControl=false]
|
511
|
+
* If true then the flip controls will be displayed as part of the
|
512
|
+
* standard controls.
|
513
|
+
*
|
474
514
|
* @property {Boolean} [showSequenceControl=true]
|
475
515
|
* If sequenceMode is true, then provide buttons for navigating forward and
|
476
516
|
* backward through the images.
|
@@ -681,6 +721,12 @@
|
|
681
721
|
* @property {String} rotateright.HOVER
|
682
722
|
* @property {String} rotateright.DOWN
|
683
723
|
*
|
724
|
+
* @property {Object} flip - Images for the flip button.
|
725
|
+
* @property {String} flip.REST
|
726
|
+
* @property {String} flip.GROUP
|
727
|
+
* @property {String} flip.HOVER
|
728
|
+
* @property {String} flip.DOWN
|
729
|
+
*
|
684
730
|
* @property {Object} previous - Images for the previous button.
|
685
731
|
* @property {String} previous.REST
|
686
732
|
* @property {String} previous.GROUP
|
@@ -695,14 +741,7 @@
|
|
695
741
|
*
|
696
742
|
*/
|
697
743
|
|
698
|
-
|
699
|
-
/**
|
700
|
-
* This function serves as a single point of instantiation for an {@link OpenSeadragon.Viewer}, including all
|
701
|
-
* combinations of out-of-the-box configurable features.
|
702
|
-
*
|
703
|
-
* @param {OpenSeadragon.Options} options - Viewer options.
|
704
|
-
* @returns {OpenSeadragon.Viewer}
|
705
|
-
*/
|
744
|
+
/* eslint-disable no-redeclare */
|
706
745
|
function OpenSeadragon( options ){
|
707
746
|
return new OpenSeadragon.Viewer( options );
|
708
747
|
}
|
@@ -721,10 +760,10 @@ function OpenSeadragon( options ){
|
|
721
760
|
* @since 1.0.0
|
722
761
|
*/
|
723
762
|
$.version = {
|
724
|
-
versionStr: '2.
|
763
|
+
versionStr: '2.4.2',
|
725
764
|
major: parseInt('2', 10),
|
726
|
-
minor: parseInt('
|
727
|
-
revision: parseInt('
|
765
|
+
minor: parseInt('4', 10),
|
766
|
+
revision: parseInt('2', 10)
|
728
767
|
};
|
729
768
|
|
730
769
|
|
@@ -1052,6 +1091,7 @@ function OpenSeadragon( options ){
|
|
1052
1091
|
clickToZoom: true,
|
1053
1092
|
dblClickToZoom: false,
|
1054
1093
|
pinchToZoom: false,
|
1094
|
+
zoomToRefPoint: true,
|
1055
1095
|
flickEnabled: false,
|
1056
1096
|
flickMinSpeed: 120,
|
1057
1097
|
flickMomentum: 0.25,
|
@@ -1062,6 +1102,7 @@ function OpenSeadragon( options ){
|
|
1062
1102
|
clickToZoom: false,
|
1063
1103
|
dblClickToZoom: true,
|
1064
1104
|
pinchToZoom: true,
|
1105
|
+
zoomToRefPoint: true,
|
1065
1106
|
flickEnabled: true,
|
1066
1107
|
flickMinSpeed: 120,
|
1067
1108
|
flickMomentum: 0.25,
|
@@ -1072,6 +1113,7 @@ function OpenSeadragon( options ){
|
|
1072
1113
|
clickToZoom: true,
|
1073
1114
|
dblClickToZoom: false,
|
1074
1115
|
pinchToZoom: false,
|
1116
|
+
zoomToRefPoint: true,
|
1075
1117
|
flickEnabled: false,
|
1076
1118
|
flickMinSpeed: 120,
|
1077
1119
|
flickMomentum: 0.25,
|
@@ -1082,6 +1124,7 @@ function OpenSeadragon( options ){
|
|
1082
1124
|
clickToZoom: false,
|
1083
1125
|
dblClickToZoom: true,
|
1084
1126
|
pinchToZoom: true,
|
1127
|
+
zoomToRefPoint: true,
|
1085
1128
|
flickEnabled: true,
|
1086
1129
|
flickMinSpeed: 120,
|
1087
1130
|
flickMomentum: 0.25,
|
@@ -1099,9 +1142,11 @@ function OpenSeadragon( options ){
|
|
1099
1142
|
smoothTileEdgesMinZoom: 1.1, //-> higher than maxZoomPixelRatio disables it
|
1100
1143
|
iOSDevice: isIOSDevice(),
|
1101
1144
|
pixelsPerWheelLine: 40,
|
1145
|
+
pixelsPerArrowPress: 40,
|
1102
1146
|
autoResize: true,
|
1103
1147
|
preserveImageSizeOnResize: false, // requires autoResize=true
|
1104
1148
|
minScrollDeltaTime: 50,
|
1149
|
+
rotationIncrement: 90,
|
1105
1150
|
|
1106
1151
|
//DEFAULT CONTROL SETTINGS
|
1107
1152
|
showSequenceControl: true, //SEQUENCE
|
@@ -1115,6 +1160,7 @@ function OpenSeadragon( options ){
|
|
1115
1160
|
showHomeControl: true, //HOME
|
1116
1161
|
showFullPageControl: true, //FULL
|
1117
1162
|
showRotationControl: false, //ROTATION
|
1163
|
+
showFlipControl: false, //FLIP
|
1118
1164
|
controlsFadeDelay: 2000, //ZOOM/HOME/FULL/SEQUENCE
|
1119
1165
|
controlsFadeLength: 1500, //ZOOM/HOME/FULL/SEQUENCE
|
1120
1166
|
mouseNavEnabled: true, //GENERAL MOUSE INTERACTIVITY
|
@@ -1132,14 +1178,22 @@ function OpenSeadragon( options ){
|
|
1132
1178
|
navigatorAutoResize: true,
|
1133
1179
|
navigatorAutoFade: true,
|
1134
1180
|
navigatorRotate: true,
|
1181
|
+
navigatorBackground: '#000',
|
1182
|
+
navigatorOpacity: 0.8,
|
1183
|
+
navigatorBorderColor: '#555',
|
1184
|
+
navigatorDisplayRegionColor: '#900',
|
1135
1185
|
|
1136
1186
|
// INITIAL ROTATION
|
1137
1187
|
degrees: 0,
|
1138
1188
|
|
1189
|
+
// INITIAL FLIP STATE
|
1190
|
+
flipped: false,
|
1191
|
+
|
1139
1192
|
// APPEARANCE
|
1140
1193
|
opacity: 1,
|
1141
1194
|
preload: false,
|
1142
1195
|
compositeOperation: null,
|
1196
|
+
imageSmoothingEnabled: true,
|
1143
1197
|
placeholderFillStyle: null,
|
1144
1198
|
|
1145
1199
|
//REFERENCE STRIP SETTINGS
|
@@ -1204,6 +1258,12 @@ function OpenSeadragon( options ){
|
|
1204
1258
|
HOVER: 'rotateright_hover.png',
|
1205
1259
|
DOWN: 'rotateright_pressed.png'
|
1206
1260
|
},
|
1261
|
+
flip: { // Flip icon designed by Yaroslav Samoylov from the Noun Project and modified by Nelson Campos ncampos@criteriamarathon.com, https://thenounproject.com/term/flip/136289/
|
1262
|
+
REST: 'flip_rest.png',
|
1263
|
+
GROUP: 'flip_grouphover.png',
|
1264
|
+
HOVER: 'flip_hover.png',
|
1265
|
+
DOWN: 'flip_pressed.png'
|
1266
|
+
},
|
1207
1267
|
previous: {
|
1208
1268
|
REST: 'previous_rest.png',
|
1209
1269
|
GROUP: 'previous_grouphover.png',
|
@@ -1220,7 +1280,7 @@ function OpenSeadragon( options ){
|
|
1220
1280
|
|
1221
1281
|
//DEVELOPER SETTINGS
|
1222
1282
|
debugMode: false,
|
1223
|
-
debugGridColor: '#437AB2'
|
1283
|
+
debugGridColor: ['#437AB2', '#1B9E77', '#D95F02', '#7570B3', '#E7298A', '#66A61E', '#E6AB02', '#A6761D', '#666666']
|
1224
1284
|
},
|
1225
1285
|
|
1226
1286
|
|
@@ -1289,7 +1349,7 @@ function OpenSeadragon( options ){
|
|
1289
1349
|
/**
|
1290
1350
|
* Determines the position of the upper-left corner of the element.
|
1291
1351
|
* @function
|
1292
|
-
* @param {Element|String} element - the
|
1352
|
+
* @param {Element|String} element - the element we want the position for.
|
1293
1353
|
* @returns {OpenSeadragon.Point} - the position of the upper left corner of the element.
|
1294
1354
|
*/
|
1295
1355
|
getElementPosition: function( element ) {
|
@@ -1494,7 +1554,7 @@ function OpenSeadragon( options ){
|
|
1494
1554
|
*/
|
1495
1555
|
getMousePosition: function( event ) {
|
1496
1556
|
|
1497
|
-
if ( typeof( event.pageX ) == "number" ) {
|
1557
|
+
if ( typeof ( event.pageX ) == "number" ) {
|
1498
1558
|
$.getMousePosition = function( event ){
|
1499
1559
|
var result = new $.Point();
|
1500
1560
|
|
@@ -1504,7 +1564,7 @@ function OpenSeadragon( options ){
|
|
1504
1564
|
|
1505
1565
|
return result;
|
1506
1566
|
};
|
1507
|
-
} else if ( typeof( event.clientX ) == "number" ) {
|
1567
|
+
} else if ( typeof ( event.clientX ) == "number" ) {
|
1508
1568
|
$.getMousePosition = function( event ){
|
1509
1569
|
var result = new $.Point();
|
1510
1570
|
|
@@ -1539,7 +1599,7 @@ function OpenSeadragon( options ){
|
|
1539
1599
|
var docElement = document.documentElement || {},
|
1540
1600
|
body = document.body || {};
|
1541
1601
|
|
1542
|
-
if ( typeof( window.pageXOffset ) == "number" ) {
|
1602
|
+
if ( typeof ( window.pageXOffset ) == "number" ) {
|
1543
1603
|
$.getPageScroll = function(){
|
1544
1604
|
return new $.Point(
|
1545
1605
|
window.pageXOffset,
|
@@ -1628,7 +1688,7 @@ function OpenSeadragon( options ){
|
|
1628
1688
|
var docElement = document.documentElement || {},
|
1629
1689
|
body = document.body || {};
|
1630
1690
|
|
1631
|
-
if ( typeof( window.innerWidth ) == 'number' ) {
|
1691
|
+
if ( typeof ( window.innerWidth ) == 'number' ) {
|
1632
1692
|
$.getWindowSize = function(){
|
1633
1693
|
return new $.Point(
|
1634
1694
|
window.innerWidth,
|
@@ -2032,7 +2092,7 @@ function OpenSeadragon( options ){
|
|
2032
2092
|
/**
|
2033
2093
|
* Similar to OpenSeadragon.delegate, but it does not immediately call
|
2034
2094
|
* the method on the object, returning a function which can be called
|
2035
|
-
* repeatedly to delegate the method. It also allows
|
2095
|
+
* repeatedly to delegate the method. It also allows additional arguments
|
2036
2096
|
* to be passed during construction which will be added during each
|
2037
2097
|
* invocation, and each invocation can add additional arguments as well.
|
2038
2098
|
*
|
@@ -2066,7 +2126,7 @@ function OpenSeadragon( options ){
|
|
2066
2126
|
|
2067
2127
|
|
2068
2128
|
/**
|
2069
|
-
*
|
2129
|
+
* Retrieves the value of a url parameter from the window.location string.
|
2070
2130
|
* @function
|
2071
2131
|
* @param {String} key
|
2072
2132
|
* @returns {String} The value of the url parameter or null if no param matches.
|
@@ -2202,7 +2262,7 @@ function OpenSeadragon( options ){
|
|
2202
2262
|
|
2203
2263
|
if (headers) {
|
2204
2264
|
for (var headerName in headers) {
|
2205
|
-
if (
|
2265
|
+
if (Object.prototype.hasOwnProperty.call(headers, headerName) && headers[headerName]) {
|
2206
2266
|
request.setRequestHeader(headerName, headers[headerName]);
|
2207
2267
|
}
|
2208
2268
|
}
|
@@ -2228,7 +2288,7 @@ function OpenSeadragon( options ){
|
|
2228
2288
|
error messages are localized.
|
2229
2289
|
*/
|
2230
2290
|
var oldIE = $.Browser.vendor == $.BROWSERS.IE && $.Browser.version < 10;
|
2231
|
-
if ( oldIE && typeof( e.number ) != "undefined" && e.number == -2147024891 ) {
|
2291
|
+
if ( oldIE && typeof ( e.number ) != "undefined" && e.number == -2147024891 ) {
|
2232
2292
|
msg += "\nSee http://msdn.microsoft.com/en-us/library/ms537505(v=vs.85).aspx#xdomain";
|
2233
2293
|
}
|
2234
2294
|
|
@@ -2237,7 +2297,7 @@ function OpenSeadragon( options ){
|
|
2237
2297
|
request.onreadystatechange = function(){};
|
2238
2298
|
|
2239
2299
|
if (window.XDomainRequest) { // IE9 or IE8 might as well try to use XDomainRequest
|
2240
|
-
var xdr = new XDomainRequest();
|
2300
|
+
var xdr = new window.XDomainRequest();
|
2241
2301
|
if (xdr) {
|
2242
2302
|
xdr.onload = function (e) {
|
2243
2303
|
if ( $.isFunction( onSuccess ) ) {
|
@@ -2437,6 +2497,31 @@ function OpenSeadragon( options ){
|
|
2437
2497
|
});
|
2438
2498
|
|
2439
2499
|
|
2500
|
+
//TODO: $.console is often used inside a try/catch block which generally
|
2501
|
+
// prevents allowings errors to occur with detection until a debugger
|
2502
|
+
// is attached. Although I've been guilty of the same anti-pattern
|
2503
|
+
// I eventually was convinced that errors should naturally propagate in
|
2504
|
+
// all but the most special cases.
|
2505
|
+
/**
|
2506
|
+
* A convenient alias for console when available, and a simple null
|
2507
|
+
* function when console is unavailable.
|
2508
|
+
* @static
|
2509
|
+
* @private
|
2510
|
+
*/
|
2511
|
+
var nullfunction = function( msg ){
|
2512
|
+
//document.location.hash = msg;
|
2513
|
+
};
|
2514
|
+
|
2515
|
+
$.console = window.console || {
|
2516
|
+
log: nullfunction,
|
2517
|
+
debug: nullfunction,
|
2518
|
+
info: nullfunction,
|
2519
|
+
warn: nullfunction,
|
2520
|
+
error: nullfunction,
|
2521
|
+
assert: nullfunction
|
2522
|
+
};
|
2523
|
+
|
2524
|
+
|
2440
2525
|
/**
|
2441
2526
|
* The current browser vendor, version, and related information regarding detected features.
|
2442
2527
|
* @member {Object} Browser
|
@@ -2532,8 +2617,13 @@ function OpenSeadragon( options ){
|
|
2532
2617
|
sep = part.indexOf( '=' );
|
2533
2618
|
|
2534
2619
|
if ( sep > 0 ) {
|
2535
|
-
|
2536
|
-
|
2620
|
+
var key = part.substring( 0, sep ),
|
2621
|
+
value = part.substring( sep + 1 );
|
2622
|
+
try {
|
2623
|
+
URLPARAMS[ key ] = decodeURIComponent( value );
|
2624
|
+
} catch (e) {
|
2625
|
+
$.console.error( "Ignoring malformed URL parameter: %s=%s", key, value );
|
2626
|
+
}
|
2537
2627
|
}
|
2538
2628
|
}
|
2539
2629
|
|
@@ -2557,31 +2647,6 @@ function OpenSeadragon( options ){
|
|
2557
2647
|
})();
|
2558
2648
|
|
2559
2649
|
|
2560
|
-
//TODO: $.console is often used inside a try/catch block which generally
|
2561
|
-
// prevents allowings errors to occur with detection until a debugger
|
2562
|
-
// is attached. Although I've been guilty of the same anti-pattern
|
2563
|
-
// I eventually was convinced that errors should naturally propogate in
|
2564
|
-
// all but the most special cases.
|
2565
|
-
/**
|
2566
|
-
* A convenient alias for console when available, and a simple null
|
2567
|
-
* function when console is unavailable.
|
2568
|
-
* @static
|
2569
|
-
* @private
|
2570
|
-
*/
|
2571
|
-
var nullfunction = function( msg ){
|
2572
|
-
//document.location.hash = msg;
|
2573
|
-
};
|
2574
|
-
|
2575
|
-
$.console = window.console || {
|
2576
|
-
log: nullfunction,
|
2577
|
-
debug: nullfunction,
|
2578
|
-
info: nullfunction,
|
2579
|
-
warn: nullfunction,
|
2580
|
-
error: nullfunction,
|
2581
|
-
assert: nullfunction
|
2582
|
-
};
|
2583
|
-
|
2584
|
-
|
2585
2650
|
// Adding support for HTML5's requestAnimationFrame as suggested by acdha.
|
2586
2651
|
// Implementation taken from matt synder's post here:
|
2587
2652
|
// http://mattsnider.com/cross-browser-and-legacy-supported-requestframeanimation/
|
@@ -4279,8 +4344,9 @@ $.EventSource.prototype = {
|
|
4279
4344
|
},
|
4280
4345
|
|
4281
4346
|
/**
|
4282
|
-
*
|
4347
|
+
* Increment this pointer's contact count.
|
4283
4348
|
* It will evaluate whether this pointer type is allowed to have multiple contacts.
|
4349
|
+
* @function
|
4284
4350
|
*/
|
4285
4351
|
addContact: function() {
|
4286
4352
|
++this.contacts;
|
@@ -4291,8 +4357,9 @@ $.EventSource.prototype = {
|
|
4291
4357
|
},
|
4292
4358
|
|
4293
4359
|
/**
|
4294
|
-
*
|
4360
|
+
* Decrement this pointer's contact count.
|
4295
4361
|
* It will make sure the count does not go below 0.
|
4362
|
+
* @function
|
4296
4363
|
*/
|
4297
4364
|
removeContact: function() {
|
4298
4365
|
--this.contacts;
|
@@ -5538,7 +5605,7 @@ $.EventSource.prototype = {
|
|
5538
5605
|
|
5539
5606
|
// If isPrimary is not known for the pointer then set it according to our rules:
|
5540
5607
|
// true if the first pointer in the gesture, otherwise false
|
5541
|
-
if ( !
|
5608
|
+
if ( !Object.prototype.hasOwnProperty.call( gPoint, 'isPrimary' ) ) {
|
5542
5609
|
if ( pointsList.getLength() === 0 ) {
|
5543
5610
|
gPoint.isPrimary = true;
|
5544
5611
|
} else {
|
@@ -5574,7 +5641,7 @@ $.EventSource.prototype = {
|
|
5574
5641
|
listLength = pointsList.removeById( gPoint.id );
|
5575
5642
|
|
5576
5643
|
// If isPrimary is not known for the pointer and we just removed the primary pointer from the list then we need to set another pointer as primary
|
5577
|
-
if ( !
|
5644
|
+
if ( !Object.prototype.hasOwnProperty.call( gPoint, 'isPrimary' ) ) {
|
5578
5645
|
primaryPoint = pointsList.getPrimary();
|
5579
5646
|
if ( !primaryPoint ) {
|
5580
5647
|
primaryPoint = pointsList.getByIndex( 0 );
|
@@ -5700,7 +5767,7 @@ $.EventSource.prototype = {
|
|
5700
5767
|
{
|
5701
5768
|
eventSource: tracker,
|
5702
5769
|
pointerType: curGPoint.type,
|
5703
|
-
position: getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),
|
5770
|
+
position: curGPoint.currentPos && getPointRelativeToAbsolute( curGPoint.currentPos, tracker.element ),
|
5704
5771
|
buttons: pointsList.buttons,
|
5705
5772
|
pointers: tracker.getActivePointerCount(),
|
5706
5773
|
insideElementPressed: updateGPoint ? updateGPoint.insideElementPressed : false,
|
@@ -5997,10 +6064,16 @@ $.EventSource.prototype = {
|
|
5997
6064
|
return false;
|
5998
6065
|
}
|
5999
6066
|
|
6067
|
+
// OS-specific gestures (e.g. swipe up with four fingers in iPadOS 13)
|
6068
|
+
if (typeof gPoints[ 0 ].currentPos === "undefined") {
|
6069
|
+
abortContacts(tracker, event, pointsList);
|
6070
|
+
|
6071
|
+
return false;
|
6072
|
+
}
|
6073
|
+
|
6000
6074
|
for ( i = 0; i < gPointCount; i++ ) {
|
6001
6075
|
curGPoint = gPoints[ i ];
|
6002
6076
|
updateGPoint = pointsList.getById( curGPoint.id );
|
6003
|
-
|
6004
6077
|
if ( updateGPoint ) {
|
6005
6078
|
// Update the pointer, stop tracking it if not still in this element
|
6006
6079
|
if ( updateGPoint.captured ) {
|
@@ -6205,7 +6278,7 @@ $.EventSource.prototype = {
|
|
6205
6278
|
|
6206
6279
|
if ( updateGPoint ) {
|
6207
6280
|
// Already tracking the pointer...update it
|
6208
|
-
if (
|
6281
|
+
if ( Object.prototype.hasOwnProperty.call( curGPoint, 'isPrimary' ) ) {
|
6209
6282
|
updateGPoint.isPrimary = curGPoint.isPrimary;
|
6210
6283
|
}
|
6211
6284
|
updateGPoint.lastPos = updateGPoint.currentPos;
|
@@ -6382,10 +6455,12 @@ $.EventSource.prototype = {
|
|
6382
6455
|
}
|
6383
6456
|
}
|
6384
6457
|
|
6385
|
-
|
6386
|
-
|
6387
|
-
|
6388
|
-
|
6458
|
+
/**
|
6459
|
+
* True if inside an iframe, otherwise false.
|
6460
|
+
* @member {Boolean} isInIframe
|
6461
|
+
* @private
|
6462
|
+
* @inner
|
6463
|
+
*/
|
6389
6464
|
var isInIframe = (function() {
|
6390
6465
|
try {
|
6391
6466
|
return window.self !== window.top;
|
@@ -6394,10 +6469,12 @@ $.EventSource.prototype = {
|
|
6394
6469
|
}
|
6395
6470
|
})();
|
6396
6471
|
|
6397
|
-
|
6398
|
-
|
6399
|
-
|
6400
|
-
|
6472
|
+
/**
|
6473
|
+
* @function
|
6474
|
+
* @private
|
6475
|
+
* @inner
|
6476
|
+
* @returns {Boolean} True if the target has access rights to events, otherwise false.
|
6477
|
+
*/
|
6401
6478
|
function canAccessEvents (target) {
|
6402
6479
|
try {
|
6403
6480
|
return target.addEventListener && target.removeEventListener;
|
@@ -6577,7 +6654,7 @@ $.Control.prototype = {
|
|
6577
6654
|
/**
|
6578
6655
|
* Determines if the control is currently visible.
|
6579
6656
|
* @function
|
6580
|
-
* @return {Boolean} true if
|
6657
|
+
* @return {Boolean} true if currently visible, false otherwise.
|
6581
6658
|
*/
|
6582
6659
|
isVisible: function() {
|
6583
6660
|
return this.wrapper.style.display != "none";
|
@@ -7050,7 +7127,7 @@ $.Viewer = function( options ) {
|
|
7050
7127
|
i;
|
7051
7128
|
|
7052
7129
|
|
7053
|
-
//backward compatibility for positional args while
|
7130
|
+
//backward compatibility for positional args while preferring more
|
7054
7131
|
//idiomatic javascript options object as the only argument
|
7055
7132
|
if( !$.isPlainObject( options ) ){
|
7056
7133
|
options = {
|
@@ -7126,6 +7203,8 @@ $.Viewer = function( options ) {
|
|
7126
7203
|
|
7127
7204
|
//These are originally not part options but declared as members
|
7128
7205
|
//in initialize. It's still considered idiomatic to put them here
|
7206
|
+
//source is here for backwards compatibility. It is not an official
|
7207
|
+
//part of the API and should not be relied upon.
|
7129
7208
|
source: null,
|
7130
7209
|
/**
|
7131
7210
|
* Handles rendering of tiles in the viewer. Created for each TileSource opened.
|
@@ -7133,6 +7212,11 @@ $.Viewer = function( options ) {
|
|
7133
7212
|
* @memberof OpenSeadragon.Viewer#
|
7134
7213
|
*/
|
7135
7214
|
drawer: null,
|
7215
|
+
/**
|
7216
|
+
* Keeps track of all of the tiled images in the scene.
|
7217
|
+
* @member {OpenSeadragon.World} world
|
7218
|
+
* @memberof OpenSeadragon.Viewer#
|
7219
|
+
*/
|
7136
7220
|
world: null,
|
7137
7221
|
/**
|
7138
7222
|
* Handles coordinate-related functionality - zoom, pan, rotation, etc. Created for each TileSource opened.
|
@@ -7163,10 +7247,10 @@ $.Viewer = function( options ) {
|
|
7163
7247
|
|
7164
7248
|
}, $.DEFAULT_SETTINGS, options );
|
7165
7249
|
|
7166
|
-
if ( typeof( this.hash) === "undefined" ) {
|
7250
|
+
if ( typeof ( this.hash) === "undefined" ) {
|
7167
7251
|
throw new Error("A hash must be defined, either by specifying options.id or options.hash.");
|
7168
7252
|
}
|
7169
|
-
if ( typeof( THIS[ this.hash ] ) !== "undefined" ) {
|
7253
|
+
if ( typeof ( THIS[ this.hash ] ) !== "undefined" ) {
|
7170
7254
|
// We don't want to throw an error here, as the user might have discarded
|
7171
7255
|
// the previous viewer with the same hash and now want to recreate it.
|
7172
7256
|
$.console.warn("Hash " + this.hash + " has already been used.");
|
@@ -7348,6 +7432,7 @@ $.Viewer = function( options ) {
|
|
7348
7432
|
maxZoomLevel: this.maxZoomLevel,
|
7349
7433
|
viewer: this,
|
7350
7434
|
degrees: this.degrees,
|
7435
|
+
flipped: this.flipped,
|
7351
7436
|
navigatorRotate: this.navigatorRotate,
|
7352
7437
|
homeFillsViewer: this.homeFillsViewer,
|
7353
7438
|
margins: this.viewportMargins
|
@@ -7409,6 +7494,10 @@ $.Viewer = function( options ) {
|
|
7409
7494
|
prefixUrl: this.prefixUrl,
|
7410
7495
|
viewer: this,
|
7411
7496
|
navigatorRotate: this.navigatorRotate,
|
7497
|
+
background: this.navigatorBackground,
|
7498
|
+
opacity: this.navigatorOpacity,
|
7499
|
+
borderColor: this.navigatorBorderColor,
|
7500
|
+
displayRegionColor: this.navigatorDisplayRegionColor,
|
7412
7501
|
crossOriginPolicy: this.crossOriginPolicy
|
7413
7502
|
});
|
7414
7503
|
}
|
@@ -7435,6 +7524,12 @@ $.Viewer = function( options ) {
|
|
7435
7524
|
$.requestAnimationFrame( function(){
|
7436
7525
|
beginControlsAutoHide( _this );
|
7437
7526
|
} );
|
7527
|
+
|
7528
|
+
// Initial canvas options
|
7529
|
+
if ( this.imageSmoothingEnabled !== undefined && !this.imageSmoothingEnabled){
|
7530
|
+
this.drawer.setImageSmoothingEnabled(this.imageSmoothingEnabled);
|
7531
|
+
}
|
7532
|
+
|
7438
7533
|
};
|
7439
7534
|
|
7440
7535
|
$.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype, /** @lends OpenSeadragon.Viewer.prototype */{
|
@@ -7462,6 +7557,9 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
7462
7557
|
|
7463
7558
|
/**
|
7464
7559
|
* Open tiled images into the viewer, closing any others.
|
7560
|
+
* To get the TiledImage instance created by open, add an event listener for
|
7561
|
+
* {@link OpenSeadragon.Viewer.html#.event:open}, which when fired can be used to get access
|
7562
|
+
* to the instance, i.e., viewer.world.getItemAt(0).
|
7465
7563
|
* @function
|
7466
7564
|
* @param {Array|String|Object|Function} tileSources - This can be a TiledImage
|
7467
7565
|
* specifier, a TileSource specifier, or an array of either. A TiledImage specifier
|
@@ -7795,7 +7893,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
7795
7893
|
var enabled = this.controls.length,
|
7796
7894
|
i;
|
7797
7895
|
for( i = 0; i < this.controls.length; i++ ){
|
7798
|
-
enabled = enabled && this.controls[ i ].
|
7896
|
+
enabled = enabled && this.controls[ i ].isVisible();
|
7799
7897
|
}
|
7800
7898
|
return enabled;
|
7801
7899
|
},
|
@@ -7872,7 +7970,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
7872
7970
|
nodes,
|
7873
7971
|
i;
|
7874
7972
|
|
7875
|
-
//
|
7973
|
+
//don't bother modifying the DOM if we are already in full page mode.
|
7876
7974
|
if ( fullPage == this.isFullPage() ) {
|
7877
7975
|
return this;
|
7878
7976
|
}
|
@@ -7927,7 +8025,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
7927
8025
|
bodyStyle.height = "100%";
|
7928
8026
|
docStyle.height = "100%";
|
7929
8027
|
|
7930
|
-
//when entering full screen on the ipad it
|
8028
|
+
//when entering full screen on the ipad it wasn't sufficient to leave
|
7931
8029
|
//the body intact as only only the top half of the screen would
|
7932
8030
|
//respond to touch events on the canvas, while the bottom half treated
|
7933
8031
|
//them as touch events on the document body. Thus we remove and store
|
@@ -8134,7 +8232,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8134
8232
|
}
|
8135
8233
|
}
|
8136
8234
|
if ( _this.navigator && _this.viewport ) {
|
8137
|
-
|
8235
|
+
//09/08/2018 - Fabroh : Fix issue #1504 : Ensure to get the navigator updated on fullscreen out with custom location with a timeout
|
8236
|
+
setTimeout(function(){
|
8237
|
+
_this.navigator.update( _this.viewport );
|
8238
|
+
});
|
8138
8239
|
}
|
8139
8240
|
/**
|
8140
8241
|
* Raised when the viewer has changed to/from full-screen mode (see {@link OpenSeadragon.Viewer#setFullScreen}).
|
@@ -8244,7 +8345,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8244
8345
|
* requests.
|
8245
8346
|
* @param {Function} [options.success] A function that gets called when the image is
|
8246
8347
|
* successfully added. It's passed the event object which contains a single property:
|
8247
|
-
* "item", the resulting TiledImage.
|
8348
|
+
* "item", which is the resulting instance of TiledImage.
|
8248
8349
|
* @param {Function} [options.error] A function that gets called if the image is
|
8249
8350
|
* unable to be added. It's passed the error event object, which contains "message"
|
8250
8351
|
* and "source" properties.
|
@@ -8652,6 +8753,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8652
8753
|
onFullScreenHandler = $.delegate( this, onFullScreen ),
|
8653
8754
|
onRotateLeftHandler = $.delegate( this, onRotateLeft ),
|
8654
8755
|
onRotateRightHandler = $.delegate( this, onRotateRight ),
|
8756
|
+
onFlipHandler = $.delegate( this, onFlip),
|
8655
8757
|
onFocusHandler = $.delegate( this, onFocus ),
|
8656
8758
|
onBlurHandler = $.delegate( this, onBlur ),
|
8657
8759
|
navImages = this.navImages,
|
@@ -8663,7 +8765,8 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8663
8765
|
|
8664
8766
|
if( this.zoomInButton || this.zoomOutButton ||
|
8665
8767
|
this.homeButton || this.fullPageButton ||
|
8666
|
-
this.rotateLeftButton || this.rotateRightButton
|
8768
|
+
this.rotateLeftButton || this.rotateRightButton ||
|
8769
|
+
this.flipButton ) {
|
8667
8770
|
//if we are binding to custom buttons then layout and
|
8668
8771
|
//grouping is the responsibility of the page author
|
8669
8772
|
useGroup = false;
|
@@ -8767,7 +8870,22 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8767
8870
|
onFocus: onFocusHandler,
|
8768
8871
|
onBlur: onBlurHandler
|
8769
8872
|
}));
|
8873
|
+
}
|
8770
8874
|
|
8875
|
+
if ( this.showFlipControl ) {
|
8876
|
+
buttons.push( this.flipButton = new $.Button({
|
8877
|
+
element: this.flipButton ? $.getElement( this.flipButton ) : null,
|
8878
|
+
clickTimeThreshold: this.clickTimeThreshold,
|
8879
|
+
clickDistThreshold: this.clickDistThreshold,
|
8880
|
+
tooltip: $.getString( "Tooltips.Flip" ),
|
8881
|
+
srcRest: resolveUrl( this.prefixUrl, navImages.flip.REST ),
|
8882
|
+
srcGroup: resolveUrl( this.prefixUrl, navImages.flip.GROUP ),
|
8883
|
+
srcHover: resolveUrl( this.prefixUrl, navImages.flip.HOVER ),
|
8884
|
+
srcDown: resolveUrl( this.prefixUrl, navImages.flip.DOWN ),
|
8885
|
+
onRelease: onFlipHandler,
|
8886
|
+
onFocus: onFocusHandler,
|
8887
|
+
onBlur: onBlurHandler
|
8888
|
+
}));
|
8771
8889
|
}
|
8772
8890
|
|
8773
8891
|
if ( useGroup ) {
|
@@ -8813,6 +8931,16 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8813
8931
|
*/
|
8814
8932
|
goToPage: function( page ){
|
8815
8933
|
if( this.tileSources && page >= 0 && page < this.tileSources.length ){
|
8934
|
+
this._sequenceIndex = page;
|
8935
|
+
|
8936
|
+
this._updateSequenceButtons( page );
|
8937
|
+
|
8938
|
+
this.open( this.tileSources[ page ] );
|
8939
|
+
|
8940
|
+
if( this.referenceStrip ){
|
8941
|
+
this.referenceStrip.setFocus( page );
|
8942
|
+
}
|
8943
|
+
|
8816
8944
|
/**
|
8817
8945
|
* Raised when the page is changed on a viewer configured with multiple image sources (see {@link OpenSeadragon.Viewer#goToPage}).
|
8818
8946
|
*
|
@@ -8824,16 +8952,6 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8824
8952
|
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
8825
8953
|
*/
|
8826
8954
|
this.raiseEvent( 'page', { page: page } );
|
8827
|
-
|
8828
|
-
this._sequenceIndex = page;
|
8829
|
-
|
8830
|
-
this._updateSequenceButtons( page );
|
8831
|
-
|
8832
|
-
this.open( this.tileSources[ page ] );
|
8833
|
-
|
8834
|
-
if( this.referenceStrip ){
|
8835
|
-
this.referenceStrip.setFocus( page );
|
8836
|
-
}
|
8837
8955
|
}
|
8838
8956
|
|
8839
8957
|
return this;
|
@@ -8846,15 +8964,15 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8846
8964
|
* is closed which include when changing page.
|
8847
8965
|
* @method
|
8848
8966
|
* @param {Element|String|Object} element - A reference to an element or an id for
|
8849
|
-
* the element which will be
|
8967
|
+
* the element which will be overlaid. Or an Object specifying the configuration for the overlay.
|
8850
8968
|
* If using an object, see {@link OpenSeadragon.Overlay} for a list of
|
8851
8969
|
* all available options.
|
8852
8970
|
* @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
|
8853
|
-
* rectangle which will be
|
8854
|
-
* @param {OpenSeadragon.Placement} placement - The position of the
|
8971
|
+
* rectangle which will be overlaid. This is a viewport relative location.
|
8972
|
+
* @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the
|
8855
8973
|
* viewport which the location coordinates will be treated as relative
|
8856
8974
|
* to.
|
8857
|
-
* @param {function} onDraw - If supplied the callback is called when the overlay
|
8975
|
+
* @param {function} [onDraw] - If supplied the callback is called when the overlay
|
8858
8976
|
* needs to be drawn. It it the responsibility of the callback to do any drawing/positioning.
|
8859
8977
|
* It is passed position, size and element.
|
8860
8978
|
* @return {OpenSeadragon.Viewer} Chainable.
|
@@ -8909,10 +9027,10 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
8909
9027
|
* element id moving it to the new location, relative to the new placement.
|
8910
9028
|
* @method
|
8911
9029
|
* @param {Element|String} element - A reference to an element or an id for
|
8912
|
-
* the element which is
|
9030
|
+
* the element which is overlaid.
|
8913
9031
|
* @param {OpenSeadragon.Point|OpenSeadragon.Rect} location - The point or
|
8914
|
-
* rectangle which will be
|
8915
|
-
* @param {OpenSeadragon.Placement} placement - The position of the
|
9032
|
+
* rectangle which will be overlaid. This is a viewport relative location.
|
9033
|
+
* @param {OpenSeadragon.Placement} [placement=OpenSeadragon.Placement.TOP_LEFT] - The position of the
|
8916
9034
|
* viewport which the location coordinates will be treated as relative
|
8917
9035
|
* to.
|
8918
9036
|
* @return {OpenSeadragon.Viewer} Chainable.
|
@@ -9167,6 +9285,7 @@ $.extend( $.Viewer.prototype, $.EventSource.prototype, $.ControlDock.prototype,
|
|
9167
9285
|
width: this.referenceStripWidth,
|
9168
9286
|
tileSources: this.tileSources,
|
9169
9287
|
prefixUrl: this.prefixUrl,
|
9288
|
+
useCanvas: this.useCanvas,
|
9170
9289
|
viewer: this
|
9171
9290
|
});
|
9172
9291
|
|
@@ -9455,31 +9574,62 @@ function onBlur(){
|
|
9455
9574
|
}
|
9456
9575
|
|
9457
9576
|
function onCanvasKeyDown( event ) {
|
9458
|
-
|
9577
|
+
var canvasKeyDownEventArgs = {
|
9578
|
+
originalEvent: event.originalEvent,
|
9579
|
+
preventDefaultAction: event.preventDefaultAction,
|
9580
|
+
preventVerticalPan: event.preventVerticalPan,
|
9581
|
+
preventHorizontalPan: event.preventHorizontalPan
|
9582
|
+
};
|
9583
|
+
|
9584
|
+
/**
|
9585
|
+
* Raised when a keyboard key is pressed and the focus is on the {@link OpenSeadragon.Viewer#canvas} element.
|
9586
|
+
*
|
9587
|
+
* @event canvas-key
|
9588
|
+
* @memberof OpenSeadragon.Viewer
|
9589
|
+
* @type {object}
|
9590
|
+
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
|
9591
|
+
* @property {Object} originalEvent - The original DOM event.
|
9592
|
+
* @property {Boolean} preventDefaultAction - Set to true to prevent default keyboard behaviour. Default: false.
|
9593
|
+
* @property {Boolean} preventVerticalPan - Set to true to prevent keyboard vertical panning. Default: false.
|
9594
|
+
* @property {Boolean} preventHorizontalPan - Set to true to prevent keyboard horizontal panning. Default: false.
|
9595
|
+
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
9596
|
+
*/
|
9597
|
+
|
9598
|
+
this.raiseEvent('canvas-key', canvasKeyDownEventArgs);
|
9599
|
+
|
9600
|
+
if ( !canvasKeyDownEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
|
9459
9601
|
switch( event.keyCode ){
|
9460
9602
|
case 38://up arrow
|
9461
|
-
if (
|
9603
|
+
if (!canvasKeyDownEventArgs.preventVerticalPan) {
|
9604
|
+
if ( event.shift ) {
|
9462
9605
|
this.viewport.zoomBy(1.1);
|
9463
|
-
|
9464
|
-
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -
|
9606
|
+
} else {
|
9607
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -this.pixelsPerArrowPress)));
|
9608
|
+
}
|
9609
|
+
this.viewport.applyConstraints();
|
9465
9610
|
}
|
9466
|
-
this.viewport.applyConstraints();
|
9467
9611
|
return false;
|
9468
9612
|
case 40://down arrow
|
9469
|
-
if (
|
9613
|
+
if (!canvasKeyDownEventArgs.preventVerticalPan) {
|
9614
|
+
if ( event.shift ) {
|
9470
9615
|
this.viewport.zoomBy(0.9);
|
9471
|
-
|
9472
|
-
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0,
|
9616
|
+
} else {
|
9617
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, this.pixelsPerArrowPress)));
|
9618
|
+
}
|
9619
|
+
this.viewport.applyConstraints();
|
9473
9620
|
}
|
9474
|
-
this.viewport.applyConstraints();
|
9475
9621
|
return false;
|
9476
9622
|
case 37://left arrow
|
9477
|
-
|
9478
|
-
|
9623
|
+
if (!canvasKeyDownEventArgs.preventHorizontalPan) {
|
9624
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-this.pixelsPerArrowPress, 0)));
|
9625
|
+
this.viewport.applyConstraints();
|
9626
|
+
}
|
9479
9627
|
return false;
|
9480
9628
|
case 39://right arrow
|
9481
|
-
|
9482
|
-
|
9629
|
+
if (!canvasKeyDownEventArgs.preventHorizontalPan) {
|
9630
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(this.pixelsPerArrowPress, 0)));
|
9631
|
+
this.viewport.applyConstraints();
|
9632
|
+
}
|
9483
9633
|
return false;
|
9484
9634
|
default:
|
9485
9635
|
//console.log( 'navigator keycode %s', event.keyCode );
|
@@ -9489,9 +9639,18 @@ function onCanvasKeyDown( event ) {
|
|
9489
9639
|
return true;
|
9490
9640
|
}
|
9491
9641
|
}
|
9492
|
-
|
9493
9642
|
function onCanvasKeyPress( event ) {
|
9494
|
-
|
9643
|
+
var canvasKeyPressEventArgs = {
|
9644
|
+
originalEvent: event.originalEvent,
|
9645
|
+
preventDefaultAction: event.preventDefaultAction,
|
9646
|
+
preventVerticalPan: event.preventVerticalPan,
|
9647
|
+
preventHorizontalPan: event.preventHorizontalPan
|
9648
|
+
};
|
9649
|
+
|
9650
|
+
// This event is documented in onCanvasKeyDown
|
9651
|
+
this.raiseEvent('canvas-key', canvasKeyPressEventArgs);
|
9652
|
+
|
9653
|
+
if ( !canvasKeyPressEventArgs.preventDefaultAction && !event.ctrl && !event.alt && !event.meta ) {
|
9495
9654
|
switch( event.keyCode ){
|
9496
9655
|
case 43://=|+
|
9497
9656
|
case 61://=|+
|
@@ -9508,32 +9667,59 @@ function onCanvasKeyPress( event ) {
|
|
9508
9667
|
return false;
|
9509
9668
|
case 119://w
|
9510
9669
|
case 87://W
|
9511
|
-
if (
|
9512
|
-
|
9513
|
-
|
9514
|
-
|
9515
|
-
|
9516
|
-
|
9517
|
-
|
9670
|
+
if (!canvasKeyPressEventArgs.preventVerticalPan) {
|
9671
|
+
if ( event.shift ) {
|
9672
|
+
this.viewport.zoomBy(1.1);
|
9673
|
+
} else {
|
9674
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, -40)));
|
9675
|
+
}
|
9676
|
+
this.viewport.applyConstraints();
|
9677
|
+
}
|
9678
|
+
return false;
|
9518
9679
|
case 115://s
|
9519
9680
|
case 83://S
|
9520
|
-
if (
|
9681
|
+
if (!canvasKeyPressEventArgs.preventVerticalPan) {
|
9682
|
+
if ( event.shift ) {
|
9521
9683
|
this.viewport.zoomBy(0.9);
|
9522
|
-
|
9684
|
+
} else {
|
9523
9685
|
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(0, 40)));
|
9686
|
+
}
|
9687
|
+
this.viewport.applyConstraints();
|
9524
9688
|
}
|
9525
|
-
this.viewport.applyConstraints();
|
9526
9689
|
return false;
|
9527
9690
|
case 97://a
|
9528
|
-
|
9529
|
-
|
9691
|
+
if (!canvasKeyPressEventArgs.preventHorizontalPan) {
|
9692
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(-40, 0)));
|
9693
|
+
this.viewport.applyConstraints();
|
9694
|
+
}
|
9530
9695
|
return false;
|
9531
9696
|
case 100://d
|
9532
|
-
|
9533
|
-
|
9697
|
+
if (!canvasKeyPressEventArgs.preventHorizontalPan) {
|
9698
|
+
this.viewport.panBy(this.viewport.deltaPointsFromPixels(new $.Point(40, 0)));
|
9699
|
+
this.viewport.applyConstraints();
|
9700
|
+
}
|
9534
9701
|
return false;
|
9702
|
+
case 114: //r - clockwise rotation
|
9703
|
+
if(this.viewport.flipped){
|
9704
|
+
this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
|
9705
|
+
} else{
|
9706
|
+
this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
|
9707
|
+
}
|
9708
|
+
this.viewport.applyConstraints();
|
9709
|
+
return false;
|
9710
|
+
case 82: //R - counterclockwise rotation
|
9711
|
+
if(this.viewport.flipped){
|
9712
|
+
this.viewport.setRotation($.positiveModulo(this.viewport.degrees + this.rotationIncrement, 360));
|
9713
|
+
} else{
|
9714
|
+
this.viewport.setRotation($.positiveModulo(this.viewport.degrees - this.rotationIncrement, 360));
|
9715
|
+
}
|
9716
|
+
this.viewport.applyConstraints();
|
9717
|
+
return false;
|
9718
|
+
case 102: //f
|
9719
|
+
this.viewport.toggleFlip();
|
9720
|
+
return false;
|
9535
9721
|
default:
|
9536
|
-
//console.log( 'navigator keycode %s', event.keyCode );
|
9722
|
+
// console.log( 'navigator keycode %s', event.keyCode );
|
9537
9723
|
return true;
|
9538
9724
|
}
|
9539
9725
|
} else {
|
@@ -9550,6 +9736,9 @@ function onCanvasClick( event ) {
|
|
9550
9736
|
if ( !haveKeyboardFocus ) {
|
9551
9737
|
this.canvas.focus();
|
9552
9738
|
}
|
9739
|
+
if(this.viewport.flipped){
|
9740
|
+
event.position.x = this.viewport.getContainerSize().x - event.position.x;
|
9741
|
+
}
|
9553
9742
|
|
9554
9743
|
var canvasClickEventArgs = {
|
9555
9744
|
tracker: event.eventSource,
|
@@ -9582,7 +9771,7 @@ function onCanvasClick( event ) {
|
|
9582
9771
|
if ( gestureSettings.clickToZoom ) {
|
9583
9772
|
this.viewport.zoomBy(
|
9584
9773
|
event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
|
9585
|
-
this.viewport.pointFromPixel( event.position, true )
|
9774
|
+
gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
|
9586
9775
|
);
|
9587
9776
|
this.viewport.applyConstraints();
|
9588
9777
|
}
|
@@ -9592,16 +9781,14 @@ function onCanvasClick( event ) {
|
|
9592
9781
|
function onCanvasDblClick( event ) {
|
9593
9782
|
var gestureSettings;
|
9594
9783
|
|
9595
|
-
|
9596
|
-
|
9597
|
-
|
9598
|
-
|
9599
|
-
|
9600
|
-
|
9601
|
-
|
9602
|
-
|
9603
|
-
}
|
9604
|
-
}
|
9784
|
+
var canvasDblClickEventArgs = {
|
9785
|
+
tracker: event.eventSource,
|
9786
|
+
position: event.position,
|
9787
|
+
shift: event.shift,
|
9788
|
+
originalEvent: event.originalEvent,
|
9789
|
+
preventDefaultAction: event.preventDefaultAction
|
9790
|
+
};
|
9791
|
+
|
9605
9792
|
/**
|
9606
9793
|
* Raised when a double mouse press/release or touch/remove occurs on the {@link OpenSeadragon.Viewer#canvas} element.
|
9607
9794
|
*
|
@@ -9613,14 +9800,21 @@ function onCanvasDblClick( event ) {
|
|
9613
9800
|
* @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
|
9614
9801
|
* @property {Boolean} shift - True if the shift key was pressed during this event.
|
9615
9802
|
* @property {Object} originalEvent - The original DOM event.
|
9803
|
+
* @property {Boolean} preventDefaultAction - Set to true to prevent default double tap to zoom behaviour. Default: false.
|
9616
9804
|
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
9617
9805
|
*/
|
9618
|
-
this.raiseEvent( 'canvas-double-click',
|
9619
|
-
|
9620
|
-
|
9621
|
-
|
9622
|
-
|
9623
|
-
|
9806
|
+
this.raiseEvent( 'canvas-double-click', canvasDblClickEventArgs);
|
9807
|
+
|
9808
|
+
if ( !canvasDblClickEventArgs.preventDefaultAction && this.viewport ) {
|
9809
|
+
gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
|
9810
|
+
if ( gestureSettings.dblClickToZoom ) {
|
9811
|
+
this.viewport.zoomBy(
|
9812
|
+
event.shift ? 1.0 / this.zoomPerClick : this.zoomPerClick,
|
9813
|
+
gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
|
9814
|
+
);
|
9815
|
+
this.viewport.applyConstraints();
|
9816
|
+
}
|
9817
|
+
}
|
9624
9818
|
}
|
9625
9819
|
|
9626
9820
|
function onCanvasDrag( event ) {
|
@@ -9636,6 +9830,7 @@ function onCanvasDrag( event ) {
|
|
9636
9830
|
originalEvent: event.originalEvent,
|
9637
9831
|
preventDefaultAction: event.preventDefaultAction
|
9638
9832
|
};
|
9833
|
+
|
9639
9834
|
/**
|
9640
9835
|
* Raised when a mouse or touch drag operation occurs on the {@link OpenSeadragon.Viewer#canvas} element.
|
9641
9836
|
*
|
@@ -9655,7 +9850,7 @@ function onCanvasDrag( event ) {
|
|
9655
9850
|
*/
|
9656
9851
|
this.raiseEvent( 'canvas-drag', canvasDragEventArgs);
|
9657
9852
|
|
9658
|
-
if ( !
|
9853
|
+
if ( !canvasDragEventArgs.preventDefaultAction && this.viewport ) {
|
9659
9854
|
gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
|
9660
9855
|
if( !this.panHorizontal ){
|
9661
9856
|
event.delta.x = 0;
|
@@ -9663,6 +9858,9 @@ function onCanvasDrag( event ) {
|
|
9663
9858
|
if( !this.panVertical ){
|
9664
9859
|
event.delta.y = 0;
|
9665
9860
|
}
|
9861
|
+
if(this.viewport.flipped){
|
9862
|
+
event.delta.x = -event.delta.x;
|
9863
|
+
}
|
9666
9864
|
|
9667
9865
|
if( this.constrainDuringPan ){
|
9668
9866
|
var delta = this.viewport.deltaPointsFromPixels( event.delta.negate() );
|
@@ -9929,7 +10127,9 @@ function onCanvasPinch( event ) {
|
|
9929
10127
|
panByPt.y = 0;
|
9930
10128
|
}
|
9931
10129
|
this.viewport.zoomBy( event.distance / event.lastDistance, centerPt, true );
|
9932
|
-
|
10130
|
+
if ( gestureSettings.zoomToRefPoint ) {
|
10131
|
+
this.viewport.panBy(panByPt, true);
|
10132
|
+
}
|
9933
10133
|
this.viewport.applyConstraints();
|
9934
10134
|
}
|
9935
10135
|
if ( gestureSettings.pinchRotate ) {
|
@@ -9986,13 +10186,17 @@ function onCanvasScroll( event ) {
|
|
9986
10186
|
if (deltaScrollTime > this.minScrollDeltaTime) {
|
9987
10187
|
this._lastScrollTime = thisScrollTime;
|
9988
10188
|
|
10189
|
+
if(this.viewport.flipped){
|
10190
|
+
event.position.x = this.viewport.getContainerSize().x - event.position.x;
|
10191
|
+
}
|
10192
|
+
|
9989
10193
|
if ( !event.preventDefaultAction && this.viewport ) {
|
9990
10194
|
gestureSettings = this.gestureSettingsByDeviceType( event.pointerType );
|
9991
10195
|
if ( gestureSettings.scrollToZoom ) {
|
9992
10196
|
factor = Math.pow( this.zoomPerScroll, event.scroll );
|
9993
10197
|
this.viewport.zoomBy(
|
9994
10198
|
factor,
|
9995
|
-
this.viewport.pointFromPixel( event.position, true )
|
10199
|
+
gestureSettings.zoomToRefPoint ? this.viewport.pointFromPixel( event.position, true ) : null
|
9996
10200
|
);
|
9997
10201
|
this.viewport.applyConstraints();
|
9998
10202
|
}
|
@@ -10181,7 +10385,7 @@ function updateOnce( viewer ) {
|
|
10181
10385
|
drawWorld( viewer );
|
10182
10386
|
viewer._drawOverlays();
|
10183
10387
|
if( viewer.navigator ){
|
10184
|
-
|
10388
|
+
viewer.navigator.update( viewer.viewport );
|
10185
10389
|
}
|
10186
10390
|
|
10187
10391
|
THIS[ viewer.hash ].forceRedraw = false;
|
@@ -10345,38 +10549,37 @@ function onFullScreen() {
|
|
10345
10549
|
}
|
10346
10550
|
}
|
10347
10551
|
|
10348
|
-
/**
|
10349
|
-
* Note: The current rotation feature is limited to 90 degree turns.
|
10350
|
-
*/
|
10351
10552
|
function onRotateLeft() {
|
10352
10553
|
if ( this.viewport ) {
|
10353
10554
|
var currRotation = this.viewport.getRotation();
|
10354
|
-
|
10355
|
-
|
10356
|
-
|
10357
|
-
else {
|
10358
|
-
|
10555
|
+
|
10556
|
+
if ( this.viewport.flipped ){
|
10557
|
+
currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
|
10558
|
+
} else {
|
10559
|
+
currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
|
10359
10560
|
}
|
10360
10561
|
this.viewport.setRotation(currRotation);
|
10361
10562
|
}
|
10362
10563
|
}
|
10363
10564
|
|
10364
|
-
/**
|
10365
|
-
* Note: The current rotation feature is limited to 90 degree turns.
|
10366
|
-
*/
|
10367
10565
|
function onRotateRight() {
|
10368
10566
|
if ( this.viewport ) {
|
10369
10567
|
var currRotation = this.viewport.getRotation();
|
10370
|
-
|
10371
|
-
|
10372
|
-
|
10373
|
-
else {
|
10374
|
-
|
10568
|
+
|
10569
|
+
if ( this.viewport.flipped ){
|
10570
|
+
currRotation = $.positiveModulo(currRotation - this.rotationIncrement, 360);
|
10571
|
+
} else {
|
10572
|
+
currRotation = $.positiveModulo(currRotation + this.rotationIncrement, 360);
|
10375
10573
|
}
|
10376
10574
|
this.viewport.setRotation(currRotation);
|
10377
10575
|
}
|
10378
10576
|
}
|
10379
|
-
|
10577
|
+
/**
|
10578
|
+
* Note: When pressed flip control button
|
10579
|
+
*/
|
10580
|
+
function onFlip() {
|
10581
|
+
this.viewport.toggleFlip();
|
10582
|
+
}
|
10380
10583
|
|
10381
10584
|
function onPrevious(){
|
10382
10585
|
var previous = this._sequenceIndex - 1;
|
@@ -10510,7 +10713,11 @@ $.Navigator = function( options ){
|
|
10510
10713
|
animationTime: 0,
|
10511
10714
|
autoResize: options.autoResize,
|
10512
10715
|
// prevent resizing the navigator from adding unwanted space around the image
|
10513
|
-
minZoomImageRatio: 1.0
|
10716
|
+
minZoomImageRatio: 1.0,
|
10717
|
+
background: options.background,
|
10718
|
+
opacity: options.opacity,
|
10719
|
+
borderColor: options.borderColor,
|
10720
|
+
displayRegionColor: options.displayRegionColor
|
10514
10721
|
});
|
10515
10722
|
|
10516
10723
|
options.minPixelRatio = this.minPixelRatio = viewer.minPixelRatio;
|
@@ -10527,10 +10734,10 @@ $.Navigator = function( options ){
|
|
10527
10734
|
if ( options.controlOptions.anchor != $.ControlAnchor.NONE ) {
|
10528
10735
|
(function( style, borderWidth ){
|
10529
10736
|
style.margin = '0px';
|
10530
|
-
style.border = borderWidth + 'px solid
|
10737
|
+
style.border = borderWidth + 'px solid ' + options.borderColor;
|
10531
10738
|
style.padding = '0px';
|
10532
|
-
style.background =
|
10533
|
-
style.opacity =
|
10739
|
+
style.background = options.background;
|
10740
|
+
style.opacity = options.opacity;
|
10534
10741
|
style.overflow = 'hidden';
|
10535
10742
|
}( this.element.style, this.borderWidth));
|
10536
10743
|
}
|
@@ -10545,10 +10752,10 @@ $.Navigator = function( options ){
|
|
10545
10752
|
style.left = '0px';
|
10546
10753
|
style.fontSize = '0px';
|
10547
10754
|
style.overflow = 'hidden';
|
10548
|
-
style.border = borderWidth + 'px solid
|
10755
|
+
style.border = borderWidth + 'px solid ' + options.displayRegionColor;
|
10549
10756
|
style.margin = '0px';
|
10550
10757
|
style.padding = '0px';
|
10551
|
-
//TODO: IE
|
10758
|
+
//TODO: IE doesn't like this property being set
|
10552
10759
|
//try{ style.outline = '2px auto #909'; }catch(e){/*ignore*/}
|
10553
10760
|
|
10554
10761
|
style.background = 'transparent';
|
@@ -10578,16 +10785,14 @@ $.Navigator = function( options ){
|
|
10578
10785
|
this._resizeWithViewer = options.controlOptions.anchor != $.ControlAnchor.ABSOLUTE &&
|
10579
10786
|
options.controlOptions.anchor != $.ControlAnchor.NONE;
|
10580
10787
|
|
10581
|
-
if (
|
10582
|
-
|
10583
|
-
|
10584
|
-
|
10585
|
-
|
10586
|
-
|
10587
|
-
|
10588
|
-
|
10589
|
-
this.oldViewerSize = viewerSize;
|
10590
|
-
}
|
10788
|
+
if (options.width && options.height) {
|
10789
|
+
this.setWidth(options.width);
|
10790
|
+
this.setHeight(options.height);
|
10791
|
+
} else if ( this._resizeWithViewer ) {
|
10792
|
+
viewerSize = $.getElementSize( viewer.element );
|
10793
|
+
this.element.style.height = Math.round( viewerSize.y * options.sizeRatio ) + 'px';
|
10794
|
+
this.element.style.width = Math.round( viewerSize.x * options.sizeRatio ) + 'px';
|
10795
|
+
this.oldViewerSize = viewerSize;
|
10591
10796
|
navigatorSize = $.getElementSize( this.element );
|
10592
10797
|
this.elementArea = navigatorSize.x * navigatorSize.y;
|
10593
10798
|
}
|
@@ -10608,12 +10813,14 @@ $.Navigator = function( options ){
|
|
10608
10813
|
var degrees = options.viewer.viewport ?
|
10609
10814
|
options.viewer.viewport.getRotation() :
|
10610
10815
|
options.viewer.degrees || 0;
|
10816
|
+
|
10611
10817
|
rotate(degrees);
|
10612
10818
|
options.viewer.addHandler("rotate", function (args) {
|
10613
10819
|
rotate(args.degrees);
|
10614
10820
|
});
|
10615
10821
|
}
|
10616
10822
|
|
10823
|
+
|
10617
10824
|
// Remove the base class' (Viewer's) innerTracker and replace it with our own
|
10618
10825
|
this.innerTracker.destroy();
|
10619
10826
|
this.innerTracker = new $.MouseTracker({
|
@@ -10672,6 +10879,43 @@ $.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /*
|
|
10672
10879
|
}
|
10673
10880
|
},
|
10674
10881
|
|
10882
|
+
/**
|
10883
|
+
* Explicitly sets the width of the navigator, in web coordinates. Disables automatic resizing.
|
10884
|
+
* @param {Number|String} width - the new width, either a number of pixels or a CSS string, such as "100%"
|
10885
|
+
*/
|
10886
|
+
setWidth: function(width) {
|
10887
|
+
this.width = width;
|
10888
|
+
this.element.style.width = typeof (width) == "number" ? (width + 'px') : width;
|
10889
|
+
this._resizeWithViewer = false;
|
10890
|
+
},
|
10891
|
+
|
10892
|
+
/**
|
10893
|
+
* Explicitly sets the height of the navigator, in web coordinates. Disables automatic resizing.
|
10894
|
+
* @param {Number|String} height - the new height, either a number of pixels or a CSS string, such as "100%"
|
10895
|
+
*/
|
10896
|
+
setHeight: function(height) {
|
10897
|
+
this.height = height;
|
10898
|
+
this.element.style.height = typeof (height) == "number" ? (height + 'px') : height;
|
10899
|
+
this._resizeWithViewer = false;
|
10900
|
+
},
|
10901
|
+
|
10902
|
+
/**
|
10903
|
+
* Flip navigator element
|
10904
|
+
* @param {Boolean} state - Flip state to set.
|
10905
|
+
*/
|
10906
|
+
setFlip: function(state) {
|
10907
|
+
this.viewport.setFlip(state);
|
10908
|
+
|
10909
|
+
this.setDisplayTransform(this.viewer.viewport.getFlip() ? "scale(-1,1)" : "scale(1,1)");
|
10910
|
+
return this;
|
10911
|
+
},
|
10912
|
+
|
10913
|
+
setDisplayTransform: function(rule) {
|
10914
|
+
setElementTransform(this.displayRegion, rule);
|
10915
|
+
setElementTransform(this.canvas, rule);
|
10916
|
+
setElementTransform(this.element, rule);
|
10917
|
+
},
|
10918
|
+
|
10675
10919
|
/**
|
10676
10920
|
* Used to update the navigator minimap's viewport rectangle when a change in the viewer's viewport occurs.
|
10677
10921
|
* @function
|
@@ -10799,16 +11043,55 @@ $.extend( $.Navigator.prototype, $.EventSource.prototype, $.Viewer.prototype, /*
|
|
10799
11043
|
}
|
10800
11044
|
});
|
10801
11045
|
|
11046
|
+
|
10802
11047
|
/**
|
10803
11048
|
* @private
|
10804
11049
|
* @inner
|
10805
11050
|
* @function
|
10806
11051
|
*/
|
10807
11052
|
function onCanvasClick( event ) {
|
10808
|
-
|
10809
|
-
|
10810
|
-
|
10811
|
-
|
11053
|
+
var canvasClickEventArgs = {
|
11054
|
+
tracker: event.eventSource,
|
11055
|
+
position: event.position,
|
11056
|
+
quick: event.quick,
|
11057
|
+
shift: event.shift,
|
11058
|
+
originalEvent: event.originalEvent,
|
11059
|
+
preventDefaultAction: event.preventDefaultAction
|
11060
|
+
};
|
11061
|
+
/**
|
11062
|
+
* Raised when a click event occurs on the {@link OpenSeadragon.Viewer#navigator} element.
|
11063
|
+
*
|
11064
|
+
* @event navigator-click
|
11065
|
+
* @memberof OpenSeadragon.Viewer
|
11066
|
+
* @type {object}
|
11067
|
+
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
|
11068
|
+
* @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
|
11069
|
+
* @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
|
11070
|
+
* @property {Boolean} quick - True only if the clickDistThreshold and clickTimeThreshold are both passed. Useful for differentiating between clicks and drags.
|
11071
|
+
* @property {Boolean} shift - True if the shift key was pressed during this event.
|
11072
|
+
* @property {Object} originalEvent - The original DOM event.
|
11073
|
+
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
11074
|
+
* @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.
|
11075
|
+
*/
|
11076
|
+
|
11077
|
+
this.viewer.raiseEvent('navigator-click', canvasClickEventArgs);
|
11078
|
+
|
11079
|
+
if ( !canvasClickEventArgs.preventDefaultAction && event.quick && this.viewer.viewport && (this.panVertical || this.panHorizontal)) {
|
11080
|
+
if(this.viewer.viewport.flipped) {
|
11081
|
+
event.position.x = this.viewport.getContainerSize().x - event.position.x;
|
11082
|
+
}
|
11083
|
+
var target = this.viewport.pointFromPixel(event.position);
|
11084
|
+
if (!this.panVertical) {
|
11085
|
+
// perform only horizonal pan
|
11086
|
+
target.y = this.viewer.viewport.getCenter(true).y;
|
11087
|
+
} else if (!this.panHorizontal) {
|
11088
|
+
// perform only vertical pan
|
11089
|
+
target.x = this.viewer.viewport.getCenter(true).x;
|
11090
|
+
}
|
11091
|
+
this.viewer.viewport.panTo(target);
|
11092
|
+
this.viewer.viewport.applyConstraints();
|
11093
|
+
}
|
11094
|
+
|
10812
11095
|
}
|
10813
11096
|
|
10814
11097
|
/**
|
@@ -10817,13 +11100,47 @@ function onCanvasClick( event ) {
|
|
10817
11100
|
* @function
|
10818
11101
|
*/
|
10819
11102
|
function onCanvasDrag( event ) {
|
10820
|
-
|
10821
|
-
|
11103
|
+
var canvasDragEventArgs = {
|
11104
|
+
tracker: event.eventSource,
|
11105
|
+
position: event.position,
|
11106
|
+
delta: event.delta,
|
11107
|
+
speed: event.speed,
|
11108
|
+
direction: event.direction,
|
11109
|
+
shift: event.shift,
|
11110
|
+
originalEvent: event.originalEvent,
|
11111
|
+
preventDefaultAction: event.preventDefaultAction
|
11112
|
+
};
|
11113
|
+
/**
|
11114
|
+
* Raised when a drag event occurs on the {@link OpenSeadragon.Viewer#navigator} element.
|
11115
|
+
*
|
11116
|
+
* @event navigator-drag
|
11117
|
+
* @memberof OpenSeadragon.Viewer
|
11118
|
+
* @type {object}
|
11119
|
+
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised this event.
|
11120
|
+
* @property {OpenSeadragon.MouseTracker} tracker - A reference to the MouseTracker which originated this event.
|
11121
|
+
* @property {OpenSeadragon.Point} position - The position of the event relative to the tracked element.
|
11122
|
+
* @property {OpenSeadragon.Point} delta - The x,y components of the difference between start drag and end drag.
|
11123
|
+
* @property {Number} speed - Current computed speed, in pixels per second.
|
11124
|
+
* @property {Number} direction - Current computed direction, expressed as an angle counterclockwise relative to the positive X axis (-pi to pi, in radians). Only valid if speed > 0.
|
11125
|
+
* @property {Boolean} shift - True if the shift key was pressed during this event.
|
11126
|
+
* @property {Object} originalEvent - The original DOM event.
|
11127
|
+
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
11128
|
+
* @property {Boolean} preventDefaultAction - Set to true to prevent default click to zoom behaviour. Default: false.
|
11129
|
+
*/
|
11130
|
+
this.viewer.raiseEvent('navigator-drag', canvasDragEventArgs);
|
11131
|
+
|
11132
|
+
if ( !canvasDragEventArgs.preventDefaultAction && this.viewer.viewport ) {
|
11133
|
+
if( !this.panHorizontal ){
|
10822
11134
|
event.delta.x = 0;
|
10823
11135
|
}
|
10824
11136
|
if( !this.panVertical ){
|
10825
11137
|
event.delta.y = 0;
|
10826
11138
|
}
|
11139
|
+
|
11140
|
+
if(this.viewer.viewport.flipped){
|
11141
|
+
event.delta.x = -event.delta.x;
|
11142
|
+
}
|
11143
|
+
|
10827
11144
|
this.viewer.viewport.panBy(
|
10828
11145
|
this.viewport.deltaPointsFromPixels(
|
10829
11146
|
event.delta
|
@@ -10876,7 +11193,7 @@ function onCanvasScroll( event ) {
|
|
10876
11193
|
originalEvent: event.originalEvent
|
10877
11194
|
});
|
10878
11195
|
|
10879
|
-
//
|
11196
|
+
//don't scroll the page up and down if the user is scrolling
|
10880
11197
|
//in the navigator
|
10881
11198
|
return false;
|
10882
11199
|
}
|
@@ -10887,12 +11204,16 @@ function onCanvasScroll( event ) {
|
|
10887
11204
|
* @param {Object} element
|
10888
11205
|
* @param {Number} degrees
|
10889
11206
|
*/
|
10890
|
-
function _setTransformRotate
|
10891
|
-
|
10892
|
-
|
10893
|
-
|
10894
|
-
|
10895
|
-
|
11207
|
+
function _setTransformRotate( element, degrees ) {
|
11208
|
+
setElementTransform(element, "rotate(" + degrees + "deg)");
|
11209
|
+
}
|
11210
|
+
|
11211
|
+
function setElementTransform( element, rule ) {
|
11212
|
+
element.style.webkitTransform = rule;
|
11213
|
+
element.style.mozTransform = rule;
|
11214
|
+
element.style.msTransform = rule;
|
11215
|
+
element.style.oTransform = rule;
|
11216
|
+
element.style.transform = rule;
|
10896
11217
|
}
|
10897
11218
|
|
10898
11219
|
}( OpenSeadragon ));
|
@@ -10956,7 +11277,8 @@ var I18N = {
|
|
10956
11277
|
NextPage: "Next page",
|
10957
11278
|
PreviousPage: "Previous page",
|
10958
11279
|
RotateLeft: "Rotate left",
|
10959
|
-
RotateRight: "Rotate right"
|
11280
|
+
RotateRight: "Rotate right",
|
11281
|
+
Flip: "Flip Horizontally"
|
10960
11282
|
}
|
10961
11283
|
};
|
10962
11284
|
|
@@ -10980,7 +11302,7 @@ $.extend( $, /** @lends OpenSeadragon */{
|
|
10980
11302
|
}
|
10981
11303
|
string = container[ props[ i ] ];
|
10982
11304
|
|
10983
|
-
if ( typeof( string ) != "string" ) {
|
11305
|
+
if ( typeof ( string ) != "string" ) {
|
10984
11306
|
$.console.log( "Untranslated source string:", prop );
|
10985
11307
|
string = ""; // FIXME: this breaks gettext()-style convention, which would return source
|
10986
11308
|
}
|
@@ -11104,10 +11426,10 @@ $.Point.prototype = {
|
|
11104
11426
|
},
|
11105
11427
|
|
11106
11428
|
/**
|
11107
|
-
*
|
11429
|
+
* Subtract another Point to this point and return a new Point.
|
11108
11430
|
* @function
|
11109
|
-
* @param {OpenSeadragon.Point} point The point to
|
11110
|
-
* @returns {OpenSeadragon.Point} A new point representing the
|
11431
|
+
* @param {OpenSeadragon.Point} point The point to subtract vector components.
|
11432
|
+
* @returns {OpenSeadragon.Point} A new point representing the subtraction of the
|
11111
11433
|
* vector components
|
11112
11434
|
*/
|
11113
11435
|
minus: function( point ) {
|
@@ -11379,7 +11701,7 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve
|
|
11379
11701
|
//by asynchronously fetching their configuration data.
|
11380
11702
|
$.EventSource.call( this );
|
11381
11703
|
|
11382
|
-
//we allow options to override anything we
|
11704
|
+
//we allow options to override anything we don't treat as
|
11383
11705
|
//required via idiomatic options or which is functionally
|
11384
11706
|
//set depending on the state of the readiness of this tile
|
11385
11707
|
//source
|
@@ -11438,7 +11760,7 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve
|
|
11438
11760
|
}
|
11439
11761
|
|
11440
11762
|
if (this.url) {
|
11441
|
-
//in case the getImageInfo method is
|
11763
|
+
//in case the getImageInfo method is overridden and/or implies an
|
11442
11764
|
//async mechanism set some safe defaults first
|
11443
11765
|
this.aspectRatio = 1;
|
11444
11766
|
this.dimensions = new $.Point( 10, 10 );
|
@@ -11505,7 +11827,7 @@ $.TileSource.prototype = {
|
|
11505
11827
|
|
11506
11828
|
getTileSize: function( level ) {
|
11507
11829
|
$.console.error(
|
11508
|
-
"[TileSource.getTileSize] is deprecated." +
|
11830
|
+
"[TileSource.getTileSize] is deprecated. " +
|
11509
11831
|
"Use TileSource.getTileWidth() and TileSource.getTileHeight() instead"
|
11510
11832
|
);
|
11511
11833
|
return this._tileWidth;
|
@@ -11626,7 +11948,8 @@ $.TileSource.prototype = {
|
|
11626
11948
|
if (point.x >= 1) {
|
11627
11949
|
x = this.getNumTiles(level).x - 1;
|
11628
11950
|
}
|
11629
|
-
|
11951
|
+
var EPSILON = 1e-15;
|
11952
|
+
if (point.y >= 1 / this.aspectRatio - EPSILON) {
|
11630
11953
|
y = this.getNumTiles(level).y - 1;
|
11631
11954
|
}
|
11632
11955
|
|
@@ -11638,8 +11961,12 @@ $.TileSource.prototype = {
|
|
11638
11961
|
* @param {Number} level
|
11639
11962
|
* @param {Number} x
|
11640
11963
|
* @param {Number} y
|
11964
|
+
* @param {Boolean} [isSource=false] Whether to return the source bounds of the tile.
|
11965
|
+
* @returns {OpenSeadragon.Rect} Either where this tile fits (in normalized coordinates) or the
|
11966
|
+
* portion of the tile to use as the source of the drawing operation (in pixels), depending on
|
11967
|
+
* the isSource parameter.
|
11641
11968
|
*/
|
11642
|
-
getTileBounds: function( level, x, y ) {
|
11969
|
+
getTileBounds: function( level, x, y, isSource ) {
|
11643
11970
|
var dimensionsScaled = this.dimensions.times( this.getLevelScale( level ) ),
|
11644
11971
|
tileWidth = this.getTileWidth(level),
|
11645
11972
|
tileHeight = this.getTileHeight(level),
|
@@ -11652,6 +11979,10 @@ $.TileSource.prototype = {
|
|
11652
11979
|
sx = Math.min( sx, dimensionsScaled.x - px );
|
11653
11980
|
sy = Math.min( sy, dimensionsScaled.y - py );
|
11654
11981
|
|
11982
|
+
if (isSource) {
|
11983
|
+
return new $.Rect(0, 0, sx, sy);
|
11984
|
+
}
|
11985
|
+
|
11655
11986
|
return new $.Rect( px * scale, py * scale, sx * scale, sy * scale );
|
11656
11987
|
},
|
11657
11988
|
|
@@ -11684,7 +12015,7 @@ $.TileSource.prototype = {
|
|
11684
12015
|
}
|
11685
12016
|
|
11686
12017
|
callback = function( data ){
|
11687
|
-
if( typeof(data) === "string" ) {
|
12018
|
+
if( typeof (data) === "string" ) {
|
11688
12019
|
data = $.parseXml( data );
|
11689
12020
|
}
|
11690
12021
|
var $TileSource = $.TileSource.determineType( _this, data, url );
|
@@ -11757,7 +12088,7 @@ $.TileSource.prototype = {
|
|
11757
12088
|
msg = "HTTP " + xhr.status + " attempting to load TileSource";
|
11758
12089
|
} catch ( e ) {
|
11759
12090
|
var formattedExc;
|
11760
|
-
if ( typeof( exc ) == "undefined" || !exc.toString ) {
|
12091
|
+
if ( typeof ( exc ) == "undefined" || !exc.toString ) {
|
11761
12092
|
formattedExc = "Unknown error";
|
11762
12093
|
} else {
|
11763
12094
|
formattedExc = exc.toString();
|
@@ -12077,7 +12408,7 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSead
|
|
12077
12408
|
*
|
12078
12409
|
* @function
|
12079
12410
|
* @param {Object|XMLDocument} data - the raw configuration
|
12080
|
-
* @param {String} url - the url the data was
|
12411
|
+
* @param {String} url - the url the data was retrieved from if any.
|
12081
12412
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
12082
12413
|
* to configure this tile sources constructor.
|
12083
12414
|
*/
|
@@ -12136,6 +12467,10 @@ $.extend( $.DziTileSource.prototype, $.TileSource.prototype, /** @lends OpenSead
|
|
12136
12467
|
yMax,
|
12137
12468
|
i;
|
12138
12469
|
|
12470
|
+
if ((this.minLevel && level < this.minLevel) || (this.maxLevel && level > this.maxLevel)) {
|
12471
|
+
return false;
|
12472
|
+
}
|
12473
|
+
|
12139
12474
|
if ( !rects || !rects.length ) {
|
12140
12475
|
return true;
|
12141
12476
|
}
|
@@ -12370,6 +12705,8 @@ function configureFromObject( tileSource, configuration ){
|
|
12370
12705
|
* @memberof OpenSeadragon
|
12371
12706
|
* @extends OpenSeadragon.TileSource
|
12372
12707
|
* @see http://iiif.io/api/image/
|
12708
|
+
* @param {String} [options.tileFormat='jpg']
|
12709
|
+
* The extension that will be used when requiring tiles.
|
12373
12710
|
*/
|
12374
12711
|
$.IIIFTileSource = function( options ){
|
12375
12712
|
|
@@ -12383,6 +12720,10 @@ $.IIIFTileSource = function( options ){
|
|
12383
12720
|
|
12384
12721
|
options.tileSizePerScaleFactor = {};
|
12385
12722
|
|
12723
|
+
this.tileFormat = this.tileFormat || 'jpg';
|
12724
|
+
|
12725
|
+
this.version = options.version;
|
12726
|
+
|
12386
12727
|
// N.B. 2.0 renamed scale_factors to scaleFactors
|
12387
12728
|
if ( this.tile_width && this.tile_height ) {
|
12388
12729
|
options.tileWidth = this.tile_width;
|
@@ -12412,7 +12753,7 @@ $.IIIFTileSource = function( options ){
|
|
12412
12753
|
}
|
12413
12754
|
}
|
12414
12755
|
}
|
12415
|
-
} else if ( canBeTiled(options
|
12756
|
+
} else if ( canBeTiled(options) ) {
|
12416
12757
|
// use the largest of tileOptions that is smaller than the short dimension
|
12417
12758
|
var shortDim = Math.min( this.height, this.width ),
|
12418
12759
|
tileOptions = [256, 512, 1024],
|
@@ -12455,7 +12796,8 @@ $.IIIFTileSource = function( options ){
|
|
12455
12796
|
if (!this.scale_factors) {
|
12456
12797
|
options.maxLevel = Number(Math.ceil(Math.log(Math.max(this.width, this.height), 2)));
|
12457
12798
|
} else {
|
12458
|
-
|
12799
|
+
var maxScaleFactor = Math.max.apply(null, this.scale_factors);
|
12800
|
+
options.maxLevel = Math.round(Math.log(maxScaleFactor) * Math.LOG2E);
|
12459
12801
|
}
|
12460
12802
|
}
|
12461
12803
|
|
@@ -12524,12 +12866,51 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
|
|
12524
12866
|
var options = configureFromXml10( data );
|
12525
12867
|
options['@context'] = "http://iiif.io/api/image/1.0/context.json";
|
12526
12868
|
options['@id'] = url.replace('/info.xml', '');
|
12869
|
+
options.version = 1;
|
12527
12870
|
return options;
|
12528
|
-
} else if ( !data['@context'] ) {
|
12529
|
-
data['@context'] = 'http://iiif.io/api/image/1.0/context.json';
|
12530
|
-
data['@id'] = url.replace('/info.json', '');
|
12531
|
-
return data;
|
12532
12871
|
} else {
|
12872
|
+
if ( !data['@context'] ) {
|
12873
|
+
data['@context'] = 'http://iiif.io/api/image/1.0/context.json';
|
12874
|
+
data['@id'] = url.replace('/info.json', '');
|
12875
|
+
data.version = 1;
|
12876
|
+
} else {
|
12877
|
+
var context = data['@context'];
|
12878
|
+
if (Array.isArray(context)) {
|
12879
|
+
for (var i = 0; i < context.length; i++) {
|
12880
|
+
if (typeof context[i] === 'string' &&
|
12881
|
+
( /^http:\/\/iiif\.io\/api\/image\/[1-3]\/context\.json$/.test(context[i]) ||
|
12882
|
+
context[i] === 'http://library.stanford.edu/iiif/image-api/1.1/context.json' ) ) {
|
12883
|
+
context = context[i];
|
12884
|
+
break;
|
12885
|
+
}
|
12886
|
+
}
|
12887
|
+
}
|
12888
|
+
switch (context) {
|
12889
|
+
case 'http://iiif.io/api/image/1/context.json':
|
12890
|
+
case 'http://library.stanford.edu/iiif/image-api/1.1/context.json':
|
12891
|
+
data.version = 1;
|
12892
|
+
break;
|
12893
|
+
case 'http://iiif.io/api/image/2/context.json':
|
12894
|
+
data.version = 2;
|
12895
|
+
break;
|
12896
|
+
case 'http://iiif.io/api/image/3/context.json':
|
12897
|
+
data.version = 3;
|
12898
|
+
break;
|
12899
|
+
default:
|
12900
|
+
$.console.error('Data has a @context property which contains no known IIIF context URI.');
|
12901
|
+
}
|
12902
|
+
}
|
12903
|
+
if ( !data['@id'] && data['id'] ) {
|
12904
|
+
data['@id'] = data['id'];
|
12905
|
+
}
|
12906
|
+
if(data.preferredFormats) {
|
12907
|
+
for (var f = 0; f < data.preferredFormats.length; f++ ) {
|
12908
|
+
if ( OpenSeadragon.imageFormatSupported(data.preferredFormats[f]) ) {
|
12909
|
+
data.tileFormat = data.preferredFormats[f];
|
12910
|
+
break;
|
12911
|
+
}
|
12912
|
+
}
|
12913
|
+
}
|
12533
12914
|
return data;
|
12534
12915
|
}
|
12535
12916
|
},
|
@@ -12664,6 +13045,8 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
|
|
12664
13045
|
iiifTileW,
|
12665
13046
|
iiifTileH,
|
12666
13047
|
iiifSize,
|
13048
|
+
iiifSizeW,
|
13049
|
+
iiifSizeH,
|
12667
13050
|
iiifQuality,
|
12668
13051
|
uri;
|
12669
13052
|
|
@@ -12671,29 +13054,52 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
|
|
12671
13054
|
tileHeight = this.getTileHeight(level);
|
12672
13055
|
iiifTileSizeWidth = Math.ceil( tileWidth / scale );
|
12673
13056
|
iiifTileSizeHeight = Math.ceil( tileHeight / scale );
|
12674
|
-
|
12675
|
-
|
12676
|
-
this['@context'].indexOf('/1.1/context.json') > -1 ||
|
12677
|
-
this['@context'].indexOf('/1/context.json') > -1 ) {
|
12678
|
-
iiifQuality = "native.jpg";
|
13057
|
+
if (this.version === 1) {
|
13058
|
+
iiifQuality = "native." + this.tileFormat;
|
12679
13059
|
} else {
|
12680
|
-
iiifQuality = "default.
|
13060
|
+
iiifQuality = "default." + this.tileFormat;
|
12681
13061
|
}
|
12682
|
-
|
12683
13062
|
if ( levelWidth < tileWidth && levelHeight < tileHeight ){
|
12684
|
-
|
13063
|
+
if ( this.version === 2 && levelWidth === this.width ) {
|
13064
|
+
iiifSize = "max";
|
13065
|
+
} else if ( this.version === 3 && levelWidth === this.width && levelHeight === this.height ) {
|
13066
|
+
iiifSize = "max";
|
13067
|
+
} else if ( this.version === 3 ) {
|
13068
|
+
iiifSize = levelWidth + "," + levelHeight;
|
13069
|
+
} else {
|
13070
|
+
iiifSize = levelWidth + ",";
|
13071
|
+
}
|
12685
13072
|
iiifRegion = 'full';
|
12686
13073
|
} else {
|
12687
13074
|
iiifTileX = x * iiifTileSizeWidth;
|
12688
13075
|
iiifTileY = y * iiifTileSizeHeight;
|
12689
13076
|
iiifTileW = Math.min( iiifTileSizeWidth, this.width - iiifTileX );
|
12690
13077
|
iiifTileH = Math.min( iiifTileSizeHeight, this.height - iiifTileY );
|
12691
|
-
|
12692
|
-
|
13078
|
+
if ( x === 0 && y === 0 && iiifTileW === this.width && iiifTileH === this.height ) {
|
13079
|
+
iiifRegion = "full";
|
13080
|
+
} else {
|
13081
|
+
iiifRegion = [ iiifTileX, iiifTileY, iiifTileW, iiifTileH ].join( ',' );
|
13082
|
+
}
|
13083
|
+
iiifSizeW = Math.ceil( iiifTileW * scale );
|
13084
|
+
iiifSizeH = Math.ceil( iiifTileH * scale );
|
13085
|
+
if ( this.version === 2 && iiifSizeW === this.width ) {
|
13086
|
+
iiifSize = "max";
|
13087
|
+
} else if ( this.version === 3 && iiifSizeW === this.width && iiifSizeH === this.height ) {
|
13088
|
+
iiifSize = "max";
|
13089
|
+
} else if (this.version === 3) {
|
13090
|
+
iiifSize = iiifSizeW + "," + iiifSizeH;
|
13091
|
+
} else {
|
13092
|
+
iiifSize = iiifSizeW + ",";
|
13093
|
+
}
|
12693
13094
|
}
|
12694
13095
|
uri = [ this['@id'], iiifRegion, iiifSize, IIIF_ROTATION, iiifQuality ].join( '/' );
|
12695
13096
|
|
12696
13097
|
return uri;
|
13098
|
+
},
|
13099
|
+
|
13100
|
+
__testonly__: {
|
13101
|
+
canBeTiled: canBeTiled,
|
13102
|
+
constructLevels: constructLevels
|
12697
13103
|
}
|
12698
13104
|
|
12699
13105
|
});
|
@@ -12701,17 +13107,27 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
|
|
12701
13107
|
/**
|
12702
13108
|
* Determine whether arbitrary tile requests can be made against a service with the given profile
|
12703
13109
|
* @function
|
12704
|
-
* @param {
|
13110
|
+
* @param {array} profile - IIIF profile array
|
12705
13111
|
* @throws {Error}
|
12706
13112
|
*/
|
12707
|
-
function canBeTiled (
|
13113
|
+
function canBeTiled ( options ) {
|
12708
13114
|
var level0Profiles = [
|
12709
13115
|
"http://library.stanford.edu/iiif/image-api/compliance.html#level0",
|
12710
13116
|
"http://library.stanford.edu/iiif/image-api/1.1/compliance.html#level0",
|
12711
|
-
"http://iiif.io/api/image/2/level0.json"
|
13117
|
+
"http://iiif.io/api/image/2/level0.json",
|
13118
|
+
"level0",
|
13119
|
+
"https://iiif.io/api/image/3/level0.json"
|
12712
13120
|
];
|
12713
|
-
var
|
12714
|
-
|
13121
|
+
var profileLevel = Array.isArray(options.profile) ? options.profile[0] : options.profile;
|
13122
|
+
var isLevel0 = (level0Profiles.indexOf(profileLevel) !== -1);
|
13123
|
+
var hasCanoncicalSizeFeature = false;
|
13124
|
+
if ( options.version === 2 && options.profile.length > 1 && options.profile[1].supports ) {
|
13125
|
+
hasCanoncicalSizeFeature = options.profile[1].supports.indexOf( "sizeByW" ) !== -1;
|
13126
|
+
}
|
13127
|
+
if ( options.version === 3 && options.extraFeatures ) {
|
13128
|
+
hasCanoncicalSizeFeature = options.extraFeatures.indexOf( "sizeByWh" ) !== -1;
|
13129
|
+
}
|
13130
|
+
return !isLevel0 || hasCanoncicalSizeFeature;
|
12715
13131
|
}
|
12716
13132
|
|
12717
13133
|
/**
|
@@ -12724,7 +13140,9 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
|
|
12724
13140
|
var levels = [];
|
12725
13141
|
for(var i = 0; i < options.sizes.length; i++) {
|
12726
13142
|
levels.push({
|
12727
|
-
url: options['@id'] + '/full/' + options.sizes[i].width + '
|
13143
|
+
url: options['@id'] + '/full/' + options.sizes[i].width + ',' +
|
13144
|
+
(options.version === 3 ? options.sizes[i].height : '') +
|
13145
|
+
'/0/default.' + options.tileFormat,
|
12728
13146
|
width: options.sizes[i].width,
|
12729
13147
|
height: options.sizes[i].height
|
12730
13148
|
});
|
@@ -12910,7 +13328,7 @@ $.extend( $.OsmTileSource.prototype, $.TileSource.prototype, /** @lends OpenSead
|
|
12910
13328
|
*
|
12911
13329
|
* @function
|
12912
13330
|
* @param {Object} data - the raw configuration
|
12913
|
-
* @param {String} url - the url the data was
|
13331
|
+
* @param {String} url - the url the data was retrieved from if any.
|
12914
13332
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
12915
13333
|
* to configure this tile sources constructor.
|
12916
13334
|
*/
|
@@ -13045,7 +13463,7 @@ $.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSead
|
|
13045
13463
|
*
|
13046
13464
|
* @function
|
13047
13465
|
* @param {Object} data - the raw configuration
|
13048
|
-
* @param {String} url - the url the data was
|
13466
|
+
* @param {String} url - the url the data was retrieved from if any.
|
13049
13467
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
13050
13468
|
* to configure this tile sources constructor.
|
13051
13469
|
*/
|
@@ -13187,7 +13605,7 @@ $.extend( $.TmsTileSource.prototype, $.TileSource.prototype, /** @lends OpenSead
|
|
13187
13605
|
*
|
13188
13606
|
* @function
|
13189
13607
|
* @param {Object} data - the raw configuration
|
13190
|
-
* @param {String} url - the url the data was
|
13608
|
+
* @param {String} url - the url the data was retrieved from if any.
|
13191
13609
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
13192
13610
|
* to configure this tile sources constructor.
|
13193
13611
|
*/
|
@@ -13337,7 +13755,7 @@ $.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenS
|
|
13337
13755
|
*
|
13338
13756
|
* @function
|
13339
13757
|
* @param {Object|XMLDocument} configuration - the raw configuration
|
13340
|
-
* @param {String} dataUrl - the url the data was
|
13758
|
+
* @param {String} dataUrl - the url the data was retrieved from if any.
|
13341
13759
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
13342
13760
|
* to configure this tile sources constructor.
|
13343
13761
|
*/
|
@@ -13406,7 +13824,7 @@ $.extend( $.LegacyTileSource.prototype, $.TileSource.prototype, /** @lends OpenS
|
|
13406
13824
|
} );
|
13407
13825
|
|
13408
13826
|
/**
|
13409
|
-
* This method removes any files from the Array which
|
13827
|
+
* This method removes any files from the Array which don't conform to our
|
13410
13828
|
* basic requirements for a 'level' in the LegacyTileSource.
|
13411
13829
|
* @private
|
13412
13830
|
* @inner
|
@@ -13595,7 +14013,7 @@ function configureFromObject( tileSource, configuration ){
|
|
13595
14013
|
*
|
13596
14014
|
* @function
|
13597
14015
|
* @param {Object} options - the options
|
13598
|
-
* @param {String} dataUrl - the url the image was
|
14016
|
+
* @param {String} dataUrl - the url the image was retrieved from, if any.
|
13599
14017
|
* @return {Object} options - A dictionary of keyword arguments sufficient
|
13600
14018
|
* to configure this tile sources constructor.
|
13601
14019
|
*/
|
@@ -13705,7 +14123,7 @@ function configureFromObject( tileSource, configuration ){
|
|
13705
14123
|
|
13706
14124
|
// private
|
13707
14125
|
//
|
13708
|
-
// Builds the
|
14126
|
+
// Builds the different levels of the pyramid if possible
|
13709
14127
|
// (i.e. if canvas API enabled and no canvas tainting issue).
|
13710
14128
|
_buildLevels: function () {
|
13711
14129
|
var levels = [{
|
@@ -14394,11 +14812,11 @@ $.ButtonGroup = function( options ) {
|
|
14394
14812
|
|
14395
14813
|
// TODO What if there IS an options.group specified?
|
14396
14814
|
if( !options.group ){
|
14397
|
-
this.
|
14815
|
+
this.element.style.display = "inline-block";
|
14816
|
+
//this.label = $.makeNeutralElement( "label" );
|
14398
14817
|
//TODO: support labels for ButtonGroups
|
14399
14818
|
//this.label.innerHTML = this.labelText;
|
14400
|
-
this.element.
|
14401
|
-
this.element.appendChild( this.label );
|
14819
|
+
//this.element.appendChild( this.label );
|
14402
14820
|
for ( i = 0; i < buttons.length; i++ ) {
|
14403
14821
|
this.element.appendChild( buttons[ i ].element );
|
14404
14822
|
}
|
@@ -14407,7 +14825,7 @@ $.ButtonGroup = function( options ) {
|
|
14407
14825
|
$.setElementTouchActionNone( this.element );
|
14408
14826
|
|
14409
14827
|
/**
|
14410
|
-
* Tracks mouse/touch/key events
|
14828
|
+
* Tracks mouse/touch/key events across the group of buttons.
|
14411
14829
|
* @member {OpenSeadragon.MouseTracker} tracker
|
14412
14830
|
* @memberof OpenSeadragon.ButtonGroup#
|
14413
14831
|
*/
|
@@ -14519,27 +14937,32 @@ $.Rect = function(x, y, width, height, degrees) {
|
|
14519
14937
|
* @member {Number} x
|
14520
14938
|
* @memberof OpenSeadragon.Rect#
|
14521
14939
|
*/
|
14522
|
-
this.x = typeof(x) === "number" ? x : 0;
|
14940
|
+
this.x = typeof (x) === "number" ? x : 0;
|
14523
14941
|
/**
|
14524
14942
|
* The vector component 'y'.
|
14525
14943
|
* @member {Number} y
|
14526
14944
|
* @memberof OpenSeadragon.Rect#
|
14527
14945
|
*/
|
14528
|
-
this.y = typeof(y) === "number" ? y : 0;
|
14946
|
+
this.y = typeof (y) === "number" ? y : 0;
|
14529
14947
|
/**
|
14530
14948
|
* The vector component 'width'.
|
14531
14949
|
* @member {Number} width
|
14532
14950
|
* @memberof OpenSeadragon.Rect#
|
14533
14951
|
*/
|
14534
|
-
this.width = typeof(width) === "number" ? width : 0;
|
14952
|
+
this.width = typeof (width) === "number" ? width : 0;
|
14535
14953
|
/**
|
14536
14954
|
* The vector component 'height'.
|
14537
14955
|
* @member {Number} height
|
14538
14956
|
* @memberof OpenSeadragon.Rect#
|
14539
14957
|
*/
|
14540
|
-
this.height = typeof(height) === "number" ? height : 0;
|
14958
|
+
this.height = typeof (height) === "number" ? height : 0;
|
14541
14959
|
|
14542
|
-
|
14960
|
+
/**
|
14961
|
+
* The rotation of the rectangle, in degrees.
|
14962
|
+
* @member {Number} degrees
|
14963
|
+
* @memberof OpenSeadragon.Rect#
|
14964
|
+
*/
|
14965
|
+
this.degrees = typeof (degrees) === "number" ? degrees : 0;
|
14543
14966
|
|
14544
14967
|
// Normalizes the rectangle.
|
14545
14968
|
this.degrees = $.positiveModulo(this.degrees, 360);
|
@@ -15073,7 +15496,7 @@ var THIS = {};
|
|
15073
15496
|
* TODO: The difficult part of this feature is figuring out how to express
|
15074
15497
|
* this functionality as a combination of the functionality already
|
15075
15498
|
* provided by Drawer, Viewport, TileSource, and Navigator. It may
|
15076
|
-
* require better abstraction at those points in order to
|
15499
|
+
* require better abstraction at those points in order to efficiently
|
15077
15500
|
* reuse those paradigms.
|
15078
15501
|
*/
|
15079
15502
|
/**
|
@@ -15256,7 +15679,7 @@ $.extend( $.ReferenceStrip.prototype, $.EventSource.prototype, $.Viewer.prototyp
|
|
15256
15679
|
* @function
|
15257
15680
|
*/
|
15258
15681
|
setFocus: function ( page ) {
|
15259
|
-
var element =
|
15682
|
+
var element = this.element.querySelector('#' + this.element.id + '-' + page ),
|
15260
15683
|
viewerSize = $.getElementSize( this.viewer.canvas ),
|
15261
15684
|
scrollWidth = Number( this.element.style.width.replace( 'px', '' ) ),
|
15262
15685
|
scrollHeight = Number( this.element.style.height.replace( 'px', '' ) ),
|
@@ -15469,7 +15892,10 @@ function loadPanels( strip, viewerSize, scroll ) {
|
|
15469
15892
|
showSequenceControl: false,
|
15470
15893
|
immediateRender: true,
|
15471
15894
|
blendTime: 0,
|
15472
|
-
animationTime: 0
|
15895
|
+
animationTime: 0,
|
15896
|
+
loadTilesWithAjax: strip.viewer.loadTilesWithAjax,
|
15897
|
+
ajaxHeaders: strip.viewer.ajaxHeaders,
|
15898
|
+
useCanvas: strip.useCanvas
|
15473
15899
|
} );
|
15474
15900
|
|
15475
15901
|
miniViewer.displayRegion = $.makeNeutralElement( "div" );
|
@@ -15757,7 +16183,7 @@ $.extend( $.DisplayRect.prototype, $.Rect.prototype );
|
|
15757
16183
|
$.Spring = function( options ) {
|
15758
16184
|
var args = arguments;
|
15759
16185
|
|
15760
|
-
if( typeof( options ) != 'object' ){
|
16186
|
+
if( typeof ( options ) != 'object' ){
|
15761
16187
|
//allows backward compatible use of ( initialValue, config ) as
|
15762
16188
|
//constructor parameters
|
15763
16189
|
options = {
|
@@ -16053,7 +16479,7 @@ ImageJob.prototype = {
|
|
16053
16479
|
};
|
16054
16480
|
|
16055
16481
|
this.jobId = window.setTimeout(function(){
|
16056
|
-
self.errorMsg = "Image load exceeded timeout";
|
16482
|
+
self.errorMsg = "Image load exceeded timeout (" + self.timeout + " ms)";
|
16057
16483
|
self.finish(false);
|
16058
16484
|
}, this.timeout);
|
16059
16485
|
|
@@ -16278,7 +16704,7 @@ function completeJob(loader, job, callback) {
|
|
16278
16704
|
* @param {Number} level The zoom level this tile belongs to.
|
16279
16705
|
* @param {Number} x The vector component 'x'.
|
16280
16706
|
* @param {Number} y The vector component 'y'.
|
16281
|
-
* @param {OpenSeadragon.
|
16707
|
+
* @param {OpenSeadragon.Rect} bounds Where this tile fits, in normalized
|
16282
16708
|
* coordinates.
|
16283
16709
|
* @param {Boolean} exists Is this tile a part of a sparse image? ( Also has
|
16284
16710
|
* this tile failed to load? )
|
@@ -16287,8 +16713,11 @@ function completeJob(loader, job, callback) {
|
|
16287
16713
|
* is provided directly by the tile source.
|
16288
16714
|
* @param {Boolean} loadWithAjax Whether this tile image should be loaded with an AJAX request .
|
16289
16715
|
* @param {Object} ajaxHeaders The headers to send with this tile's AJAX request (if applicable).
|
16716
|
+
* @param {OpenSeadragon.Rect} sourceBounds The portion of the tile to use as the source of the
|
16717
|
+
* drawing operation, in pixels. Note that this only works when drawing with canvas; when drawing
|
16718
|
+
* with HTML the entire tile is always used.
|
16290
16719
|
*/
|
16291
|
-
$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders) {
|
16720
|
+
$.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, ajaxHeaders, sourceBounds) {
|
16292
16721
|
/**
|
16293
16722
|
* The zoom level this tile belongs to.
|
16294
16723
|
* @member {Number} level
|
@@ -16313,6 +16742,13 @@ $.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, aja
|
|
16313
16742
|
* @memberof OpenSeadragon.Tile#
|
16314
16743
|
*/
|
16315
16744
|
this.bounds = bounds;
|
16745
|
+
/**
|
16746
|
+
* The portion of the tile to use as the source of the drawing operation, in pixels. Note that
|
16747
|
+
* this only works when drawing with canvas; when drawing with HTML the entire tile is always used.
|
16748
|
+
* @member {OpenSeadragon.Rect} sourceBounds
|
16749
|
+
* @memberof OpenSeadragon.Tile#
|
16750
|
+
*/
|
16751
|
+
this.sourceBounds = sourceBounds;
|
16316
16752
|
/**
|
16317
16753
|
* Is this tile a part of a sparse image? Also has this tile failed to load?
|
16318
16754
|
* @member {Boolean} exists
|
@@ -16437,12 +16873,27 @@ $.Tile = function(level, x, y, bounds, exists, url, context2D, loadWithAjax, aja
|
|
16437
16873
|
* @memberof OpenSeadragon.Tile#
|
16438
16874
|
*/
|
16439
16875
|
this.beingDrawn = false;
|
16876
|
+
|
16440
16877
|
/**
|
16441
16878
|
* Timestamp the tile was last touched.
|
16442
16879
|
* @member {Number} lastTouchTime
|
16443
16880
|
* @memberof OpenSeadragon.Tile#
|
16444
16881
|
*/
|
16445
16882
|
this.lastTouchTime = 0;
|
16883
|
+
|
16884
|
+
/**
|
16885
|
+
* Whether this tile is in the right-most column for its level.
|
16886
|
+
* @member {Boolean} isRightMost
|
16887
|
+
* @memberof OpenSeadragon.Tile#
|
16888
|
+
*/
|
16889
|
+
this.isRightMost = false;
|
16890
|
+
|
16891
|
+
/**
|
16892
|
+
* Whether this tile is in the bottom-most row for its level.
|
16893
|
+
* @member {Boolean} isBottomMost
|
16894
|
+
* @memberof OpenSeadragon.Tile#
|
16895
|
+
*/
|
16896
|
+
this.isBottomMost = false;
|
16446
16897
|
};
|
16447
16898
|
|
16448
16899
|
/** @lends OpenSeadragon.Tile.prototype */
|
@@ -16569,10 +17020,10 @@ $.Tile.prototype = {
|
|
16569
17020
|
//clearing only the inside of the rectangle occupied
|
16570
17021
|
//by the png prevents edge flikering
|
16571
17022
|
context.clearRect(
|
16572
|
-
position.x
|
16573
|
-
position.y
|
16574
|
-
size.x
|
16575
|
-
size.y
|
17023
|
+
position.x,
|
17024
|
+
position.y,
|
17025
|
+
size.x,
|
17026
|
+
size.y
|
16576
17027
|
);
|
16577
17028
|
}
|
16578
17029
|
|
@@ -16580,12 +17031,21 @@ $.Tile.prototype = {
|
|
16580
17031
|
// changes as we are rendering the image
|
16581
17032
|
drawingHandler({context: context, tile: this, rendered: rendered});
|
16582
17033
|
|
17034
|
+
var sourceWidth, sourceHeight;
|
17035
|
+
if (this.sourceBounds) {
|
17036
|
+
sourceWidth = Math.min(this.sourceBounds.width, rendered.canvas.width);
|
17037
|
+
sourceHeight = Math.min(this.sourceBounds.height, rendered.canvas.height);
|
17038
|
+
} else {
|
17039
|
+
sourceWidth = rendered.canvas.width;
|
17040
|
+
sourceHeight = rendered.canvas.height;
|
17041
|
+
}
|
17042
|
+
|
16583
17043
|
context.drawImage(
|
16584
17044
|
rendered.canvas,
|
16585
17045
|
0,
|
16586
17046
|
0,
|
16587
|
-
|
16588
|
-
|
17047
|
+
sourceWidth,
|
17048
|
+
sourceHeight,
|
16589
17049
|
position.x,
|
16590
17050
|
position.y,
|
16591
17051
|
size.x,
|
@@ -16755,7 +17215,7 @@ $.Tile.prototype = {
|
|
16755
17215
|
* Defines what part of the overlay should be at the specified options.location
|
16756
17216
|
* @param {OpenSeadragon.Overlay.OnDrawCallback} [options.onDraw]
|
16757
17217
|
* @param {Boolean} [options.checkResize=true] Set to false to avoid to
|
16758
|
-
* check the size of the overlay
|
17218
|
+
* check the size of the overlay every time it is drawn in the directions
|
16759
17219
|
* which are not scaled. It will improve performances but will cause a
|
16760
17220
|
* misalignment if the overlay size changes.
|
16761
17221
|
* @param {Number} [options.width] The width of the overlay in viewport
|
@@ -17189,7 +17649,7 @@ $.Drawer = function( options ) {
|
|
17189
17649
|
|
17190
17650
|
$.console.assert( options.viewer, "[Drawer] options.viewer is required" );
|
17191
17651
|
|
17192
|
-
//backward compatibility for positional args while
|
17652
|
+
//backward compatibility for positional args while preferring more
|
17193
17653
|
//idiomatic javascript options object as the only argument
|
17194
17654
|
var args = arguments;
|
17195
17655
|
|
@@ -17210,7 +17670,7 @@ $.Drawer = function( options ) {
|
|
17210
17670
|
|
17211
17671
|
this.viewer = options.viewer;
|
17212
17672
|
this.viewport = options.viewport;
|
17213
|
-
this.debugGridColor = options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;
|
17673
|
+
this.debugGridColor = typeof options.debugGridColor === 'string' ? [options.debugGridColor] : options.debugGridColor || $.DEFAULT_SETTINGS.debugGridColor;
|
17214
17674
|
if (options.opacity) {
|
17215
17675
|
$.console.error( "[Drawer] options.opacity is no longer accepted; set the opacity on the TiledImage instead" );
|
17216
17676
|
}
|
@@ -17271,6 +17731,10 @@ $.Drawer = function( options ) {
|
|
17271
17731
|
// explicit left-align
|
17272
17732
|
this.container.style.textAlign = "left";
|
17273
17733
|
this.container.appendChild( this.canvas );
|
17734
|
+
|
17735
|
+
// Image smoothing for canvas rendering (only if canvas is used).
|
17736
|
+
// Canvas default is "true", so this will only be changed if user specified "false".
|
17737
|
+
this._imageSmoothingEnabled = true;
|
17274
17738
|
};
|
17275
17739
|
|
17276
17740
|
/** @lends OpenSeadragon.Drawer.prototype */
|
@@ -17303,6 +17767,41 @@ $.Drawer.prototype = {
|
|
17303
17767
|
return this;
|
17304
17768
|
},
|
17305
17769
|
|
17770
|
+
/**
|
17771
|
+
* This function converts the given point from to the drawer coordinate by
|
17772
|
+
* multiplying it with the pixel density.
|
17773
|
+
* This function does not take rotation into account, thus assuming provided
|
17774
|
+
* point is at 0 degree.
|
17775
|
+
* @param {OpenSeadragon.Point} point - the pixel point to convert
|
17776
|
+
*/
|
17777
|
+
viewportCoordToDrawerCoord: function(point) {
|
17778
|
+
var vpPoint = this.viewport.pixelFromPointNoRotate(point, true);
|
17779
|
+
return new $.Point(
|
17780
|
+
vpPoint.x * $.pixelDensityRatio,
|
17781
|
+
vpPoint.y * $.pixelDensityRatio
|
17782
|
+
);
|
17783
|
+
},
|
17784
|
+
|
17785
|
+
/**
|
17786
|
+
* This function will create multiple polygon paths on the drawing context by provided polygons,
|
17787
|
+
* then clip the context to the paths.
|
17788
|
+
* @param {(OpenSeadragon.Point[])[]} polygons - an array of polygons. A polygon is an array of OpenSeadragon.Point
|
17789
|
+
* @param {Boolean} useSketch - Whether to use the sketch canvas or not.
|
17790
|
+
*/
|
17791
|
+
clipWithPolygons: function (polygons, useSketch) {
|
17792
|
+
if (!this.useCanvas) {
|
17793
|
+
return;
|
17794
|
+
}
|
17795
|
+
var context = this._getContext(useSketch);
|
17796
|
+
context.beginPath();
|
17797
|
+
polygons.forEach(function (polygon) {
|
17798
|
+
polygon.forEach(function (coord, i) {
|
17799
|
+
context[i === 0 ? 'moveTo' : 'lineTo'](coord.x, coord.y);
|
17800
|
+
});
|
17801
|
+
});
|
17802
|
+
context.clip();
|
17803
|
+
},
|
17804
|
+
|
17306
17805
|
/**
|
17307
17806
|
* Set the opacity of the drawer.
|
17308
17807
|
* @param {Number} opacity
|
@@ -17390,10 +17889,12 @@ $.Drawer.prototype = {
|
|
17390
17889
|
this.canvas.height != viewportSize.y ) {
|
17391
17890
|
this.canvas.width = viewportSize.x;
|
17392
17891
|
this.canvas.height = viewportSize.y;
|
17892
|
+
this._updateImageSmoothingEnabled(this.context);
|
17393
17893
|
if ( this.sketchCanvas !== null ) {
|
17394
17894
|
var sketchCanvasSize = this._calculateSketchCanvasSize();
|
17395
17895
|
this.sketchCanvas.width = sketchCanvasSize.x;
|
17396
17896
|
this.sketchCanvas.height = sketchCanvasSize.y;
|
17897
|
+
this._updateImageSmoothingEnabled(this.sketchContext);
|
17397
17898
|
}
|
17398
17899
|
}
|
17399
17900
|
this._clear();
|
@@ -17479,6 +17980,7 @@ $.Drawer.prototype = {
|
|
17479
17980
|
self.sketchCanvas.height = sketchCanvasSize.y;
|
17480
17981
|
});
|
17481
17982
|
}
|
17983
|
+
this._updateImageSmoothingEnabled(this.sketchContext);
|
17482
17984
|
}
|
17483
17985
|
context = this.sketchContext;
|
17484
17986
|
}
|
@@ -17631,12 +18133,13 @@ $.Drawer.prototype = {
|
|
17631
18133
|
return;
|
17632
18134
|
}
|
17633
18135
|
|
18136
|
+
var colorIndex = this.viewer.world.getIndexOfItem(tiledImage) % this.debugGridColor.length;
|
17634
18137
|
var context = this.context;
|
17635
18138
|
context.save();
|
17636
18139
|
context.lineWidth = 2 * $.pixelDensityRatio;
|
17637
18140
|
context.font = 'small-caps bold ' + (13 * $.pixelDensityRatio) + 'px arial';
|
17638
|
-
context.strokeStyle = this.debugGridColor;
|
17639
|
-
context.fillStyle = this.debugGridColor;
|
18141
|
+
context.strokeStyle = this.debugGridColor[colorIndex];
|
18142
|
+
context.fillStyle = this.debugGridColor[colorIndex];
|
17640
18143
|
|
17641
18144
|
if ( this.viewport.degrees !== 0 ) {
|
17642
18145
|
this._offsetForRotation({degrees: this.viewport.degrees});
|
@@ -17648,6 +18151,11 @@ $.Drawer.prototype = {
|
|
17648
18151
|
tiledImage._getRotationPoint(true), true)
|
17649
18152
|
});
|
17650
18153
|
}
|
18154
|
+
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
18155
|
+
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
18156
|
+
tiledImage._drawer._flip();
|
18157
|
+
}
|
18158
|
+
}
|
17651
18159
|
|
17652
18160
|
context.strokeRect(
|
17653
18161
|
tile.position.x * $.pixelDensityRatio,
|
@@ -17713,6 +18221,13 @@ $.Drawer.prototype = {
|
|
17713
18221
|
if (tiledImage.getRotation(true) % 360 !== 0) {
|
17714
18222
|
this._restoreRotationChanges();
|
17715
18223
|
}
|
18224
|
+
|
18225
|
+
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
18226
|
+
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
18227
|
+
tiledImage._drawer._flip();
|
18228
|
+
}
|
18229
|
+
}
|
18230
|
+
|
17716
18231
|
context.restore();
|
17717
18232
|
},
|
17718
18233
|
|
@@ -17722,8 +18237,8 @@ $.Drawer.prototype = {
|
|
17722
18237
|
var context = this.context;
|
17723
18238
|
context.save();
|
17724
18239
|
context.lineWidth = 2 * $.pixelDensityRatio;
|
17725
|
-
context.strokeStyle = this.debugGridColor;
|
17726
|
-
context.fillStyle = this.debugGridColor;
|
18240
|
+
context.strokeStyle = this.debugGridColor[0];
|
18241
|
+
context.fillStyle = this.debugGridColor[0];
|
17727
18242
|
|
17728
18243
|
context.strokeRect(
|
17729
18244
|
rect.x * $.pixelDensityRatio,
|
@@ -17736,6 +18251,28 @@ $.Drawer.prototype = {
|
|
17736
18251
|
}
|
17737
18252
|
},
|
17738
18253
|
|
18254
|
+
/**
|
18255
|
+
* Turns image smoothing on or off for this viewer. Note: Ignored in some (especially older) browsers that do not support this property.
|
18256
|
+
*
|
18257
|
+
* @function
|
18258
|
+
* @param {Boolean} [imageSmoothingEnabled] - Whether or not the image is
|
18259
|
+
* drawn smoothly on the canvas; see imageSmoothingEnabled in
|
18260
|
+
* {@link OpenSeadragon.Options} for more explanation.
|
18261
|
+
*/
|
18262
|
+
setImageSmoothingEnabled: function(imageSmoothingEnabled){
|
18263
|
+
if ( this.useCanvas ) {
|
18264
|
+
this._imageSmoothingEnabled = imageSmoothingEnabled;
|
18265
|
+
this._updateImageSmoothingEnabled(this.context);
|
18266
|
+
this.viewer.forceRedraw();
|
18267
|
+
}
|
18268
|
+
},
|
18269
|
+
|
18270
|
+
// private
|
18271
|
+
_updateImageSmoothingEnabled: function(context){
|
18272
|
+
context.msImageSmoothingEnabled = this._imageSmoothingEnabled;
|
18273
|
+
context.imageSmoothingEnabled = this._imageSmoothingEnabled;
|
18274
|
+
},
|
18275
|
+
|
17739
18276
|
/**
|
17740
18277
|
* Get the canvas size
|
17741
18278
|
* @param {Boolean} sketch If set to true return the size of the sketch canvas
|
@@ -17760,10 +18297,28 @@ $.Drawer.prototype = {
|
|
17760
18297
|
context.save();
|
17761
18298
|
|
17762
18299
|
context.translate(point.x, point.y);
|
17763
|
-
|
18300
|
+
if(this.viewer.viewport.flipped){
|
18301
|
+
context.rotate(Math.PI / 180 * -options.degrees);
|
18302
|
+
context.scale(-1, 1);
|
18303
|
+
} else{
|
18304
|
+
context.rotate(Math.PI / 180 * options.degrees);
|
18305
|
+
}
|
17764
18306
|
context.translate(-point.x, -point.y);
|
17765
18307
|
},
|
17766
18308
|
|
18309
|
+
// private
|
18310
|
+
_flip: function(options) {
|
18311
|
+
options = options || {};
|
18312
|
+
var point = options.point ?
|
18313
|
+
options.point.times($.pixelDensityRatio) :
|
18314
|
+
this.getCanvasCenter();
|
18315
|
+
var context = this._getContext(options.useSketch);
|
18316
|
+
|
18317
|
+
context.translate(point.x, 0);
|
18318
|
+
context.scale(-1, 1);
|
18319
|
+
context.translate(-point.x, 0);
|
18320
|
+
},
|
18321
|
+
|
17767
18322
|
// private
|
17768
18323
|
_restoreRotationChanges: function(useSketch) {
|
17769
18324
|
var context = this._getContext(useSketch);
|
@@ -17775,8 +18330,9 @@ $.Drawer.prototype = {
|
|
17775
18330
|
var pixelDensityRatio = $.pixelDensityRatio;
|
17776
18331
|
var viewportSize = this.viewport.getContainerSize();
|
17777
18332
|
return {
|
17778
|
-
|
17779
|
-
|
18333
|
+
// canvas width and height are integers
|
18334
|
+
x: Math.round(viewportSize.x * pixelDensityRatio),
|
18335
|
+
y: Math.round(viewportSize.y * pixelDensityRatio)
|
17780
18336
|
};
|
17781
18337
|
},
|
17782
18338
|
|
@@ -17859,7 +18415,7 @@ $.Drawer.prototype = {
|
|
17859
18415
|
*/
|
17860
18416
|
$.Viewport = function( options ) {
|
17861
18417
|
|
17862
|
-
//backward compatibility for positional args while
|
18418
|
+
//backward compatibility for positional args while preferring more
|
17863
18419
|
//idiomatic javascript options object as the only argument
|
17864
18420
|
var args = arguments;
|
17865
18421
|
if (args.length && args[0] instanceof $.Point) {
|
@@ -17909,6 +18465,7 @@ $.Viewport = function( options ) {
|
|
17909
18465
|
minZoomLevel: $.DEFAULT_SETTINGS.minZoomLevel,
|
17910
18466
|
maxZoomLevel: $.DEFAULT_SETTINGS.maxZoomLevel,
|
17911
18467
|
degrees: $.DEFAULT_SETTINGS.degrees,
|
18468
|
+
flipped: $.DEFAULT_SETTINGS.flipped,
|
17912
18469
|
homeFillsViewer: $.DEFAULT_SETTINGS.homeFillsViewer
|
17913
18470
|
|
17914
18471
|
}, options );
|
@@ -18676,13 +19233,13 @@ $.Viewport.prototype = {
|
|
18676
19233
|
/**
|
18677
19234
|
* Rotates this viewport to the angle specified.
|
18678
19235
|
* @function
|
19236
|
+
* @param {Number} degrees The degrees to set the rotation to.
|
18679
19237
|
* @return {OpenSeadragon.Viewport} Chainable.
|
18680
19238
|
*/
|
18681
19239
|
setRotation: function(degrees) {
|
18682
19240
|
if (!this.viewer || !this.viewer.drawer.canRotate()) {
|
18683
19241
|
return this;
|
18684
19242
|
}
|
18685
|
-
|
18686
19243
|
this.degrees = $.positiveModulo(degrees, 360);
|
18687
19244
|
this._setContentBounds(
|
18688
19245
|
this.viewer.world.getHomeBounds(),
|
@@ -19320,7 +19877,58 @@ $.Viewport.prototype = {
|
|
19320
19877
|
var scale = this._contentBoundsNoRotate.width;
|
19321
19878
|
var viewportToImageZoomRatio = (imageWidth / containerWidth) / scale;
|
19322
19879
|
return imageZoom * viewportToImageZoomRatio;
|
19880
|
+
},
|
19881
|
+
|
19882
|
+
/**
|
19883
|
+
* Toggles flip state and demands a new drawing on navigator and viewer objects.
|
19884
|
+
* @function
|
19885
|
+
* @return {OpenSeadragon.Viewport} Chainable.
|
19886
|
+
*/
|
19887
|
+
toggleFlip: function() {
|
19888
|
+
this.setFlip(!this.getFlip());
|
19889
|
+
return this;
|
19890
|
+
},
|
19891
|
+
|
19892
|
+
/**
|
19893
|
+
* Get flip state stored on viewport.
|
19894
|
+
* @function
|
19895
|
+
* @return {Boolean} Flip state.
|
19896
|
+
*/
|
19897
|
+
getFlip: function() {
|
19898
|
+
return this.flipped;
|
19899
|
+
},
|
19900
|
+
|
19901
|
+
/**
|
19902
|
+
* Sets flip state according to the state input argument.
|
19903
|
+
* @function
|
19904
|
+
* @param {Boolean} state - Flip state to set.
|
19905
|
+
* @return {OpenSeadragon.Viewport} Chainable.
|
19906
|
+
*/
|
19907
|
+
setFlip: function( state ) {
|
19908
|
+
if ( this.flipped === state ) {
|
19909
|
+
return this;
|
19910
|
+
}
|
19911
|
+
|
19912
|
+
this.flipped = state;
|
19913
|
+
if(this.viewer.navigator){
|
19914
|
+
this.viewer.navigator.setFlip(this.getFlip());
|
19915
|
+
}
|
19916
|
+
this.viewer.forceRedraw();
|
19917
|
+
|
19918
|
+
/**
|
19919
|
+
* Raised when flip state has been changed.
|
19920
|
+
*
|
19921
|
+
* @event flip
|
19922
|
+
* @memberof OpenSeadragon.Viewer
|
19923
|
+
* @type {object}
|
19924
|
+
* @property {OpenSeadragon.Viewer} eventSource - A reference to the Viewer which raised the event.
|
19925
|
+
* @property {Number} flipped - The flip state after this change.
|
19926
|
+
* @property {?Object} userData - Arbitrary subscriber-defined object.
|
19927
|
+
*/
|
19928
|
+
this.viewer.raiseEvent('flip', {"flipped": state});
|
19929
|
+
return this;
|
19323
19930
|
}
|
19931
|
+
|
19324
19932
|
};
|
19325
19933
|
|
19326
19934
|
}( OpenSeadragon ));
|
@@ -19362,8 +19970,8 @@ $.Viewport.prototype = {
|
|
19362
19970
|
(function( $ ){
|
19363
19971
|
|
19364
19972
|
/**
|
19365
|
-
* You shouldn't have to create a TiledImage directly;
|
19366
|
-
* or {@link OpenSeadragon.Viewer#addTiledImage} instead.
|
19973
|
+
* You shouldn't have to create a TiledImage instance directly; get it asynchronously by
|
19974
|
+
* using {@link OpenSeadragon.Viewer#open} or {@link OpenSeadragon.Viewer#addTiledImage} instead.
|
19367
19975
|
* @class TiledImage
|
19368
19976
|
* @memberof OpenSeadragon
|
19369
19977
|
* @extends OpenSeadragon.EventSource
|
@@ -19412,7 +20020,11 @@ $.Viewport.prototype = {
|
|
19412
20020
|
*/
|
19413
20021
|
$.TiledImage = function( options ) {
|
19414
20022
|
var _this = this;
|
19415
|
-
|
20023
|
+
/**
|
20024
|
+
* The {@link OpenSeadragon.TileSource} that defines this TiledImage.
|
20025
|
+
* @member {OpenSeadragon.TileSource} source
|
20026
|
+
* @memberof OpenSeadragon.TiledImage#
|
20027
|
+
*/
|
19416
20028
|
$.console.assert( options.tileCache, "[TiledImage] options.tileCache is required" );
|
19417
20029
|
$.console.assert( options.drawer, "[TiledImage] options.drawer is required" );
|
19418
20030
|
$.console.assert( options.viewer, "[TiledImage] options.viewer is required" );
|
@@ -19638,6 +20250,10 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|
19638
20250
|
this._updateViewport();
|
19639
20251
|
this._midDraw = false;
|
19640
20252
|
}
|
20253
|
+
// Images with opacity 0 should not need to be drawn in future. this._needsDraw = false is set in this._updateViewport() for other images.
|
20254
|
+
else {
|
20255
|
+
this._needsDraw = false;
|
20256
|
+
}
|
19641
20257
|
},
|
19642
20258
|
|
19643
20259
|
/**
|
@@ -19993,6 +20609,58 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|
19993
20609
|
this._setScale(height / this.normHeight, immediately);
|
19994
20610
|
},
|
19995
20611
|
|
20612
|
+
/**
|
20613
|
+
* Sets an array of polygons to crop the TiledImage during draw tiles.
|
20614
|
+
* The render function will use the default non-zero winding rule.
|
20615
|
+
* @param Polygons represented in an array of point object in image coordinates.
|
20616
|
+
* Example format: [
|
20617
|
+
* [{x: 197, y:172}, {x: 226, y:172}, {x: 226, y:198}, {x: 197, y:198}], // First polygon
|
20618
|
+
* [{x: 328, y:200}, {x: 330, y:199}, {x: 332, y:201}, {x: 329, y:202}] // Second polygon
|
20619
|
+
* [{x: 321, y:201}, {x: 356, y:205}, {x: 341, y:250}] // Third polygon
|
20620
|
+
* ]
|
20621
|
+
*/
|
20622
|
+
setCroppingPolygons: function( polygons ) {
|
20623
|
+
|
20624
|
+
var isXYObject = function(obj) {
|
20625
|
+
return obj instanceof $.Point || (typeof obj.x === 'number' && typeof obj.y === 'number');
|
20626
|
+
};
|
20627
|
+
|
20628
|
+
var objectToSimpleXYObject = function(objs) {
|
20629
|
+
return objs.map(function(obj) {
|
20630
|
+
try {
|
20631
|
+
if (isXYObject(obj)) {
|
20632
|
+
return { x: obj.x, y: obj.y };
|
20633
|
+
} else {
|
20634
|
+
throw new Error();
|
20635
|
+
}
|
20636
|
+
} catch(e) {
|
20637
|
+
throw new Error('A Provided cropping polygon point is not supported');
|
20638
|
+
}
|
20639
|
+
});
|
20640
|
+
};
|
20641
|
+
|
20642
|
+
try {
|
20643
|
+
if (!$.isArray(polygons)) {
|
20644
|
+
throw new Error('Provided cropping polygon is not an array');
|
20645
|
+
}
|
20646
|
+
this._croppingPolygons = polygons.map(function(polygon){
|
20647
|
+
return objectToSimpleXYObject(polygon);
|
20648
|
+
});
|
20649
|
+
} catch (e) {
|
20650
|
+
$.console.error('[TiledImage.setCroppingPolygons] Cropping polygon format not supported');
|
20651
|
+
$.console.error(e);
|
20652
|
+
this._croppingPolygons = null;
|
20653
|
+
}
|
20654
|
+
},
|
20655
|
+
|
20656
|
+
/**
|
20657
|
+
* Resets the cropping polygons, thus next render will remove all cropping
|
20658
|
+
* polygon effects.
|
20659
|
+
*/
|
20660
|
+
resetCroppingPolygons: function() {
|
20661
|
+
this._croppingPolygons = null;
|
20662
|
+
},
|
20663
|
+
|
19996
20664
|
/**
|
19997
20665
|
* Positions and scales the TiledImage to fit in the specified bounds.
|
19998
20666
|
* Note: this method fires OpenSeadragon.TiledImage.event:bounds-change
|
@@ -20176,8 +20844,8 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|
20176
20844
|
},
|
20177
20845
|
|
20178
20846
|
/**
|
20179
|
-
* @private
|
20180
20847
|
* Get the point around which this tiled image is rotated
|
20848
|
+
* @private
|
20181
20849
|
* @param {Boolean} current True for current rotation point, false for target.
|
20182
20850
|
* @returns {OpenSeadragon.Point}
|
20183
20851
|
*/
|
@@ -20291,6 +20959,7 @@ $.extend($.TiledImage.prototype, $.EventSource.prototype, /** @lends OpenSeadrag
|
|
20291
20959
|
|
20292
20960
|
// Calculations for the interval of levels to draw
|
20293
20961
|
// can return invalid intervals; fix that here if necessary
|
20962
|
+
highestLevel = Math.max(highestLevel, this.source.minLevel || 0);
|
20294
20963
|
lowestLevel = Math.min(lowestLevel, highestLevel);
|
20295
20964
|
return {
|
20296
20965
|
lowestLevel: lowestLevel,
|
@@ -20695,6 +21364,7 @@ function getTile(
|
|
20695
21364
|
var xMod,
|
20696
21365
|
yMod,
|
20697
21366
|
bounds,
|
21367
|
+
sourceBounds,
|
20698
21368
|
exists,
|
20699
21369
|
url,
|
20700
21370
|
ajaxHeaders,
|
@@ -20712,6 +21382,7 @@ function getTile(
|
|
20712
21382
|
xMod = ( numTiles.x + ( x % numTiles.x ) ) % numTiles.x;
|
20713
21383
|
yMod = ( numTiles.y + ( y % numTiles.y ) ) % numTiles.y;
|
20714
21384
|
bounds = tileSource.getTileBounds( level, xMod, yMod );
|
21385
|
+
sourceBounds = tileSource.getTileBounds( level, xMod, yMod, true );
|
20715
21386
|
exists = tileSource.tileExists( level, xMod, yMod );
|
20716
21387
|
url = tileSource.getTileUrl( level, xMod, yMod );
|
20717
21388
|
|
@@ -20732,7 +21403,7 @@ function getTile(
|
|
20732
21403
|
bounds.x += ( x - xMod ) / numTiles.x;
|
20733
21404
|
bounds.y += (worldHeight / worldWidth) * (( y - yMod ) / numTiles.y);
|
20734
21405
|
|
20735
|
-
|
21406
|
+
tile = new $.Tile(
|
20736
21407
|
level,
|
20737
21408
|
x,
|
20738
21409
|
y,
|
@@ -20741,8 +21412,19 @@ function getTile(
|
|
20741
21412
|
url,
|
20742
21413
|
context2D,
|
20743
21414
|
tiledImage.loadTilesWithAjax,
|
20744
|
-
ajaxHeaders
|
21415
|
+
ajaxHeaders,
|
21416
|
+
sourceBounds
|
20745
21417
|
);
|
21418
|
+
|
21419
|
+
if (xMod === numTiles.x - 1) {
|
21420
|
+
tile.isRightMost = true;
|
21421
|
+
}
|
21422
|
+
|
21423
|
+
if (yMod === numTiles.y - 1) {
|
21424
|
+
tile.isBottomMost = true;
|
21425
|
+
}
|
21426
|
+
|
21427
|
+
tilesMatrix[ level ][ x ][ y ] = tile;
|
20746
21428
|
}
|
20747
21429
|
|
20748
21430
|
tile = tilesMatrix[ level ][ x ][ y ];
|
@@ -20929,6 +21611,14 @@ function positionTile( tile, overlap, viewport, viewportCenter, levelVisibility,
|
|
20929
21611
|
sizeC = sizeC.plus( new $.Point( 1, 1 ) );
|
20930
21612
|
}
|
20931
21613
|
|
21614
|
+
if (tile.isRightMost && tiledImage.wrapHorizontal) {
|
21615
|
+
sizeC.x += 0.75; // Otherwise Firefox and Safari show seams
|
21616
|
+
}
|
21617
|
+
|
21618
|
+
if (tile.isBottomMost && tiledImage.wrapVertical) {
|
21619
|
+
sizeC.y += 0.75; // Otherwise Firefox and Safari show seams
|
21620
|
+
}
|
21621
|
+
|
20932
21622
|
tile.position = positionC;
|
20933
21623
|
tile.size = sizeC;
|
20934
21624
|
tile.squaredDistance = tileSquaredDistance;
|
@@ -20972,7 +21662,7 @@ function blendTile( tiledImage, tile, x, y, level, levelOpacity, currentTime ){
|
|
20972
21662
|
|
20973
21663
|
tiledImage.lastDrawn.push( tile );
|
20974
21664
|
|
20975
|
-
if ( opacity
|
21665
|
+
if ( opacity === 1 ) {
|
20976
21666
|
setCoverage( tiledImage.coverage, level, x, y, true );
|
20977
21667
|
tiledImage._hasOpaqueTile = true;
|
20978
21668
|
} else if ( deltaTime < blendTimeMillis ) {
|
@@ -21011,10 +21701,10 @@ function providesCoverage( coverage, level, x, y ) {
|
|
21011
21701
|
if ( x === undefined || y === undefined ) {
|
21012
21702
|
rows = coverage[ level ];
|
21013
21703
|
for ( i in rows ) {
|
21014
|
-
if (
|
21704
|
+
if ( Object.prototype.hasOwnProperty.call( rows, i ) ) {
|
21015
21705
|
cols = rows[ i ];
|
21016
21706
|
for ( j in cols ) {
|
21017
|
-
if (
|
21707
|
+
if ( Object.prototype.hasOwnProperty.call( cols, j ) && !cols[ j ] ) {
|
21018
21708
|
return false;
|
21019
21709
|
}
|
21020
21710
|
}
|
@@ -21132,15 +21822,19 @@ function compareTiles( previousBest, tile ) {
|
|
21132
21822
|
* @param {OpenSeadragon.Tile[]} lastDrawn - An unordered list of Tiles drawn last frame.
|
21133
21823
|
*/
|
21134
21824
|
function drawTiles( tiledImage, lastDrawn ) {
|
21135
|
-
if (tiledImage.opacity === 0 || lastDrawn.length === 0) {
|
21825
|
+
if (tiledImage.opacity === 0 || (lastDrawn.length === 0 && !tiledImage.placeholderFillStyle)) {
|
21136
21826
|
return;
|
21137
21827
|
}
|
21828
|
+
|
21138
21829
|
var tile = lastDrawn[0];
|
21830
|
+
var useSketch;
|
21139
21831
|
|
21140
|
-
|
21141
|
-
|
21142
|
-
tiledImage.compositeOperation
|
21143
|
-
|
21832
|
+
if (tile) {
|
21833
|
+
useSketch = tiledImage.opacity < 1 ||
|
21834
|
+
(tiledImage.compositeOperation &&
|
21835
|
+
tiledImage.compositeOperation !== 'source-over') ||
|
21836
|
+
(!tiledImage._isBottomItem() && tile._hasTransparencyChannel());
|
21837
|
+
}
|
21144
21838
|
|
21145
21839
|
var sketchScale;
|
21146
21840
|
var sketchTranslate;
|
@@ -21170,8 +21864,15 @@ function drawTiles( tiledImage, lastDrawn ) {
|
|
21170
21864
|
// sketch canvas we are going to use for performance reasons.
|
21171
21865
|
bounds = tiledImage.viewport.viewportToViewerElementRectangle(
|
21172
21866
|
tiledImage.getClippedBounds(true))
|
21173
|
-
.getIntegerBoundingBox()
|
21174
|
-
|
21867
|
+
.getIntegerBoundingBox();
|
21868
|
+
|
21869
|
+
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
21870
|
+
if (tiledImage.viewport.degrees !== 0 || tiledImage.getRotation(true) % 360 !== 0){
|
21871
|
+
bounds.x = tiledImage._drawer.viewer.container.clientWidth - (bounds.x + bounds.width);
|
21872
|
+
}
|
21873
|
+
}
|
21874
|
+
|
21875
|
+
bounds = bounds.times($.pixelDensityRatio);
|
21175
21876
|
}
|
21176
21877
|
tiledImage._drawer._clear(true, bounds);
|
21177
21878
|
}
|
@@ -21193,6 +21894,12 @@ function drawTiles( tiledImage, lastDrawn ) {
|
|
21193
21894
|
useSketch: useSketch
|
21194
21895
|
});
|
21195
21896
|
}
|
21897
|
+
|
21898
|
+
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
21899
|
+
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
21900
|
+
tiledImage._drawer._flip();
|
21901
|
+
}
|
21902
|
+
}
|
21196
21903
|
}
|
21197
21904
|
|
21198
21905
|
var usedClip = false;
|
@@ -21213,6 +21920,28 @@ function drawTiles( tiledImage, lastDrawn ) {
|
|
21213
21920
|
usedClip = true;
|
21214
21921
|
}
|
21215
21922
|
|
21923
|
+
if (tiledImage._croppingPolygons) {
|
21924
|
+
tiledImage._drawer.saveContext(useSketch);
|
21925
|
+
try {
|
21926
|
+
var polygons = tiledImage._croppingPolygons.map(function (polygon) {
|
21927
|
+
return polygon.map(function (coord) {
|
21928
|
+
var point = tiledImage
|
21929
|
+
.imageToViewportCoordinates(coord.x, coord.y, true)
|
21930
|
+
.rotate(-tiledImage.getRotation(true), tiledImage._getRotationPoint(true));
|
21931
|
+
var clipPoint = tiledImage._drawer.viewportCoordToDrawerCoord(point);
|
21932
|
+
if (sketchScale) {
|
21933
|
+
clipPoint = clipPoint.times(sketchScale);
|
21934
|
+
}
|
21935
|
+
return clipPoint;
|
21936
|
+
});
|
21937
|
+
});
|
21938
|
+
tiledImage._drawer.clipWithPolygons(polygons, useSketch);
|
21939
|
+
} catch (e) {
|
21940
|
+
$.console.error(e);
|
21941
|
+
}
|
21942
|
+
usedClip = true;
|
21943
|
+
}
|
21944
|
+
|
21216
21945
|
if ( tiledImage.placeholderFillStyle && tiledImage._hasOpaqueTile === false ) {
|
21217
21946
|
var placeholderRect = tiledImage._drawer.viewportToDrawerRectangle(tiledImage.getBounds(true));
|
21218
21947
|
if (sketchScale) {
|
@@ -21303,6 +22032,15 @@ function drawTiles( tiledImage, lastDrawn ) {
|
|
21303
22032
|
}
|
21304
22033
|
}
|
21305
22034
|
}
|
22035
|
+
|
22036
|
+
if (!sketchScale) {
|
22037
|
+
if (tiledImage.viewport.degrees === 0 && tiledImage.getRotation(true) % 360 === 0){
|
22038
|
+
if(tiledImage._drawer.viewer.viewport.getFlip()) {
|
22039
|
+
tiledImage._drawer._flip();
|
22040
|
+
}
|
22041
|
+
}
|
22042
|
+
}
|
22043
|
+
|
21306
22044
|
drawDebugInfo( tiledImage, lastDrawn );
|
21307
22045
|
}
|
21308
22046
|
|