Canvas/SVG fix calculating transformation center (Group)
This commit is contained in:
parent
0d5ed8c05b
commit
73fcf429d0
2 changed files with 35 additions and 33 deletions
|
@ -137,17 +137,10 @@ var Element = {
|
||||||
# @param ghost Element ghost as retrieved from core methods
|
# @param ghost Element ghost as retrieved from core methods
|
||||||
new: func(ghost)
|
new: func(ghost)
|
||||||
{
|
{
|
||||||
var m = {
|
return {
|
||||||
parents: [PropertyElement, Element, ghost],
|
parents: [PropertyElement, Element, ghost],
|
||||||
_node: props.wrapNode(ghost._node_ghost)
|
_node: props.wrapNode(ghost._node_ghost)
|
||||||
};
|
};
|
||||||
|
|
||||||
m._center = [
|
|
||||||
m._node.getNode("center[0]"),
|
|
||||||
m._node.getNode("center[1]")
|
|
||||||
];
|
|
||||||
|
|
||||||
return m;
|
|
||||||
},
|
},
|
||||||
# Trigger an update of the element
|
# Trigger an update of the element
|
||||||
#
|
#
|
||||||
|
@ -229,6 +222,22 @@ var Element = {
|
||||||
|
|
||||||
return [0, 0, 0, 0];
|
return [0, 0, 0, 0];
|
||||||
},
|
},
|
||||||
|
# Calculate the transformation center based on bounding box and center-offset
|
||||||
|
updateCenter: func
|
||||||
|
{
|
||||||
|
me.update();
|
||||||
|
var bb = me.getTransformedBounds();
|
||||||
|
|
||||||
|
if( bb[0] > bb[2] or bb[1] > bb[3] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
me._setupCenterNodes
|
||||||
|
(
|
||||||
|
(bb[0] + bb[2]) / 2 + (me.get("center-offset-x") or 0),
|
||||||
|
(bb[1] + bb[3]) / 2 + (me.get("center-offset-y") or 0)
|
||||||
|
);
|
||||||
|
return me;
|
||||||
|
},
|
||||||
# Set transformation center (currently only used for rotation)
|
# Set transformation center (currently only used for rotation)
|
||||||
setCenter: func()
|
setCenter: func()
|
||||||
{
|
{
|
||||||
|
@ -236,24 +245,13 @@ var Element = {
|
||||||
if( size(center) != 2 )
|
if( size(center) != 2 )
|
||||||
return debug.warn("invalid arg");
|
return debug.warn("invalid arg");
|
||||||
|
|
||||||
me._setupCenterNodes();
|
me._setupCenterNodes(center[0], center[1]);
|
||||||
|
|
||||||
if( me._center[0] == nil )
|
|
||||||
me._center[0] = me._node.getNode("center[0]", 1);
|
|
||||||
if( me._center[1] == nil )
|
|
||||||
me._center[1] = me._node.getNode("center[1]", 1);
|
|
||||||
|
|
||||||
me._center[0].setDoubleValue(center[0] or 0);
|
|
||||||
me._center[1].setDoubleValue(center[1] or 0);
|
|
||||||
|
|
||||||
return me;
|
return me;
|
||||||
},
|
},
|
||||||
# Get transformation center
|
# Get transformation center
|
||||||
getCenter: func()
|
getCenter: func()
|
||||||
{
|
{
|
||||||
var bb = me.getBoundingBox();
|
|
||||||
var center = [0, 0];
|
var center = [0, 0];
|
||||||
|
|
||||||
me._setupCenterNodes();
|
me._setupCenterNodes();
|
||||||
|
|
||||||
if( me._center[0] != nil )
|
if( me._center[0] != nil )
|
||||||
|
@ -261,11 +259,7 @@ var Element = {
|
||||||
if( me._center[1] != nil )
|
if( me._center[1] != nil )
|
||||||
center[1] = me._center[1].getValue() or 0;
|
center[1] = me._center[1].getValue() or 0;
|
||||||
|
|
||||||
if( bb[0] >= bb[2] or bb[1] >= bb[3] )
|
return center;
|
||||||
return center;
|
|
||||||
|
|
||||||
return [ 0.5 * (bb[0] + bb[2]) + center[0],
|
|
||||||
0.5 * (bb[1] + bb[3]) + center[1] ];
|
|
||||||
},
|
},
|
||||||
# Internal Transform for convenience transform functions
|
# Internal Transform for convenience transform functions
|
||||||
_getTf: func
|
_getTf: func
|
||||||
|
@ -274,13 +268,18 @@ var Element = {
|
||||||
me['_tf'] = me.createTransform();
|
me['_tf'] = me.createTransform();
|
||||||
return me._tf;
|
return me._tf;
|
||||||
},
|
},
|
||||||
_setupCenterNodes: func()
|
_setupCenterNodes: func(cx = nil, cy = nil)
|
||||||
{
|
{
|
||||||
if( me["_center"] == nil )
|
if( me["_center"] == nil )
|
||||||
me["_center"] = [
|
me["_center"] = [
|
||||||
me._node.getNode("center[0]"),
|
me._node.getNode("center[0]", cx != nil),
|
||||||
me._node.getNode("center[1]")
|
me._node.getNode("center[1]", cy != nil)
|
||||||
];
|
];
|
||||||
|
|
||||||
|
if( cx != nil )
|
||||||
|
me._center[0].setDoubleValue(cx);
|
||||||
|
if( cy != nil )
|
||||||
|
me._center[1].setDoubleValue(cy);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -357,11 +357,6 @@ var parsesvg = func(group, path, options = nil)
|
||||||
if( dash and size(dash) > 3 )
|
if( dash and size(dash) > 3 )
|
||||||
# at least 2 comma separated values...
|
# at least 2 comma separated values...
|
||||||
stack[-1].setStrokeDashArray(split(',', dash));
|
stack[-1].setStrokeDashArray(split(',', dash));
|
||||||
|
|
||||||
var cx = attr['inkscape:transform-center-x'];
|
|
||||||
var cy = attr['inkscape:transform-center-y'];
|
|
||||||
if( cx != nil or cy != nil )
|
|
||||||
stack[-1].setCenter(cx or 0, -(cy or 0));
|
|
||||||
}
|
}
|
||||||
else if( name == "tspan" )
|
else if( name == "tspan" )
|
||||||
{
|
{
|
||||||
|
@ -392,6 +387,14 @@ var parsesvg = func(group, path, options = nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
parseTransform(attr['transform']);
|
parseTransform(attr['transform']);
|
||||||
|
|
||||||
|
var cx = attr['inkscape:transform-center-x'];
|
||||||
|
if( cx != nil and cx != 0 )
|
||||||
|
stack[-1].setDouble("center-offset-x", cx);
|
||||||
|
|
||||||
|
var cy = attr['inkscape:transform-center-y'];
|
||||||
|
if( cy != nil and cy != 0 )
|
||||||
|
stack[-1].setDouble("center-offset-y", -cy);
|
||||||
};
|
};
|
||||||
|
|
||||||
# XML parsers element close callback
|
# XML parsers element close callback
|
||||||
|
|
Loading…
Add table
Reference in a new issue