Add pixelRatio to ol.source.Tile#getTile

This commit is contained in:
Tom Payne
2014-01-14 16:31:37 +01:00
parent 33f0024747
commit 58fef69fac
7 changed files with 32 additions and 26 deletions

View File

@@ -164,6 +164,7 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
// composition and positioning. // composition and positioning.
// //
var pixelRatio = frameState.pixelRatio;
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
@@ -261,7 +262,7 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}, tileSource, projection); }, tileSource, pixelRatio, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -271,7 +272,7 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, projection); tile = tileSource.getTile(z, x, y, pixelRatio, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED || if (tileState == ol.TileState.LOADED ||
tileState == ol.TileState.EMPTY || tileState == ol.TileState.EMPTY ||
@@ -377,12 +378,11 @@ ol.renderer.canvas.TileLayer.prototype.prepareFrame =
} }
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
this.manageTilePyramid(frameState, tileSource, tileGrid, projection, extent, this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
z, tileLayer.getPreload()); projection, extent, z, tileLayer.getPreload());
this.scheduleExpireCache(frameState, tileSource); this.scheduleExpireCache(frameState, tileSource);
this.updateLogos(frameState, tileSource); this.updateLogos(frameState, tileSource);
var pixelRatio = frameState.pixelRatio;
ol.vec.Mat4.makeTransform2D(this.imageTransform_, ol.vec.Mat4.makeTransform2D(this.imageTransform_,
pixelRatio * frameState.size[0] / 2, pixelRatio * frameState.size[0] / 2,
pixelRatio * frameState.size[1] / 2, pixelRatio * frameState.size[1] / 2,

View File

@@ -81,6 +81,7 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame =
return; return;
} }
var pixelRatio = frameState.pixelRatio;
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
@@ -113,7 +114,7 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED; return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED;
}, tileSource, projection); }, tileSource, pixelRatio, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -123,7 +124,7 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, projection); tile = tileSource.getTile(z, x, y, pixelRatio, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED) { if (tileState == ol.TileState.LOADED) {
tilesToDrawByZ[z][tile.tileCoord.toString()] = tile; tilesToDrawByZ[z][tile.tileCoord.toString()] = tile;
@@ -241,8 +242,8 @@ ol.renderer.dom.TileLayer.prototype.prepareFrame =
} }
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
this.manageTilePyramid(frameState, tileSource, tileGrid, projection, extent, this.manageTilePyramid(frameState, tileSource, tileGrid, pixelRatio,
z, tileLayer.getPreload()); projection, extent, z, tileLayer.getPreload());
this.scheduleExpireCache(frameState, tileSource); this.scheduleExpireCache(frameState, tileSource);
this.updateLogos(frameState, tileSource); this.updateLogos(frameState, tileSource);

View File

