95 lines
3.1 KiB
JavaScript
95 lines
3.1 KiB
JavaScript
|
import env from './env.js';
|
||
|
import { buildTransformer } from './fourPointsTransform.js';
|
||
|
var EVENT_SAVED_PROP = '___zrEVENTSAVED';
|
||
|
var _calcOut = [];
|
||
|
export function transformLocalCoord(out, elFrom, elTarget, inX, inY) {
|
||
|
return transformCoordWithViewport(_calcOut, elFrom, inX, inY, true)
|
||
|
&& transformCoordWithViewport(out, elTarget, _calcOut[0], _calcOut[1]);
|
||
|
}
|
||
|
export function transformCoordWithViewport(out, el, inX, inY, inverse) {
|
||
|
if (el.getBoundingClientRect && env.domSupported && !isCanvasEl(el)) {
|
||
|
var saved = el[EVENT_SAVED_PROP] || (el[EVENT_SAVED_PROP] = {});
|
||
|
var markers = prepareCoordMarkers(el, saved);
|
||
|
var transformer = preparePointerTransformer(markers, saved, inverse);
|
||
|
if (transformer) {
|
||
|
transformer(out, inX, inY);
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
function prepareCoordMarkers(el, saved) {
|
||
|
var markers = saved.markers;
|
||
|
if (markers) {
|
||
|
return markers;
|
||
|
}
|
||
|
markers = saved.markers = [];
|
||
|
var propLR = ['left', 'right'];
|
||
|
var propTB = ['top', 'bottom'];
|
||
|
for (var i = 0; i < 4; i++) {
|
||
|
var marker = document.createElement('div');
|
||
|
var stl = marker.style;
|
||
|
var idxLR = i % 2;
|
||
|
var idxTB = (i >> 1) % 2;
|
||
|
stl.cssText = [
|
||
|
'position: absolute',
|
||
|
'visibility: hidden',
|
||
|
'padding: 0',
|
||
|
'margin: 0',
|
||
|
'border-width: 0',
|
||
|
'user-select: none',
|
||
|
'width:0',
|
||
|
'height:0',
|
||
|
propLR[idxLR] + ':0',
|
||
|
propTB[idxTB] + ':0',
|
||
|
propLR[1 - idxLR] + ':auto',
|
||
|
propTB[1 - idxTB] + ':auto',
|
||
|
''
|
||
|
].join('!important;');
|
||
|
el.appendChild(marker);
|
||
|
markers.push(marker);
|
||
|
}
|
||
|
return markers;
|
||
|
}
|
||
|
function preparePointerTransformer(markers, saved, inverse) {
|
||
|
var transformerName = inverse ? 'invTrans' : 'trans';
|
||
|
var transformer = saved[transformerName];
|
||
|
var oldSrcCoords = saved.srcCoords;
|
||
|
var srcCoords = [];
|
||
|
var destCoords = [];
|
||
|
var oldCoordTheSame = true;
|
||
|
for (var i = 0; i < 4; i++) {
|
||
|
var rect = markers[i].getBoundingClientRect();
|
||
|
var ii = 2 * i;
|
||
|
var x = rect.left;
|
||
|
var y = rect.top;
|
||
|
srcCoords.push(x, y);
|
||
|
oldCoordTheSame = oldCoordTheSame && oldSrcCoords && x === oldSrcCoords[ii] && y === oldSrcCoords[ii + 1];
|
||
|
destCoords.push(markers[i].offsetLeft, markers[i].offsetTop);
|
||
|
}
|
||
|
return (oldCoordTheSame && transformer)
|
||
|
? transformer
|
||
|
: (saved.srcCoords = srcCoords,
|
||
|
saved[transformerName] = inverse
|
||
|
? buildTransformer(destCoords, srcCoords)
|
||
|
: buildTransformer(srcCoords, destCoords));
|
||
|
}
|
||
|
export function isCanvasEl(el) {
|
||
|
return el.nodeName.toUpperCase() === 'CANVAS';
|
||
|
}
|
||
|
var replaceReg = /([&<>"'])/g;
|
||
|
var replaceMap = {
|
||
|
'&': '&',
|
||
|
'<': '<',
|
||
|
'>': '>',
|
||
|
'"': '"',
|
||
|
'\'': '''
|
||
|
};
|
||
|
export function encodeHTML(source) {
|
||
|
return source == null
|
||
|
? ''
|
||
|
: (source + '').replace(replaceReg, function (str, c) {
|
||
|
return replaceMap[c];
|
||
|
});
|
||
|
}
|