Added implementation of getTileAtPoint() function. This eliminates flickering at level transitions caused by mis-match in resolution size calculation between the getTileAtPoint() and getNumTiles() functions.

This commit is contained in:
Ruven 2023-04-24 22:44:46 +02:00
parent 877c3b68ed
commit 5fd125dc92
No known key found for this signature in database
GPG Key ID: B54C2EF1C087BEFB

View File

@ -336,13 +336,13 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
// Use supplied list of scaled resolution sizes if these exist // Use supplied list of scaled resolution sizes if these exist
var levelSize = this.getLevelSize(level); var levelSize = this.getLevelSize(level);
if( levelSize ) { if( levelSize ) {
var x = Math.ceil( levelSize.width / this.getTileWidth(level) ), var x = Math.ceil( levelSize.width / this.getTileWidth(level) ),
y = Math.ceil( levelSize.height / this.getTileHeight(level) ); y = Math.ceil( levelSize.height / this.getTileHeight(level) );
return new $.Point( x, y ); return new $.Point( x, y );
} }
// Otherwise call default TileSource->getNumTiles() function // Otherwise call default TileSource->getNumTiles() function
else { else {
return $.TileSource.prototype.getNumTiles.call(this, level); return $.TileSource.prototype.getNumTiles.call(this, level);
} }
}, },
@ -389,6 +389,35 @@ $.extend( $.IIIFTileSource.prototype, $.TileSource.prototype, /** @lends OpenSea
return new $.Point(0, 0); return new $.Point(0, 0);
} }
// Use supplied list of scaled resolution sizes if these exist
var levelSize = this.getLevelSize(level);
if( levelSize ) {
var validPoint = point.x >= 0 && point.x <= 1 &&
point.y >= 0 && point.y <= 1 / this.aspectRatio;
$.console.assert(validPoint, "[TileSource.getTileAtPoint] must be called with a valid point.");
var widthScaled = levelSize.width;
var pixelX = point.x * widthScaled;
var pixelY = point.y * widthScaled;
var x = Math.floor(pixelX / this.getTileWidth(level));
var y = Math.floor(pixelY / this.getTileHeight(level));
// When point.x == 1 or point.y == 1 / this.aspectRatio we want to
// return the last tile of the row/column
if (point.x >= 1) {
x = this.getNumTiles(level).x - 1;
}
var EPSILON = 1e-15;
if (point.y >= 1 / this.aspectRatio - EPSILON) {
y = this.getNumTiles(level).y - 1;
}
return new $.Point(x, y);
}
// Otherwise call default TileSource->getTileAtPoint() function
return $.TileSource.prototype.getTileAtPoint.call(this, level, point); return $.TileSource.prototype.getTileAtPoint.call(this, level, point);
}, },