@@ -197,13 +197,14 @@ ol.renderer.Layer.prototype.updateUsedTiles =
* @param {function(ol.Tile): boolean} isLoadedFunction Function to * @param {function(ol.Tile): boolean} isLoadedFunction Function to
* determine if the tile is loaded. * determine if the tile is loaded.
* @param {ol.source.Tile} tileSource Tile source. * @param {ol.source.Tile} tileSource Tile source.
* @param {number} pixelRatio Pixel ratio.
* @param {ol.proj.Projection} projection Projection. * @param {ol.proj.Projection} projection Projection.
* @protected * @protected
* @return {function(number, number, number): ol.Tile} Returns a tile if it is * @return {function(number, number, number): ol.Tile} Returns a tile if it is
* loaded. * loaded.
*/ */
ol.renderer.Layer.prototype.createGetTileIfLoadedFunction = ol.renderer.Layer.prototype.createGetTileIfLoadedFunction =
function(isLoadedFunction, tileSource, projection) { function(isLoadedFunction, tileSource, pixelRatio, projection) {
return ( return (
/** /**
* @param {number} z Z. * @param {number} z Z.
@@ -212,7 +213,7 @@ ol.renderer.Layer.prototype.createGetTileIfLoadedFunction =
* @return {ol.Tile} Tile. * @return {ol.Tile} Tile.
*/ */
function(z, x, y) { function(z, x, y) {
var tile = tileSource.getTile(z, x, y, projection); var tile = tileSource.getTile(z, x, y, pixelRatio, projection);
return isLoadedFunction(tile) ? tile : null; return isLoadedFunction(tile) ? tile : null;
}); });
}; };
@@ -244,6 +245,7 @@ ol.renderer.Layer.prototype.snapCenterToPixel =
* @param {ol.FrameState} frameState Frame state. * @param {ol.FrameState} frameState Frame state.
* @param {ol.source.Tile} tileSource Tile source. * @param {ol.source.Tile} tileSource Tile source.
* @param {ol.tilegrid.TileGrid} tileGrid Tile grid. * @param {ol.tilegrid.TileGrid} tileGrid Tile grid.
* @param {number} pixelRatio Pixel ratio.
* @param {ol.proj.Projection} projection Projection. * @param {ol.proj.Projection} projection Projection.
* @param {ol.Extent} extent Extent. * @param {ol.Extent} extent Extent.
* @param {number} currentZ Current Z. * @param {number} currentZ Current Z.
@@ -254,8 +256,8 @@ ol.renderer.Layer.prototype.snapCenterToPixel =
* @template T * @template T
*/ */
ol.renderer.Layer.prototype.manageTilePyramid = function( ol.renderer.Layer.prototype.manageTilePyramid = function(
frameState, tileSource, tileGrid, projection, extent, currentZ, preload, frameState, tileSource, tileGrid, pixelRatio, projection, extent,
opt_tileCallback, opt_this) { currentZ, preload, opt_tileCallback, opt_this) {
var tileSourceKey = goog.getUid(tileSource).toString(); var tileSourceKey = goog.getUid(tileSource).toString();
if (!(tileSourceKey in frameState.wantedTiles)) { if (!(tileSourceKey in frameState.wantedTiles)) {
frameState.wantedTiles[tileSourceKey] = {}; frameState.wantedTiles[tileSourceKey] = {};
@@ -270,7 +272,7 @@ ol.renderer.Layer.prototype.manageTilePyramid = function(
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
if (currentZ - z <= preload) { if (currentZ - z <= preload) {
tile = tileSource.getTile(z, x, y, projection); tile = tileSource.getTile(z, x, y, pixelRatio, projection);
if (tile.getState() == ol.TileState.IDLE) { if (tile.getState() == ol.TileState.IDLE) {
wantedTiles[tile.tileCoord.toString()] = true; wantedTiles[tile.tileCoord.toString()] = true;
if (!tileQueue.isKeyQueued(tile.getKey())) { if (!tileQueue.isKeyQueued(tile.getKey())) {

View File

@@ -114,6 +114,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame =
var context = mapRenderer.getContext(); var context = mapRenderer.getContext();
var gl = mapRenderer.getGL(); var gl = mapRenderer.getGL();
var pixelRatio = frameState.pixelRatio;
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var projection = view2DState.projection; var projection = view2DState.projection;
@@ -196,7 +197,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame =
var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) { var getTileIfLoaded = this.createGetTileIfLoadedFunction(function(tile) {
return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED && return !goog.isNull(tile) && tile.getState() == ol.TileState.LOADED &&
mapRenderer.isTileTextureLoaded(tile); mapRenderer.isTileTextureLoaded(tile);
}, tileSource, projection); }, tileSource, pixelRatio, projection);
var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource, var findLoadedTiles = goog.bind(tileSource.findLoadedTiles, tileSource,
tilesToDrawByZ, getTileIfLoaded); tilesToDrawByZ, getTileIfLoaded);
@@ -207,7 +208,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame =
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tile = tileSource.getTile(z, x, y, projection); tile = tileSource.getTile(z, x, y, pixelRatio, projection);
tileState = tile.getState(); tileState = tile.getState();
if (tileState == ol.TileState.LOADED) { if (tileState == ol.TileState.LOADED) {
if (mapRenderer.isTileTextureLoaded(tile)) { if (mapRenderer.isTileTextureLoaded(tile)) {
@@ -276,7 +277,7 @@ ol.renderer.webgl.TileLayer.prototype.prepareFrame =
this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange); this.updateUsedTiles(frameState.usedTiles, tileSource, z, tileRange);
var tileTextureQueue = mapRenderer.getTileTextureQueue(); var tileTextureQueue = mapRenderer.getTileTextureQueue();
this.manageTilePyramid( this.manageTilePyramid(
frameState, tileSource, tileGrid, projection, extent, z, frameState, tileSource, tileGrid, pixelRatio, projection, extent, z,
tileLayer.getPreload(), tileLayer.getPreload(),
/** /**
* @param {ol.Tile} tile Tile. * @param {ol.Tile} tile Tile.

View File

@@ -119,14 +119,15 @@ ol.source.TileImage.prototype.expireCache = function(usedTiles) {
/** /**
* @inheritDoc * @inheritDoc
*/ */
ol.source.TileImage.prototype.getTile = function(z, x, y, projection) { ol.source.TileImage.prototype.getTile =
function(z, x, y, pixelRatio, projection) {
var tileCoordKey = this.getKeyZXY(z, x, y); var tileCoordKey = this.getKeyZXY(z, x, y);
if (this.tileCache.containsKey(tileCoordKey)) { if (this.tileCache.containsKey(tileCoordKey)) {
return /** @type {!ol.Tile} */ (this.tileCache.get(tileCoordKey)); return /** @type {!ol.Tile} */ (this.tileCache.get(tileCoordKey));
} else { } else {
goog.asserts.assert(projection); goog.asserts.assert(projection);
var tileCoord = new ol.TileCoord(z, x, y); var tileCoord = new ol.TileCoord(z, x, y);
var tileUrl = this.tileUrlFunction(tileCoord, 1, projection); var tileUrl = this.tileUrlFunction(tileCoord, pixelRatio, projection);
var tile = new this.tileClass( var tile = new this.tileClass(
tileCoord, tileCoord,
goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY, goog.isDef(tileUrl) ? ol.TileState.IDLE : ol.TileState.EMPTY,

View File

@@ -144,6 +144,7 @@ ol.source.Tile.prototype.getResolutions = function() {
* @param {number} z Tile coordinate z. * @param {number} z Tile coordinate z.
* @param {number} x Tile coordinate x. * @param {number} x Tile coordinate x.
* @param {number} y Tile coordinate y. * @param {number} y Tile coordinate y.
* @param {number} pixelRatio Pixel ratio.
* @param {ol.proj.Projection=} opt_projection Projection. * @param {ol.proj.Projection=} opt_projection Projection.
* @return {!ol.Tile} Tile. * @return {!ol.Tile} Tile.
*/ */

View File

@@ -17,7 +17,7 @@ describe('ol.source.TileWMS', function() {
it('returns a tile with the expected URL', function() { it('returns a tile with the expected URL', function() {
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:3857')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:3857'));
expect(tile).to.be.an(ol.ImageTile); expect(tile).to.be.an(ol.ImageTile);
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
expect(uri.getScheme()).to.be('http'); expect(uri.getScheme()).to.be('http');
@@ -44,7 +44,7 @@ describe('ol.source.TileWMS', function() {
it('returns a larger tile when a gutter is specified', function() { it('returns a larger tile when a gutter is specified', function() {
options.gutter = 16; options.gutter = 16;
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:3857')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:3857'));
expect(tile).to.be.an(ol.ImageTile); expect(tile).to.be.an(ol.ImageTile);
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
@@ -58,7 +58,7 @@ describe('ol.source.TileWMS', function() {
it('sets the SRS query value instead of CRS if version < 1.3', function() { it('sets the SRS query value instead of CRS if version < 1.3', function() {
options.params.VERSION = '1.2'; options.params.VERSION = '1.2';
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:4326')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
expect(queryData.get('CRS')).to.be(undefined); expect(queryData.get('CRS')).to.be(undefined);
@@ -69,7 +69,7 @@ describe('ol.source.TileWMS', function() {
options.params.FORMAT = 'image/jpeg'; options.params.FORMAT = 'image/jpeg';
options.params.TRANSPARENT = false; options.params.TRANSPARENT = false;
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:4326')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
expect(queryData.get('FORMAT')).to.be('image/jpeg'); expect(queryData.get('FORMAT')).to.be('image/jpeg');
@@ -79,7 +79,7 @@ describe('ol.source.TileWMS', function() {
it('does not add a STYLES= option if one is specified', function() { it('does not add a STYLES= option if one is specified', function() {
options.params.STYLES = 'foo'; options.params.STYLES = 'foo';
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:4326')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
expect(queryData.get('STYLES')).to.be('foo'); expect(queryData.get('STYLES')).to.be('foo');
@@ -87,7 +87,7 @@ describe('ol.source.TileWMS', function() {
it('changes the BBOX order for EN axis orientations', function() { it('changes the BBOX order for EN axis orientations', function() {
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('EPSG:4326')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('EPSG:4326'));
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
expect(queryData.get('BBOX')).to.be('-45,-90,0,-45'); expect(queryData.get('BBOX')).to.be('-45,-90,0,-45');
@@ -96,7 +96,7 @@ describe('ol.source.TileWMS', function() {
it('uses EN BBOX order if version < 1.3', function() { it('uses EN BBOX order if version < 1.3', function() {
options.params.VERSION = '1.1.0'; options.params.VERSION = '1.1.0';
var source = new ol.source.TileWMS(options); var source = new ol.source.TileWMS(options);
var tile = source.getTile(3, 2, 1, ol.proj.get('CRS:84')); var tile = source.getTile(3, 2, 1, 1, ol.proj.get('CRS:84'));
var uri = new goog.Uri(tile.src_); var uri = new goog.Uri(tile.src_);
var queryData = uri.getQueryData(); var queryData = uri.getQueryData();
expect(queryData.get('BBOX')).to.be('-90,-45,-45,0'); expect(queryData.get('BBOX')).to.be('-90,-45,-45,0');