@leafer-in/resize
Version: 
247 lines (204 loc) • 7.79 kB
JavaScript
"use strict";
var draw = require("@leafer-ui/draw");
const {M: M, L: L, C: C, Q: Q, Z: Z, N: N, D: D, X: X, G: G, F: F, O: O, P: P, U: U} = draw.PathCommandMap;
const PathScaler = {
    scale(data, scaleX, scaleY) {
        if (!data) return;
        let command;
        let i = 0, len = data.length;
        while (i < len) {
            command = data[i];
            switch (command) {
              case M:
              case L:
                scalePoints(data, scaleX, scaleY, i, 1);
                i += 3;
                break;
              case C:
                scalePoints(data, scaleX, scaleY, i, 3);
                i += 7;
                break;
              case Q:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 5;
                break;
              case Z:
                i += 1;
                break;
              case N:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 5;
                break;
              case D:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 9;
                break;
              case X:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 6;
                break;
              case G:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 9;
                break;
              case F:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 5;
                break;
              case O:
                data[i] = G;
                data.splice(i + 4, 0, data[i + 3], 0);
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 7 + 2;
                len += 2;
                break;
              case P:
                data[i] = F;
                data.splice(i + 4, 0, data[i + 3]);
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 4 + 1;
                len += 1;
                break;
              case U:
                scalePoints(data, scaleX, scaleY, i, 2);
                i += 6;
                break;
            }
        }
    },
    scalePoints(data, scaleX, scaleY, start, pointCount) {
        for (let i = pointCount ? start + 1 : 0, end = pointCount ? i + pointCount * 2 : data.length; i < end; i += 2) {
            data[i] *= scaleX;
            data[i + 1] *= scaleY;
        }
    }
};
const {scalePoints: scalePoints} = PathScaler;
const matrix = draw.MatrixHelper.get();
const {topLeft: topLeft, top: top, topRight: topRight, right: right, bottom: bottom, left: left} = draw.Direction9;
function scaleResize(leaf, scaleX, scaleY) {
    if (leaf.pathInputed) {
        scaleResizePath(leaf, scaleX, scaleY);
    } else {
        if (scaleX !== 1) leaf.width *= scaleX;
        if (scaleY !== 1) leaf.height *= scaleY;
    }
}
function scaleResizeFontSize(leaf, scaleX, scaleY, direction) {
    let fontScale = scaleX;
    if (!draw.isUndefined(direction)) {
        const layout = leaf.__layout;
        let {width: width, height: height} = layout.boxBounds;
        width *= scaleY - scaleX;
        height *= scaleX - scaleY;
        switch (direction) {
          case top:
          case bottom:
            fontScale = scaleY;
            layout.affectScaleOrRotation ? leaf.moveInner(-width / 2, 0) : leaf.x -= width / 2;
            break;
          case left:
          case right:
            layout.affectScaleOrRotation ? leaf.moveInner(0, -height / 2) : leaf.y -= height / 2;
            break;
          case topLeft:
          case topRight:
            layout.affectScaleOrRotation ? leaf.moveInner(0, -height) : leaf.y -= height;
            break;
        }
    }
    leaf.fontSize *= fontScale;
    const data = leaf.__, {padding: padding} = data;
    if (padding) leaf.padding = draw.isArray(padding) ? padding.map(item => item * fontScale) : padding * fontScale;
    if (!data.__autoWidth) leaf.width *= fontScale;
    if (!data.__autoHeight) leaf.height *= fontScale;
}
function scaleResizePath(leaf, scaleX, scaleY) {
    PathScaler.scale(leaf.__.path, scaleX, scaleY);
    leaf.path = leaf.__.path;
}
function scaleResizePoints(leaf, scaleX, scaleY) {
    const {points: points} = leaf;
    draw.isObject(points[0]) ? points.forEach(p => {
        p.x *= scaleX, p.y *= scaleY;
    }) : PathScaler.scalePoints(points, scaleX, scaleY);
    leaf.points = points;
}
function scaleResizeGroup(group, scaleX, scaleY) {
    const {children: children} = group;
    for (let i = 0; i < children.length; i++) {
        matrix.a = scaleX;
        matrix.d = scaleY;
        children[i].transform(matrix, true);
    }
}
const leaf = draw.Leaf.prototype;
leaf.scaleResize = function(scaleX, scaleY = scaleX, noResize) {
    const data = this;
    if (noResize || data.editConfig && data.editConfig.editSize === "scale") {
        data.scaleX *= scaleX;
        data.scaleY *= scaleY;
    } else {
        if (scaleX < 0) data.scaleX *= -1, scaleX = -scaleX;
        if (scaleY < 0) data.scaleY *= -1, scaleY = -scaleY;
        this.__scaleResize(scaleX, scaleY);
    }
};
leaf.__scaleResize = function(scaleX, scaleY) {
    scaleResize(this, scaleX, scaleY);
};
leaf.resizeWidth = function(width) {
    const scale = width / this.getBounds("box", "local").width || 1;
    this.scaleOf(this.__layout.boxBounds, scale, this.__.lockRatio ? scale : 1, true);
};
leaf.resizeHeight = function(height) {
    const scale = height / this.getBounds("box", "local").height || 1;
    this.scaleOf(this.__layout.boxBounds, this.__.lockRatio ? scale : 1, scale, true);
};
draw.Text.prototype.__scaleResize = function(scaleX, scaleY) {
    const {app: app, editConfig: editConfig} = this, editor = app && app.editor, dragPoint = editor && editor.dragPoint;
    if (this.__.resizeFontSize || editConfig && editConfig.editSize === "font-size" || dragPoint && editor.mergedConfig.editSize === "font-size") {
        scaleResizeFontSize(this, scaleX, scaleY, dragPoint && dragPoint.direction);
    } else {
        const {__autoWidth: __autoWidth, __autoHeight: __autoHeight, textAlign: textAlign, verticalAlign: verticalAlign} = this.__, {boxBounds: boxBounds} = this.__layout;
        if (__autoWidth && textAlign !== "left" && scaleX !== 1) this.x += boxBounds.x;
        if (__autoHeight && verticalAlign !== "top" && scaleY !== 1) this.y += boxBounds.y;
        scaleResize(this, scaleX, scaleY);
    }
};
draw.Path.prototype.__scaleResize = function(scaleX, scaleY) {
    scaleResizePath(this, scaleX, scaleY);
};
draw.Line.prototype.__scaleResize = function(scaleX, scaleY) {
    if (this.pathInputed) {
        scaleResizePath(this, scaleX, scaleY);
    } else if (this.points) {
        scaleResizePoints(this, scaleX, scaleY);
    } else {
        this.width *= scaleX;
    }
};
draw.Polygon.prototype.__scaleResize = function(scaleX, scaleY) {
    if (this.pathInputed) {
        scaleResizePath(this, scaleX, scaleY);
    } else if (this.points) {
        scaleResizePoints(this, scaleX, scaleY);
    } else {
        scaleResize(this, scaleX, scaleY);
    }
};
draw.Group.prototype.__scaleResize = function(scaleX, scaleY) {
    scaleResizeGroup(this, scaleX, scaleY);
};
draw.Box.prototype.__scaleResize = function(scaleX, scaleY) {
    const {resizeChildren: resizeChildren, __autoSize: __autoSize} = this.__;
    if (!(__autoSize && resizeChildren)) scaleResize(this, scaleX, scaleY);
    if (resizeChildren) scaleResizeGroup(this, scaleX, scaleY);
};
draw.Plugin.add("resize");
exports.PathScaler = PathScaler;
exports.scaleResize = scaleResize;
exports.scaleResizeFontSize = scaleResizeFontSize;
exports.scaleResizeGroup = scaleResizeGroup;
exports.scaleResizePath = scaleResizePath;
exports.scaleResizePoints = scaleResizePoints;