fabric
Version:
Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.
62 lines (58 loc) • 2.05 kB
text/typescript
import { CENTER, SCALE_X, SCALE_Y } from '../constants';
import type { FabricImage } from '../shapes/Image';
import type { FabricObject } from '../shapes/Object/FabricObject';
import type { TMat2D } from '../typedefs';
import { qrDecompose } from './misc/matrix';
type FabricObjectWithTransformMatrix = FabricObject & {
transformMatrix?: TMat2D;
};
/**
* This function is an helper for svg import. it decompose the transformMatrix
* and assign properties to object.
* untransformed coordinates
* @private
*/
const _assignTransformMatrixProps = (
object: FabricObjectWithTransformMatrix,
) => {
if (object.transformMatrix) {
const { scaleX, scaleY, angle, skewX } = qrDecompose(
object.transformMatrix,
);
object.flipX = false;
object.flipY = false;
object.set(SCALE_X, scaleX);
object.set(SCALE_Y, scaleY);
object.angle = angle;
object.skewX = skewX;
object.skewY = 0;
}
};
/**
* This function is an helper for svg import. it removes the transform matrix
* and set to object properties that fabricjs can handle
* @private
* @param {Object} preserveAspectRatioOptions
*/
export const removeTransformMatrixForSvgParsing = (
object: FabricObjectWithTransformMatrix,
preserveAspectRatioOptions?: any,
) => {
let center = object._findCenterFromElement();
if (object.transformMatrix) {
_assignTransformMatrixProps(object);
center = center.transform(object.transformMatrix);
}
delete object.transformMatrix;
if (preserveAspectRatioOptions) {
object.scaleX *= preserveAspectRatioOptions.scaleX;
object.scaleY *= preserveAspectRatioOptions.scaleY;
(object as FabricImage).cropX = preserveAspectRatioOptions.cropX;
(object as FabricImage).cropY = preserveAspectRatioOptions.cropY;
center.x += preserveAspectRatioOptions.offsetLeft;
center.y += preserveAspectRatioOptions.offsetTop;
object.width = preserveAspectRatioOptions.width;
object.height = preserveAspectRatioOptions.height;
}
object.setPositionByOrigin(center, CENTER, CENTER);
};