From 0ac9e35f52cdb79d027481592a197d243d14dee6 Mon Sep 17 00:00:00 2001 From: Vladimir Agafonkin Date: Mon, 23 Jul 2018 12:43:58 +0300 Subject: [PATCH] dry up dem source, inherit xhr-avoiding logic --- src/source/raster_dem_tile_source.js | 51 ++++++++-------------------- src/source/raster_tile_source.js | 38 +++++++++++---------- 2 files changed, 35 insertions(+), 54 deletions(-) diff --git a/src/source/raster_dem_tile_source.js b/src/source/raster_dem_tile_source.js index 0cef8af2283..d808409f831 100644 --- a/src/source/raster_dem_tile_source.js +++ b/src/source/raster_dem_tile_source.js @@ -1,9 +1,7 @@ // @flow -import { getImage, ResourceType } from '../util/ajax'; import { extend } from '../util/util'; import { Evented } from '../util/evented'; -import { normalizeTileURL as normalizeURL } from '../util/mapbox'; import browser from '../util/browser'; import { OverscaledTileID } from './tile_id'; import RasterTileSource from './raster_tile_source'; @@ -39,54 +37,33 @@ class RasterDEMTileSource extends RasterTileSource implements Source { } loadTile(tile: Tile, callback: Callback) { - const url = normalizeURL(tile.tileID.canonical.url(this.tiles, this.scheme), this.url, this.tileSize); - tile.request = getImage(this.map._transformRequest(url, ResourceType.Tile), imageLoaded.bind(this)); - tile.neighboringTiles = this._getNeighboringTiles(tile.tileID); - function imageLoaded(err, img) { - delete tile.request; - if (tile.aborted) { - tile.state = 'unloaded'; - callback(null); - } else if (err) { - tile.state = 'errored'; - callback(err); - } else if (img) { - if (this.map._refreshExpiredTiles) tile.setExpiryData(img); - delete (img: any).cacheControl; - delete (img: any).expires; - - const rawImageData = browser.getImageData(img); - const params = { - uid: tile.uid, - coord: tile.tileID, - source: this.id, - rawImageData: rawImageData, - encoding: this.encoding - }; - - if (!tile.workerID || tile.state === 'expired') { - tile.workerID = this.dispatcher.send('loadDEMTile', params, done.bind(this)); - } - } - } + super.loadTile(tile, callback); + } + + onTileLoad(tile: Tile, img: HTMLImageElement, callback: Callback) { + if (tile.workerID && tile.state !== 'expired') return; - function done(err, dem) { + tile.workerID = this.dispatcher.send('loadDEMTile', { + uid: tile.uid, + coord: tile.tileID, + source: this.id, + rawImageData: browser.getImageData(img), + encoding: this.encoding + }, (err, dem) => { if (err) { tile.state = 'errored'; callback(err); - } - if (dem) { + } else if (dem) { tile.dem = dem; tile.needsHillshadePrepare = true; tile.state = 'loaded'; callback(null); } - } + }); } - _getNeighboringTiles(tileID: OverscaledTileID) { const canonical = tileID.canonical; const dim = Math.pow(2, canonical.z); diff --git a/src/source/raster_tile_source.js b/src/source/raster_tile_source.js index b0b43806825..78574483ce3 100644 --- a/src/source/raster_tile_source.js +++ b/src/source/raster_tile_source.js @@ -119,27 +119,31 @@ class RasterTileSource extends Evented implements Source { this._avoidXHR = true; } - const context = this.map.painter.context; - const gl = context.gl; - tile.texture = this.map.painter.getTileTexture(img.width); - if (tile.texture) { - tile.texture.update(img, { useMipmap: true }); - } else { - tile.texture = new Texture(context, img, gl.RGBA, { useMipmap: true }); - tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); - - if (context.extTextureFilterAnisotropic) { - gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); - } - } - - tile.state = 'loaded'; - - callback(null); + this.onTileLoad(tile, img, callback); } }, this._avoidXHR); } + onTileLoad(tile: Tile, img: HTMLImageElement, callback: Callback) { + const context = this.map.painter.context; + const gl = context.gl; + tile.texture = this.map.painter.getTileTexture(img.width); + if (tile.texture) { + tile.texture.update(img, { useMipmap: true }); + } else { + tile.texture = new Texture(context, img, gl.RGBA, { useMipmap: true }); + tile.texture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST); + + if (context.extTextureFilterAnisotropic) { + gl.texParameterf(gl.TEXTURE_2D, context.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT, context.extTextureFilterAnisotropicMax); + } + } + + tile.state = 'loaded'; + + callback(null); + } + abortTile(tile: Tile, callback: Callback) { if (tile.request) { tile.request.cancel();