var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); /** * @module ol/renderer/Composite */ import MapRenderer from './Map.js'; import ObjectEventType from '../ObjectEventType.js'; import RenderEvent from '../render/Event.js'; import RenderEventType from '../render/EventType.js'; import { CLASS_UNSELECTABLE } from '../css.js'; import { checkedFonts } from '../render/canvas.js'; import { inView } from '../layer/Layer.js'; import { listen, unlistenByKey } from '../events.js'; import { replaceChildren } from '../dom.js'; /** * @classdesc * Canvas map renderer. * @api */ var CompositeMapRenderer = /** @class */ (function (_super) { __extends(CompositeMapRenderer, _super); /** * @param {import("../PluggableMap.js").default} map Map. */ function CompositeMapRenderer(map) { var _this = _super.call(this, map) || this; /** * @type {import("../events.js").EventsKey} */ _this.fontChangeListenerKey_ = listen(checkedFonts, ObjectEventType.PROPERTYCHANGE, map.redrawText.bind(map)); /** * @private * @type {HTMLDivElement} */ _this.element_ = document.createElement('div'); var style = _this.element_.style; style.position = 'absolute'; style.width = '100%'; style.height = '100%'; style.zIndex = '0'; _this.element_.className = CLASS_UNSELECTABLE + ' ol-layers'; var container = map.getViewport(); container.insertBefore(_this.element_, container.firstChild || null); /** * @private * @type {Array} */ _this.children_ = []; /** * @private * @type {boolean} */ _this.renderedVisible_ = true; return _this; } /** * @param {import("../render/EventType.js").default} type Event type. * @param {import("../PluggableMap.js").FrameState} frameState Frame state. */ CompositeMapRenderer.prototype.dispatchRenderEvent = function (type, frameState) { var map = this.getMap(); if (map.hasListener(type)) { var event_1 = new RenderEvent(type, undefined, frameState); map.dispatchEvent(event_1); } }; CompositeMapRenderer.prototype.disposeInternal = function () { unlistenByKey(this.fontChangeListenerKey_); this.element_.parentNode.removeChild(this.element_); _super.prototype.disposeInternal.call(this); }; /** * Render. * @param {?import("../PluggableMap.js").FrameState} frameState Frame state. */ CompositeMapRenderer.prototype.renderFrame = function (frameState) { if (!frameState) { if (this.renderedVisible_) { this.element_.style.display = 'none'; this.renderedVisible_ = false; } return; } this.calculateMatrices2D(frameState); this.dispatchRenderEvent(RenderEventType.PRECOMPOSE, frameState); var layerStatesArray = frameState.layerStatesArray.sort(function (a, b) { return a.zIndex - b.zIndex; }); var viewState = frameState.viewState; this.children_.length = 0; /** * @type {Array} */ var declutterLayers = []; var previousElement = null; for (var i = 0, ii = layerStatesArray.length; i < ii; ++i) { var layerState = layerStatesArray[i]; frameState.layerIndex = i; var layer = layerState.layer; var sourceState = layer.getSourceState(); if (!inView(layerState, viewState) || (sourceState != 'ready' && sourceState != 'undefined')) { layer.unrender(); continue; } var element = layer.render(frameState, previousElement); if (!element) { continue; } if (element !== previousElement) { this.children_.push(element); previousElement = element; } if ('getDeclutter' in layer) { declutterLayers.push( /** @type {import("../layer/BaseVector.js").default} */ (layer)); } } for (var i = declutterLayers.length - 1; i >= 0; --i) { declutterLayers[i].renderDeclutter(frameState); } replaceChildren(this.element_, this.children_); this.dispatchRenderEvent(RenderEventType.POSTCOMPOSE, frameState); if (!this.renderedVisible_) { this.element_.style.display = ''; this.renderedVisible_ = true; } this.scheduleExpireIconCache(frameState); }; /** * @param {import("../pixel.js").Pixel} pixel Pixel. * @param {import("../PluggableMap.js").FrameState} frameState FrameState. * @param {number} hitTolerance Hit tolerance in pixels. * @param {function(import("../layer/Layer.js").default, (Uint8ClampedArray|Uint8Array)): T} callback Layer * callback. * @param {function(import("../layer/Layer.js").default): boolean} layerFilter Layer filter * function, only layers which are visible and for which this function * returns `true` will be tested for features. By default, all visible * layers will be tested. * @return {T|undefined} Callback result. * @template T */ CompositeMapRenderer.prototype.forEachLayerAtPixel = function (pixel, frameState, hitTolerance, callback, layerFilter) { var viewState = frameState.viewState; var layerStates = frameState.layerStatesArray; var numLayers = layerStates.length; for (var i = numLayers - 1; i >= 0; --i) { var layerState = layerStates[i]; var layer = layerState.layer; if (layer.hasRenderer() && inView(layerState, viewState) && layerFilter(layer)) { var layerRenderer = layer.getRenderer(); var data = layerRenderer.getDataAtPixel(pixel, frameState, hitTolerance); if (data) { var result = callback(layer, data); if (result) { return result; } } } } return undefined; }; return CompositeMapRenderer; }(MapRenderer)); export default CompositeMapRenderer; //# sourceMappingURL=Composite.js.map