UNPKG

@wcardinal/wcardinal-geditor

Version:

WebGL-based graphic editor, tester and viewer for supervisory systems

114 lines 4.24 kB
/* * Copyright (C) 2019 Toshiba Corporation * SPDX-License-Identifier: Apache-2.0 */ import { EShapeBase, EShapeCapability, EShapeEditor, EShapeLockPart, toSizeNormalized } from "@wcardinal/wcardinal-ui"; var UtilShapeTransforms = /** @class */ (function () { function UtilShapeTransforms() { } UtilShapeTransforms.prepare = function (shape) { var editor = shape.editor; if (editor == null) { editor = new EShapeEditor(); shape.editor = editor; } // Transform shape.updateTransform(); var parent = shape.parent; if (parent instanceof EShapeBase) { parent.transform.internalTransform .copyTo(editor.internalTransformParentInverse) .invert(); } else { editor.internalTransformParentInverse.identity(); } shape.transform.internalTransform.copyTo(editor.internalTransform); // Rotation editor.rotation = shape.transform.rotation; // Size editor.size.copyFrom(shape.size); // shape.lock(EShapeLockPart.TRANSFORM_CHILD); }; UtilShapeTransforms.finalize = function (shape) { shape.unlock(EShapeLockPart.TRANSFORM_CHILD, true); }; UtilShapeTransforms.apply = function (shape, transform, capability) { var editor = shape.editor; if (editor != null) { var newLocalTransform = editor.localTransform; editor.internalTransformParentInverse .copyTo(newLocalTransform) .append(transform) .append(editor.internalTransform); this.applyLocal(shape, newLocalTransform, capability, editor.size); } }; UtilShapeTransforms.applyLocal = function (shape, localTransform, capability, size) { // Reconstruct the position, the rotation and the size var a = localTransform.a; var b = localTransform.b; var c = localTransform.c; var d = localTransform.d; var tx = localTransform.tx; var ty = localTransform.ty; shape.lock(EShapeLockPart.UPLOADED); // Transform var transform = shape.transform; // Capability var cposition = !!(capability & EShapeCapability.POSITION); var crotation = !!(capability & EShapeCapability.ROTATION); var cskew = !!(capability & EShapeCapability.SKEW); var cwidth = !!(capability & EShapeCapability.WIDTH); var cheight = !!(capability & EShapeCapability.HEIGHT); // Rotation and skew if (crotation || cskew) { // Rotation var rx = Math.atan2(-c, d); // rotation - skewX var ry = Math.atan2(+b, a); // rotation + skewY if (crotation) { transform.rotation = (rx + ry) * 0.5; // Here, assumes `skewX` === `skewY` } // Skew if (cskew) { var skew = (ry - rx) * 0.5; transform.skew.set(skew, skew); } } // Position if (cposition) { // Assumes the pivot is invariant. // tx = position.x - (a * px + c * py) // ty = position.y - (b * px + d * py) // // Thus, // position.x = tx + (a * px + c * py) // position.y = ty + (b * px + d * py) var pivot = transform.pivot; var px = pivot.x; var py = pivot.y; transform.position.set(tx + (a * px + c * py), ty + (b * px + d * py)); } // Scale if (size != null && (cwidth || cheight)) { var w = toSizeNormalized(size.x * Math.sqrt(a * a + b * b)); var h = toSizeNormalized(size.y * Math.sqrt(c * c + d * d)); var s = shape.size; if (cwidth && cheight) { s.set(w, h); } else if (cwidth) { s.x = w; } else { s.y = h; } } // shape.unlock(EShapeLockPart.UPLOADED, true); }; return UtilShapeTransforms; }()); export { UtilShapeTransforms }; //# sourceMappingURL=util-shape-transforms.js.map