/** * @module olcs.util */ const exports = {}; /** * Cast to object. * @param {Object} param * @return {Object} */ exports.obj = function(param) { return param; }; /** * @type {boolean|undefined} * @private */ exports.supportsImageRenderingPixelatedResult_ = undefined; /** * @type {string|undefined} * @private */ exports.imageRenderingValueResult_ = undefined; /** * @return {boolean} */ exports.supportsImageRenderingPixelated = function() { if (exports.supportsImageRenderingPixelatedResult_ === undefined) { const canvas = document.createElement('canvas'); canvas.setAttribute('style', 'image-rendering: -moz-crisp-edges; image-rendering: pixelated;'); // canvas.style.imageRendering will be undefined, null or an // empty string on unsupported browsers. const tmp = canvas.style['imageRendering']; // non standard exports.supportsImageRenderingPixelatedResult_ = !!tmp; if (exports.supportsImageRenderingPixelatedResult_) { exports.imageRenderingValueResult_ = tmp; } } return exports.supportsImageRenderingPixelatedResult_; }; /** * @return {string} */ exports.imageRenderingValue = function() { exports.supportsImageRenderingPixelated(); return exports.imageRenderingValueResult_ || ''; }; /** * Return the projection of the source that Cesium should use. * * @param {ol.source.Source} source Source. * @returns {ol.proj.Projection} The projection of the source. */ exports.getSourceProjection = function(source) { return /** @type {ol.proj.Projection} */ (source.get('olcs.projection')) || source.getProjection(); }; /** * @param {ol.Observable} observable * @param {string} type * @param {Function} listener * @return {!ol.events.EventsKey} */ export function olcsListen(observable, type, listener) { // See https://github.com/openlayers/openlayers/pull/8481 // ol.events.listen is internal so we use `on` instead. // And since `on` as a convoluted API (can return an EventsKey or an array of them) // we use a cast here. return /** @type {!ol.events.EventsKey} */ (observable.on(type, listener)); } /** * Counter for getUid. * @type {number} */ let uidCounter_ = 0; /** * Gets a unique ID for an object. This mutates the object so that further calls * with the same object as a parameter returns the same value. Unique IDs are generated * as a strictly increasing sequence. Adapted from goog.getUid. * * @param {Object} obj The object to get the unique ID for. * @return {number} The unique ID for the object. */ export function getUid(obj) { return obj.olcs_uid || (obj.olcs_uid = ++uidCounter_); } /** * Sort the passed array such that the relative order of equal elements is preverved. * See https://en.wikipedia.org/wiki/Sorting_algorithm#Stability for details. * @param {Array<*>} arr The array to sort (modifies original). * @param {!function(*, *): number} compareFnc Comparison function. */ export function stableSort(arr, compareFnc) { const length = arr.length; const tmp = Array(arr.length); for (let i = 0; i < length; i++) { tmp[i] = {index: i, value: arr[i]}; } tmp.sort((a, b) => compareFnc(a.value, b.value) || a.index - b.index); for (let i = 0; i < arr.length; i++) { arr[i] = tmp[i].value; } } /** * @param {Node} node The node to remove. * @returns {Node} The node that was removed or null. */ export function removeNode(node) { return node && node.parentNode ? node.parentNode.removeChild(node) : null; } /** * @param {Node} node The node to remove the children from. */ export function removeChildren(node) { while (node.lastChild) { node.removeChild(node.lastChild); } } /** * @param {Cesium.Scene} scene The scene. */ export function isGroundPolylinePrimitiveSupported(scene) { const obj = Cesium.GroundPolylinePrimitive; return obj && obj.isSupported(scene); } export default exports;