Files
openlayers/src/ol/renderer/layerrenderer.js

284 lines
6.9 KiB
JavaScript

goog.provide('ol.renderer.Layer');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('ol.Attribution');
goog.require('ol.Extent');
goog.require('ol.FrameState');
goog.require('ol.Image');
goog.require('ol.ImageState');
goog.require('ol.Object');
goog.require('ol.Tile');
goog.require('ol.TileCoord');
goog.require('ol.TileRange');
goog.require('ol.TileState');
goog.require('ol.layer.Layer');
goog.require('ol.layer.LayerProperty');
goog.require('ol.layer.LayerState');
goog.require('ol.source.TileSource');
/**
* @constructor
* @extends {ol.Object}
* @param {ol.renderer.Map} mapRenderer Map renderer.
* @param {ol.layer.Layer} layer Layer.
*/
ol.renderer.Layer = function(mapRenderer, layer) {
goog.base(this);
/**
* @private
* @type {ol.renderer.Map}
*/
this.mapRenderer_ = mapRenderer;
/**
* @private
* @type {ol.layer.Layer}
*/
this.layer_ = layer;
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.BRIGHTNESS),
this.handleLayerBrightnessChange, false, this);
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.CONTRAST),
this.handleLayerContrastChange, false, this);
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.HUE),
this.handleLayerHueChange, false, this);
goog.events.listen(this.layer_, goog.events.EventType.LOAD,
this.handleLayerLoad, false, this);
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.OPACITY),
this.handleLayerOpacityChange, false, this);
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.SATURATION),
this.handleLayerSaturationChange, false, this);
goog.events.listen(this.layer_,
ol.Object.getChangedEventType(ol.layer.LayerProperty.VISIBLE),
this.handleLayerVisibleChange, false, this);
};
goog.inherits(ol.renderer.Layer, ol.Object);
/**
* @protected
*/
ol.renderer.Layer.prototype.dispatchChangeEvent = function() {
this.dispatchEvent(goog.events.EventType.CHANGE);
};
/**
* @return {ol.layer.Layer} Layer.
*/
ol.renderer.Layer.prototype.getLayer = function() {
return this.layer_;
};
/**
* @return {ol.Map} Map.
*/
ol.renderer.Layer.prototype.getMap = function() {
return this.mapRenderer_.getMap();
};
/**
* @return {ol.renderer.Map} Map renderer.
*/
ol.renderer.Layer.prototype.getMapRenderer = function() {
return this.mapRenderer_;
};
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerBrightnessChange = goog.nullFunction;
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerContrastChange = goog.nullFunction;
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerHueChange = goog.nullFunction;
/**
* Handle changes in image state.
* @param {goog.events.Event} event Image change event.
* @protected
*/
ol.renderer.Layer.prototype.handleImageChange = function(event) {
var image = /** @type {ol.Image} */ (event.target);
if (image.getState() === ol.ImageState.LOADED) {
this.getMap().requestRenderFrame();
}
};
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerLoad = function() {
this.dispatchChangeEvent();
};
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerOpacityChange = function() {
this.dispatchChangeEvent();
};
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerSaturationChange = goog.nullFunction;
/**
* @protected
*/
ol.renderer.Layer.prototype.handleLayerVisibleChange = function() {
this.dispatchChangeEvent();
};
/**
* Handle changes in tile state.
* @param {goog.events.Event} event Tile change event.
* @protected
*/
ol.renderer.Layer.prototype.handleTileChange = function(event) {
var tile = /** @type {ol.Tile} */ (event.target);
if (tile.getState() === ol.TileState.LOADED) {
this.getMap().requestRenderFrame();
}
};
/**
* @param {ol.FrameState} frameState Frame state.
* @param {ol.layer.LayerState} layerState Layer state.
*/
ol.renderer.Layer.prototype.renderFrame = goog.abstractMethod;
/**
* @protected
* @param {ol.FrameState} frameState Frame state.
* @param {ol.source.TileSource} tileSource Tile source.
*/
ol.renderer.Layer.prototype.scheduleExpireCache =
function(frameState, tileSource) {
if (tileSource.canExpireCache()) {
frameState.postRenderFunctions.push(
goog.partial(function(tileSource, map, frameState) {
var tileSourceKey = goog.getUid(tileSource).toString();
tileSource.expireCache(frameState.usedTiles[tileSourceKey]);
}, tileSource));
}
};
/**
* @protected
* @param {Object.<string, ol.Attribution>} attributionsSet Attributions
* set (target).
* @param {Array.<ol.Attribution>} attributions Attributions (source).
*/
ol.renderer.Layer.prototype.updateAttributions =
function(attributionsSet, attributions) {
var i;
var attribution;
for (i = 0; i < attributions.length; ++i) {
attribution = attributions[i];
attributionsSet[goog.getUid(attribution).toString()] = attribution;
}
};
/**
* @protected
* @param {Object.<string, Object.<string, ol.TileRange>>} usedTiles Used tiles.
* @param {ol.source.TileSource} tileSource Tile source.
* @param {number} z Z.
* @param {ol.TileRange} tileRange Tile range.
*/
ol.renderer.Layer.prototype.updateUsedTiles =
function(usedTiles, tileSource, z, tileRange) {
// FIXME should we use tilesToDrawByZ instead?
var tileSourceKey = goog.getUid(tileSource).toString();
var zKey = z.toString();
if (tileSourceKey in usedTiles) {
if (zKey in usedTiles[tileSourceKey]) {
usedTiles[tileSourceKey][zKey].extend(tileRange);
} else {
usedTiles[tileSourceKey][zKey] = tileRange;
}
} else {
usedTiles[tileSourceKey] = {};
usedTiles[tileSourceKey][zKey] = tileRange;
}
};
/**
* @protected
* @param {Object.<string, Object.<string, boolean>>} wantedTiles Wanted tiles.
* @param {ol.source.TileSource} tileSource Tile source.
* @param {ol.TileCoord} tileCoord Tile coordinate.
*/
ol.renderer.Layer.prototype.updateWantedTiles =
function(wantedTiles, tileSource, tileCoord) {
var tileSourceKey = goog.getUid(tileSource).toString();
var coordKey = tileCoord.toString();
if (!(tileSourceKey in wantedTiles)) {
wantedTiles[tileSourceKey] = {};
}
wantedTiles[tileSourceKey][coordKey] = true;
};
/**
* @protected
* @param {ol.source.TileSource} tileSource Tile source.
* @param {number} z Z.
* @param {ol.Extent} extent Extent.
*/
ol.renderer.Layer.prototype.useLowResolutionTiles =
function(tileSource, z, extent) {
var tileGrid = tileSource.getTileGrid();
var tileRange, x, y, zKey;
// FIXME this should loop up to tileGrid's minZ when implemented
for (; z >= 0; --z) {
tileRange = tileGrid.getTileRangeForExtentAndZ(extent, z);
for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileSource.useTile(new ol.TileCoord(z, x, y));
}
}
}
};