1
0
Fork 0

Canvas/SVG fix calculating transformation center (Group)

This commit is contained in:
Thomas Geymayer 2013-01-09 12:14:31 +01:00
parent 0d5ed8c05b
commit 73fcf429d0
2 changed files with 35 additions and 33 deletions

View file

@ -137,17 +137,10 @@ var Element = {
# @param ghost Element ghost as retrieved from core methods
new: func(ghost)
{
var m = {
return {
parents: [PropertyElement, Element, 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
#
@ -229,6 +222,22 @@ var Element = {
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)
setCenter: func()
{
@ -236,24 +245,13 @@ var Element = {
if( size(center) != 2 )
return debug.warn("invalid arg");
me._setupCenterNodes();
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);
me._setupCenterNodes(center[0], center[1]);
return me;
},
# Get transformation center
getCenter: func()
{
var bb = me.getBoundingBox();
var center = [0, 0];
me._setupCenterNodes();
if( me._center[0] != nil )
@ -261,11 +259,7 @@ var Element = {
if( me._center[1] != nil )
center[1] = me._center[1].getValue() or 0;
if( bb[0] >= bb[2] or bb[1] >= bb[3] )
return center;
return [ 0.5 * (bb[0] + bb[2]) + center[0],
0.5 * (bb[1] + bb[3]) + center[1] ];
return center;
},
# Internal Transform for convenience transform functions
_getTf: func
@ -274,13 +268,18 @@ var Element = {
me['_tf'] = me.createTransform();
return me._tf;
},
_setupCenterNodes: func()
_setupCenterNodes: func(cx = nil, cy = nil)
{
if( me["_center"] == nil )
me["_center"] = [
me._node.getNode("center[0]"),
me._node.getNode("center[1]")
me._node.getNode("center[0]", cx != nil),
me._node.getNode("center[1]", cy != nil)
];
if( cx != nil )
me._center[0].setDoubleValue(cx);
if( cy != nil )
me._center[1].setDoubleValue(cy);
}
};

View file

@ -357,11 +357,6 @@ var parsesvg = func(group, path, options = nil)
if( dash and size(dash) > 3 )
# at least 2 comma separated values...
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" )
{
@ -392,6 +387,14 @@ var parsesvg = func(group, path, options = nil)
}
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