UNPKG

c8y-openlayer

Version:

This module is designed to help integrate Openlayer with Cumulocity IoT

192 lines (165 loc) 6.86 kB
import _ol_ from '../../index.js'; import _ol_extent_ from '../../extent.js'; import _ol_functions_ from '../../functions.js'; import _ol_render_Event_ from '../../render/event.js'; import _ol_render_EventType_ from '../../render/eventtype.js'; import _ol_render_canvas_ from '../../render/canvas.js'; import _ol_render_canvas_Immediate_ from '../../render/canvas/immediate.js'; import _ol_renderer_Layer_ from '../layer.js'; import _ol_transform_ from '../../transform.js'; /** * @constructor * @abstract * @extends {ol.renderer.Layer} * @param {ol.layer.Layer} layer Layer. */ var _ol_renderer_canvas_Layer_ = function(layer) { _ol_renderer_Layer_.call(this, layer); /** * @protected * @type {number} */ this.renderedResolution; /** * @private * @type {ol.Transform} */ this.transform_ = _ol_transform_.create(); }; _ol_.inherits(_ol_renderer_canvas_Layer_, _ol_renderer_Layer_); /** * @param {CanvasRenderingContext2D} context Context. * @param {olx.FrameState} frameState Frame state. * @param {ol.Extent} extent Clip extent. * @protected */ _ol_renderer_canvas_Layer_.prototype.clip = function(context, frameState, extent) { var pixelRatio = frameState.pixelRatio; var width = frameState.size[0] * pixelRatio; var height = frameState.size[1] * pixelRatio; var rotation = frameState.viewState.rotation; var topLeft = _ol_extent_.getTopLeft(/** @type {ol.Extent} */ (extent)); var topRight = _ol_extent_.getTopRight(/** @type {ol.Extent} */ (extent)); var bottomRight = _ol_extent_.getBottomRight(/** @type {ol.Extent} */ (extent)); var bottomLeft = _ol_extent_.getBottomLeft(/** @type {ol.Extent} */ (extent)); _ol_transform_.apply(frameState.coordinateToPixelTransform, topLeft); _ol_transform_.apply(frameState.coordinateToPixelTransform, topRight); _ol_transform_.apply(frameState.coordinateToPixelTransform, bottomRight); _ol_transform_.apply(frameState.coordinateToPixelTransform, bottomLeft); context.save(); _ol_render_canvas_.rotateAtOffset(context, -rotation, width / 2, height / 2); context.beginPath(); context.moveTo(topLeft[0] * pixelRatio, topLeft[1] * pixelRatio); context.lineTo(topRight[0] * pixelRatio, topRight[1] * pixelRatio); context.lineTo(bottomRight[0] * pixelRatio, bottomRight[1] * pixelRatio); context.lineTo(bottomLeft[0] * pixelRatio, bottomLeft[1] * pixelRatio); context.clip(); _ol_render_canvas_.rotateAtOffset(context, rotation, width / 2, height / 2); }; /** * @param {ol.render.EventType} type Event type. * @param {CanvasRenderingContext2D} context Context. * @param {olx.FrameState} frameState Frame state. * @param {ol.Transform=} opt_transform Transform. * @private */ _ol_renderer_canvas_Layer_.prototype.dispatchComposeEvent_ = function(type, context, frameState, opt_transform) { var layer = this.getLayer(); if (layer.hasListener(type)) { var width = frameState.size[0] * frameState.pixelRatio; var height = frameState.size[1] * frameState.pixelRatio; var rotation = frameState.viewState.rotation; _ol_render_canvas_.rotateAtOffset(context, -rotation, width / 2, height / 2); var transform = opt_transform !== undefined ? opt_transform : this.getTransform(frameState, 0); var render = new _ol_render_canvas_Immediate_( context, frameState.pixelRatio, frameState.extent, transform, frameState.viewState.rotation); var composeEvent = new _ol_render_Event_(type, render, frameState, context, null); layer.dispatchEvent(composeEvent); _ol_render_canvas_.rotateAtOffset(context, rotation, width / 2, height / 2); } }; /** * @param {ol.Coordinate} coordinate Coordinate. * @param {olx.FrameState} frameState FrameState. * @param {function(this: S, ol.layer.Layer, (Uint8ClampedArray|Uint8Array)): T} callback Layer * callback. * @param {S} thisArg Value to use as `this` when executing `callback`. * @return {T|undefined} Callback result. * @template S,T,U */ _ol_renderer_canvas_Layer_.prototype.forEachLayerAtCoordinate = function(coordinate, frameState, callback, thisArg) { var hasFeature = this.forEachFeatureAtCoordinate( coordinate, frameState, 0, _ol_functions_.TRUE, this); if (hasFeature) { return callback.call(thisArg, this.getLayer(), null); } else { return undefined; } }; /** * @param {CanvasRenderingContext2D} context Context. * @param {olx.FrameState} frameState Frame state. * @param {ol.LayerState} layerState Layer state. * @param {ol.Transform=} opt_transform Transform. * @protected */ _ol_renderer_canvas_Layer_.prototype.postCompose = function(context, frameState, layerState, opt_transform) { this.dispatchComposeEvent_(_ol_render_EventType_.POSTCOMPOSE, context, frameState, opt_transform); }; /** * @param {CanvasRenderingContext2D} context Context. * @param {olx.FrameState} frameState Frame state. * @param {ol.Transform=} opt_transform Transform. * @protected */ _ol_renderer_canvas_Layer_.prototype.preCompose = function(context, frameState, opt_transform) { this.dispatchComposeEvent_(_ol_render_EventType_.PRECOMPOSE, context, frameState, opt_transform); }; /** * @param {CanvasRenderingContext2D} context Context. * @param {olx.FrameState} frameState Frame state. * @param {ol.Transform=} opt_transform Transform. * @protected */ _ol_renderer_canvas_Layer_.prototype.dispatchRenderEvent = function(context, frameState, opt_transform) { this.dispatchComposeEvent_(_ol_render_EventType_.RENDER, context, frameState, opt_transform); }; /** * @param {olx.FrameState} frameState Frame state. * @param {number} offsetX Offset on the x-axis in view coordinates. * @protected * @return {!ol.Transform} Transform. */ _ol_renderer_canvas_Layer_.prototype.getTransform = function(frameState, offsetX) { var viewState = frameState.viewState; var pixelRatio = frameState.pixelRatio; var dx1 = pixelRatio * frameState.size[0] / 2; var dy1 = pixelRatio * frameState.size[1] / 2; var sx = pixelRatio / viewState.resolution; var sy = -sx; var angle = -viewState.rotation; var dx2 = -viewState.center[0] + offsetX; var dy2 = -viewState.center[1]; return _ol_transform_.compose(this.transform_, dx1, dy1, sx, sy, angle, dx2, dy2); }; /** * @abstract * @param {olx.FrameState} frameState Frame state. * @param {ol.LayerState} layerState Layer state. * @param {CanvasRenderingContext2D} context Context. */ _ol_renderer_canvas_Layer_.prototype.composeFrame = function(frameState, layerState, context) {}; /** * @abstract * @param {olx.FrameState} frameState Frame state. * @param {ol.LayerState} layerState Layer state. * @return {boolean} whether composeFrame should be called. */ _ol_renderer_canvas_Layer_.prototype.prepareFrame = function(frameState, layerState) {}; export default _ol_renderer_canvas_Layer_;