public/assets/maplibre/maplibre-gl-framerate.js (120 lines of code) (raw):
/**
* Copyright (c) 2019, Mapbox
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* Source:
* https://github.com/mapbox/mapbox-gl-framerate
*/
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
typeof define === 'function' && define.amd ? define(factory) :
(global.FrameRateControl = factory());
}(this, (function () { 'use strict';
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
return target;
}
var FrameRateControl = function FrameRateControl(options) {
var _this = this;
_classCallCheck(this, FrameRateControl);
_defineProperty(this, "onAdd", function (map) {
_this.map = map;
var dpr = window.devicePixelRatio;
var _this$options = _this.options,
width = _this$options.width,
graphWidth = _this$options.graphWidth,
graphHeight = _this$options.graphHeight,
color = _this$options.color,
background = _this$options.background,
font = _this$options.font;
var el = _this.container = document.createElement('div');
el.className = 'maplibregl-ctrl maplibregl-ctrl-fps';
el.style.backgroundColor = background;
el.style.borderRadius = '6px';
_this.readOutput = document.createElement('div');
_this.readOutput.style.color = color;
_this.readOutput.style.fontFamily = font;
_this.readOutput.style.padding = '0 5px 5px';
_this.readOutput.style.fontSize = '9px';
_this.readOutput.style.fontWeight = 'bold';
_this.readOutput.textContent = 'Waiting…';
_this.canvas = document.createElement('canvas');
_this.canvas.className = 'maplibregl-ctrl-canvas';
_this.canvas.width = width;
_this.canvas.height = graphHeight;
_this.canvas.style.cssText = "width: ".concat(width / dpr, "px; height: ").concat(graphHeight / dpr, "px;");
el.appendChild(_this.readOutput);
el.appendChild(_this.canvas);
_this.map.on('movestart', _this.onMoveStart);
_this.map.on('moveend', _this.onMoveEnd);
return _this.container;
});
_defineProperty(this, "onMoveStart", function () {
_this.frames = 0;
_this.time = performance.now();
_this.map.on('render', _this.onRender);
});
_defineProperty(this, "onMoveEnd", function () {
var now = performance.now();
_this.updateGraph(_this.getFPS(now));
_this.frames = 0;
_this.time = null;
_this.map.off('render', _this.onRender);
});
_defineProperty(this, "onRender", function () {
_this.frames++;
var now = performance.now();
if (now >= _this.time + 1e3) {
_this.updateGraph(_this.getFPS(now));
_this.frames = 0;
_this.time = now;
}
});
_defineProperty(this, "getFPS", function (now) {
_this.totalTime += now - _this.time, _this.totalFrames += _this.frames;
return Math.round(1e3 * _this.frames / (now - _this.time)) || 0;
});
_defineProperty(this, "updateGraph", function (fpsNow) {
var _this$options2 = _this.options,
barWidth = _this$options2.barWidth,
graphRight = _this$options2.graphRight,
graphTop = _this$options2.graphTop,
graphWidth = _this$options2.graphWidth,
graphHeight = _this$options2.graphHeight,
background = _this$options2.background,
color = _this$options2.color;
var context = _this.canvas.getContext('2d');
var fps = Math.round(1e3 * _this.totalFrames / _this.totalTime) || 0;
var rect = (barWidth);
context.fillStyle = background;
context.globalAlpha = 1;
context.fillRect(0, 0, graphWidth, graphTop);
context.fillStyle = color;
_this.readOutput.textContent = "".concat(fpsNow, " FPS (").concat(fps, " Avg)");
context.drawImage(_this.canvas, graphRight + rect, graphTop, graphWidth - rect, graphHeight, graphRight, graphTop, graphWidth - rect, graphHeight);
context.fillRect(graphRight + graphWidth - rect, graphTop, rect, graphHeight);
context.fillStyle = background;
context.globalAlpha = 0.75;
context.fillRect(graphRight + graphWidth - rect, graphTop, rect, (1 - fpsNow / 100) * graphHeight);
});
_defineProperty(this, "onRemove", function () {
_this.map.off('render', _this.onRender);
_this.map.off('movestart', _this.onMoveStart);
_this.map.off('moveend', _this.onMoveEnd);
_this.container.parentNode.removeChild(_this.container);
_this.map = null;
return _this;
});
var _dpr = window.devicePixelRatio;
var defaultOptions = {
background: 'rgba(0,0,0,0.9)',
barWidth: 4 * _dpr,
color: '#7cf859',
font: 'Monaco, Consolas, Courier, monospace',
graphHeight: 60 * _dpr,
graphWidth: 90 * _dpr,
graphTop: 0,
graphRight: 5 * _dpr,
width: 100 * _dpr
};
this.frames = 0;
this.totalTime = 0;
this.totalFrames = 0;
this.options = _objectSpread({}, options, defaultOptions);
};
if (window.maplibregl) {
maplibregl.FrameRateControl = FrameRateControl;
}
return FrameRateControl;
})));