UNPKG

mapbox-gl

Version:
100 lines (78 loc) 2.93 kB
'use strict'; var util = require('../util/util'); var ajax = require('../util/ajax'); var Evented = require('../util/evented'); var Source = require('./source'); var normalizeURL = require('../util/mapbox').normalizeTileURL; module.exports = RasterTileSource; function RasterTileSource(options) { util.extend(this, util.pick(options, ['url', 'tileSize'])); Source._loadTileJSON.call(this, options); } RasterTileSource.prototype = util.inherit(Evented, { minzoom: 0, maxzoom: 22, tileSize: 512, _loaded: false, onAdd: function(map) { this.map = map; }, loaded: function() { return this._pyramid && this._pyramid.loaded(); }, update: function(transform) { if (this._pyramid) { this._pyramid.update(this.used, transform, this.map.style.rasterFadeDuration); } }, reload: function() { // noop }, render: Source._renderTiles, _loadTile: function(tile) { ajax.getImage(normalizeURL(tile.coord.url(this.tiles), this.url), function(err, img) { if (tile.aborted) return; if (err) { this.fire('tile.error', {tile: tile}); return; } var gl = this.map.painter.gl; tile.texture = this.map.painter.getTexture(img.width); if (tile.texture) { gl.bindTexture(gl.TEXTURE_2D, tile.texture); gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, img); } else { tile.texture = gl.createTexture(); gl.bindTexture(gl.TEXTURE_2D, tile.texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img); tile.texture.size = img.width; } gl.generateMipmap(gl.TEXTURE_2D); tile.timeAdded = new Date().getTime(); this.map.animationLoop.set(this.style.rasterFadeDuration); tile.source = this; tile.loaded = true; this.fire('tile.load', {tile: tile}); }.bind(this)); }, _abortTile: function(tile) { tile.aborted = true; }, _addTile: function(tile) { this.fire('tile.add', {tile: tile}); }, _removeTile: function(tile) { this.fire('tile.remove', {tile: tile}); }, _unloadTile: function(tile) { if (tile.texture) this.map.painter.saveTexture(tile.texture); }, featuresAt: function(point, params, callback) { callback(null, []); } });