From 91793ce752090c3e1b5aaaf57cf219af77f00a19 Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Tue, 23 Nov 2021 16:22:41 +0900 Subject: [PATCH 1/7] Revert "Merge pull request #2059 from kim-sanghoon/fix/getLevelScale" This reverts commit 1454ac791a0a2d538a58678374b7829f7c3f1fbb, reversing changes made to fcca75c57e9707be8a552bb824c8b6f5f899ee75. --- src/tilesource.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/tilesource.js b/src/tilesource.js index 32f10da8..aab7f134 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -284,14 +284,10 @@ $.TileSource.prototype = { // see https://github.com/openseadragon/openseadragon/issues/22 // we use the tilesources implementation of getLevelScale to generate // a memoized re-implementation - var maxLevel = Math.ceil( - Math.log( Math.max( this.dimensions.x, this.dimensions.y ) ) / - Math.log( 2 ) - ), - levelScaleCache = {}, + var levelScaleCache = {}, i; - for( i = 0; i <= maxLevel; i++ ){ - levelScaleCache[ i ] = 1 / Math.pow(2, maxLevel - i); + for( i = 0; i <= this.maxLevel; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i); } this.getLevelScale = function( _level ){ return levelScaleCache[ _level ]; From de39597c141cdf9e34c8a3b94ae18af4e2db048c Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Tue, 23 Nov 2021 16:58:00 +0900 Subject: [PATCH 2/7] Add setMaxLevel to initialize getLevelScale memoization --- src/tilesource.js | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/tilesource.js b/src/tilesource.js index aab7f134..78732626 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -219,13 +219,14 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; this.minLevel = options.minLevel ? options.minLevel : 0; - this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ? + this.setMaxLevel( ( undefined !== options.maxLevel && null !== options.maxLevel ) ? options.maxLevel : ( ( options.width && options.height ) ? Math.ceil( Math.log( Math.max( options.width, options.height ) ) / Math.log( 2 ) ) : 0 - ); + ) + ); if( this.success && $.isFunction( this.success ) ){ this.success( this ); } @@ -275,24 +276,39 @@ $.TileSource.prototype = { return this._tileHeight; }, + /** + * @function + * @param {Number} level + * @return {OpenSeadragon.TileSource} Chainable. + */ + setMaxLevel: function( level ) { + this.maxLevel = level; + this._memoizeLevelScale( level ); + return this; + }, + /** * @function * @param {Number} level */ getLevelScale: function( level ) { + this._memoizeLevelScale( this.maxLevel ); + return this.getLevelScale( level ); + }, + // private + _memoizeLevelScale: function( level ) { // see https://github.com/openseadragon/openseadragon/issues/22 // we use the tilesources implementation of getLevelScale to generate // a memoized re-implementation var levelScaleCache = {}, i; - for( i = 0; i <= this.maxLevel; i++ ){ - levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i); + for( i = 0; i <= level; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, level - i); } this.getLevelScale = function( _level ){ return levelScaleCache[ _level ]; }; - return this.getLevelScale( level ); }, /** From f8c97143e87248ef4a5567bb79f4b7d93cb72e6c Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Tue, 30 Nov 2021 11:40:06 +0900 Subject: [PATCH 3/7] Modify the TileSource constructor and _memoizeLevelScale --- src/tilesource.js | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/tilesource.js b/src/tilesource.js index 78732626..c6bcd8e4 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -219,14 +219,13 @@ $.TileSource = function( width, height, tileSize, tileOverlap, minLevel, maxLeve this.tileOverlap = options.tileOverlap ? options.tileOverlap : 0; this.minLevel = options.minLevel ? options.minLevel : 0; - this.setMaxLevel( ( undefined !== options.maxLevel && null !== options.maxLevel ) ? + this.maxLevel = ( undefined !== options.maxLevel && null !== options.maxLevel ) ? options.maxLevel : ( ( options.width && options.height ) ? Math.ceil( Math.log( Math.max( options.width, options.height ) ) / Math.log( 2 ) ) : 0 - ) - ); + ); if( this.success && $.isFunction( this.success ) ){ this.success( this ); } @@ -279,12 +278,10 @@ $.TileSource.prototype = { /** * @function * @param {Number} level - * @return {OpenSeadragon.TileSource} Chainable. */ setMaxLevel: function( level ) { this.maxLevel = level; - this._memoizeLevelScale( level ); - return this; + this._memoizeLevelScale(); }, /** @@ -292,19 +289,21 @@ $.TileSource.prototype = { * @param {Number} level */ getLevelScale: function( level ) { - this._memoizeLevelScale( this.maxLevel ); + // if getLevelScale is not memoized, we generate the memoized version + // at the first call and return the result + this._memoizeLevelScale(); return this.getLevelScale( level ); }, // private - _memoizeLevelScale: function( level ) { + _memoizeLevelScale: function() { // see https://github.com/openseadragon/openseadragon/issues/22 // we use the tilesources implementation of getLevelScale to generate // a memoized re-implementation var levelScaleCache = {}, i; - for( i = 0; i <= level; i++ ){ - levelScaleCache[ i ] = 1 / Math.pow(2, level - i); + for( i = 0; i <= this.maxlevel; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, this.maxlevel - i); } this.getLevelScale = function( _level ){ return levelScaleCache[ _level ]; From 24d5d985482df6c1dd98eb9f962e07a11a6ffc4c Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:23:30 +0900 Subject: [PATCH 4/7] Add the description of setMaxLevel --- src/tilesource.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/tilesource.js b/src/tilesource.js index c6bcd8e4..7b5d7acf 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -276,6 +276,10 @@ $.TileSource.prototype = { }, /** + * Set the maxLevel to the given level, and perform the memoization of + * getLevelScale with the new maxLevel. This function can be useful if the + * memoization is required before the first call of getLevelScale, or both + * memoized getLevelScale and maxLevel should be changed accordingly. * @function * @param {Number} level */ From 7686812336a69ea7742f7d73481fa112f1ae7997 Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Wed, 1 Dec 2021 10:01:18 +0900 Subject: [PATCH 5/7] Fix maxLevel typo --- src/tilesource.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tilesource.js b/src/tilesource.js index 7b5d7acf..32df56cf 100644 --- a/src/tilesource.js +++ b/src/tilesource.js @@ -306,8 +306,8 @@ $.TileSource.prototype = { // a memoized re-implementation var levelScaleCache = {}, i; - for( i = 0; i <= this.maxlevel; i++ ){ - levelScaleCache[ i ] = 1 / Math.pow(2, this.maxlevel - i); + for( i = 0; i <= this.maxLevel; i++ ){ + levelScaleCache[ i ] = 1 / Math.pow(2, this.maxLevel - i); } this.getLevelScale = function( _level ){ return levelScaleCache[ _level ]; From 3bde256d62fdb6a64656a4067f7a1f9da6043c1e Mon Sep 17 00:00:00 2001 From: Sanghoon Kim <20144277+kim-sanghoon@users.noreply.github.com> Date: Wed, 1 Dec 2021 10:17:10 +0900 Subject: [PATCH 6/7] Modify the unit test for changing maxLevel --- test/modules/tilesource.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/test/modules/tilesource.js b/test/modules/tilesource.js index 16fbb292..2f752c4a 100644 --- a/test/modules/tilesource.js +++ b/test/modules/tilesource.js @@ -128,8 +128,6 @@ assert.equal(tileSource.maxLevel, 12, 'The initial max level should be 12.'); - tileSource.maxLevel = 9; - function assertLevelScale(level, expected) { var actual = tileSource.getLevelScale(level); assert.ok(Math.abs(actual - expected) < Number.EPSILON, "The scale at level " + level + @@ -141,6 +139,13 @@ assertLevelScale(10, 1 / 4); assertLevelScale(8, 1 / 16); assertLevelScale(6, 1 / 64); + + tileSource.setMaxLevel(9); + + assertLevelScale(9, 1); + assertLevelScale(7, 1 / 4); + assertLevelScale(5, 1 / 16); + assertLevelScale(3, 1 / 64); }); }()); From c8f4934c8a5f33b15830d9a82e5443a48519db63 Mon Sep 17 00:00:00 2001 From: Ian Gilman Date: Wed, 1 Dec 2021 11:31:49 -0800 Subject: [PATCH 7/7] Changelog for #2066 --- changelog.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index af542783..582f2d53 100644 --- a/changelog.txt +++ b/changelog.txt @@ -58,7 +58,7 @@ OPENSEADRAGON CHANGELOG * Explicitly set passive:false for wheel event handlers to suppress console warnings. Fixes #1669 (#2043 @msalsbery) * Viewer's canvas-click events now include an originalTarget property so you can know which element received the click (#2037 @iangilman) * Added method for getting the size of an image in window coordinates (#2049 @superbland) -* Fixed an issue with TileSource's getLevelScale that would arise if you changed maxLevel (#2059 @kim-sanghoon) +* Added a setMaxLevel function to TileSource so you can change its maxLevel if needed (#2059, #2066 @kim-sanghoon) 2.4.2: