fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
133 lines (129 loc) • 4.16 kB
JavaScript
import { defineProperty as _defineProperty, objectSpread2 as _objectSpread2 } from '../../../_virtual/_rollupPluginBabelHelpers.mjs';
import { getFabricDocument, getEnv } from '../../env/index.mjs';
import { NONE } from '../../constants.mjs';
import '../../util/misc/vectors.mjs';
import '../../Point.mjs';
import '../../util/misc/projectStroke/StrokeLineJoinProjections.mjs';
import { createCanvasElement } from '../../util/misc/dom.mjs';
import '../../config.mjs';
import '../../shapes/Group.mjs';
import '../../cache.mjs';
import '../../parser/constants.mjs';
import { setStyle } from '../../util/dom_style.mjs';
import '../../util/animation/AnimationRegistry.mjs';
import { makeElementUnselectable, setCanvasDimensions, setCSSDimensions } from './util.mjs';
import { StaticCanvasDOMManager } from './StaticCanvasDOMManager.mjs';
class CanvasDOMManager extends StaticCanvasDOMManager {
constructor(arg0) {
let {
allowTouchScrolling = false,
containerClass = ''
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
super(arg0);
_defineProperty(this, "upper", void 0);
_defineProperty(this, "container", void 0);
const {
el: lowerCanvasEl
} = this.lower;
const upperCanvasEl = this.createUpperCanvas();
this.upper = {
el: upperCanvasEl,
ctx: upperCanvasEl.getContext('2d')
};
this.applyCanvasStyle(lowerCanvasEl, {
allowTouchScrolling
});
this.applyCanvasStyle(upperCanvasEl, {
allowTouchScrolling,
styles: {
position: 'absolute',
left: '0',
top: '0'
}
});
const container = this.createContainerElement();
container.classList.add(containerClass);
if (lowerCanvasEl.parentNode) {
lowerCanvasEl.parentNode.replaceChild(container, lowerCanvasEl);
}
container.append(lowerCanvasEl, upperCanvasEl);
this.container = container;
}
createUpperCanvas() {
const {
el: lowerCanvasEl
} = this.lower;
const el = createCanvasElement();
// we assign the same classname of the lowerCanvas
el.className = lowerCanvasEl.className;
// but then we remove the lower-canvas specific className
el.classList.remove('lower-canvas');
// we add the specific upper-canvas class
el.classList.add('upper-canvas');
el.setAttribute('data-fabric', 'top');
el.style.cssText = lowerCanvasEl.style.cssText;
el.setAttribute('draggable', 'true');
return el;
}
createContainerElement() {
const container = getFabricDocument().createElement('div');
container.setAttribute('data-fabric', 'wrapper');
setStyle(container, {
position: 'relative'
});
makeElementUnselectable(container);
return container;
}
/**
* @private
* @param {HTMLCanvasElement} element canvas element to apply styles on
*/
applyCanvasStyle(element, options) {
const {
styles,
allowTouchScrolling
} = options;
setStyle(element, _objectSpread2(_objectSpread2({}, styles), {}, {
'touch-action': allowTouchScrolling ? 'manipulation' : NONE
}));
makeElementUnselectable(element);
}
setDimensions(size, retinaScaling) {
super.setDimensions(size, retinaScaling);
const {
el,
ctx
} = this.upper;
setCanvasDimensions(el, ctx, size, retinaScaling);
}
setCSSDimensions(size) {
super.setCSSDimensions(size);
setCSSDimensions(this.upper.el, size);
setCSSDimensions(this.container, size);
}
cleanupDOM(size) {
const container = this.container,
{
el: lowerCanvasEl
} = this.lower,
{
el: upperCanvasEl
} = this.upper;
super.cleanupDOM(size);
container.removeChild(upperCanvasEl);
container.removeChild(lowerCanvasEl);
if (container.parentNode) {
container.parentNode.replaceChild(lowerCanvasEl, container);
}
}
dispose() {
super.dispose();
getEnv().dispose(this.upper.el);
// @ts-expect-error disposing
delete this.upper;
// @ts-expect-error disposing
delete this.container;
}
}
export { CanvasDOMManager };
//# sourceMappingURL=CanvasDOMManager.mjs.map