package.webgl.BaseTileRepresentation.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ol Show documentation
Show all versions of ol Show documentation
OpenLayers mapping library
The newest version!
/**
* @module ol/webgl/BaseTileRepresentation
*/
import EventTarget from '../events/Target.js';
import EventType from '../events/EventType.js';
import ImageTile from '../ImageTile.js';
import TileState from '../TileState.js';
import {abstract} from '../util.js';
/**
* @typedef {import("../Tile.js").default} BaseTileType
*/
/**
* @template {BaseTileType} TileType
* @typedef {Object} TileRepresentationOptions
* @property {TileType} tile The tile.
* @property {import("../tilegrid/TileGrid.js").default} grid Tile grid.
* @property {import("../webgl/Helper.js").default} helper WebGL helper.
* @property {number} [gutter=0] The size in pixels of the gutter around image tiles to ignore.
*/
/**
* @classdesc
* Base class for representing a tile in a webgl context
* @template {import("../Tile.js").default} TileType
* @abstract
*/
class BaseTileRepresentation extends EventTarget {
/**
* @param {TileRepresentationOptions} options The tile representation options.
*/
constructor(options) {
super();
/**
* @type {TileType}
*/
this.tile;
/**
* @private
*/
this.handleTileChange_ = this.handleTileChange_.bind(this);
/**
* @type {number}
* @protected
*/
this.gutter = options.gutter || 0;
/**
* @type {import("../webgl/Helper.js").default}
* @protected
*/
this.helper = options.helper;
this.loaded = false;
this.ready = false;
}
/**
* @param {TileType} tile Tile.
*/
setTile(tile) {
if (tile !== this.tile) {
if (this.tile) {
this.tile.removeEventListener(EventType.CHANGE, this.handleTileChange_);
}
this.tile = tile;
this.loaded = tile.getState() === TileState.LOADED;
if (this.loaded) {
this.uploadTile();
} else {
if (tile instanceof ImageTile) {
const image = tile.getImage();
if (image instanceof Image && !image.crossOrigin) {
image.crossOrigin = 'anonymous';
}
}
tile.addEventListener(EventType.CHANGE, this.handleTileChange_);
}
}
}
/**
* @abstract
* @protected
*/
uploadTile() {
abstract();
}
setReady() {
this.ready = true;
this.dispatchEvent(EventType.CHANGE);
}
handleTileChange_() {
if (this.tile.getState() === TileState.LOADED) {
this.loaded = true;
this.uploadTile();
}
}
/**
* @param {import("./Helper.js").default} helper The WebGL helper.
*/
setHelper(helper) {
this.helper = helper;
if (this.helper && this.loaded) {
this.uploadTile();
}
}
/**
* @override
*/
disposeInternal() {
this.setHelper(null);
this.tile.removeEventListener(EventType.CHANGE, this.handleTileChange_);
}
}
export default BaseTileRepresentation;