hrms-manual/node_modules/panzoom/lib/svgController.js
2023-09-06 14:51:44 +07:00

79 lines
No EOL
2 KiB
JavaScript

module.exports = makeSvgController;
module.exports.canAttach = isSVGElement;
function makeSvgController(svgElement, options) {
if (!isSVGElement(svgElement)) {
throw new Error('svg element is required for svg.panzoom to work');
}
var owner = svgElement.ownerSVGElement;
if (!owner) {
throw new Error(
'Do not apply panzoom to the root <svg> element. ' +
'Use its child instead (e.g. <g></g>). ' +
'As of March 2016 only FireFox supported transform on the root element');
}
if (!options.disableKeyboardInteraction) {
owner.setAttribute('tabindex', 0);
}
var api = {
getBBox: getBBox,
getScreenCTM: getScreenCTM,
getOwner: getOwner,
applyTransform: applyTransform,
initTransform: initTransform
};
return api;
function getOwner() {
return owner;
}
function getBBox() {
var bbox = svgElement.getBBox();
return {
left: bbox.x,
top: bbox.y,
width: bbox.width,
height: bbox.height,
};
}
function getScreenCTM() {
var ctm = owner.getCTM();
if (!ctm) {
// This is likely firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=873106
// The code below is not entirely correct, but still better than nothing
return owner.getScreenCTM();
}
return ctm;
}
function initTransform(transform) {
var screenCTM = svgElement.getCTM();
// The above line returns null on Firefox
if (screenCTM === null) {
screenCTM = document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix();
}
transform.x = screenCTM.e;
transform.y = screenCTM.f;
transform.scale = screenCTM.a;
owner.removeAttributeNS(null, 'viewBox');
}
function applyTransform(transform) {
svgElement.setAttribute('transform', 'matrix(' +
transform.scale + ' 0 0 ' +
transform.scale + ' ' +
transform.x + ' ' + transform.y + ')');
}
}
function isSVGElement(element) {
return element && element.ownerSVGElement && element.getCTM;
}