src/lib/CDRParser.cpp | 4 - src/lib/CDRSVGGenerator.cpp | 96 ++++++++++++++++++++++++++++++++++++++------ src/lib/CDRTransforms.cpp | 2 3 files changed, 86 insertions(+), 16 deletions(-)
New commits: commit 16aad5b68991bb0ae2874f8a7fa196fab8fe5990 Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Wed Feb 27 09:31:05 2013 +0100 Some improvements in rotation of objects in SVG generator diff --git a/src/lib/CDRSVGGenerator.cpp b/src/lib/CDRSVGGenerator.cpp index be717b6..910f0d7 100644 --- a/src/lib/CDRSVGGenerator.cpp +++ b/src/lib/CDRSVGGenerator.cpp @@ -368,10 +368,9 @@ void libcdr::CDRSVGGenerator::drawEllipse(const WPXPropertyList &propList) m_outputSink << "rx=\"" << doubleToString(72*propList["svg:rx"]->getDouble()) << "\" ry=\"" << doubleToString(72*propList["svg:ry"]->getDouble()) << "\" "; writeStyle(); if (propList["libwpg:rotate"] && propList["libwpg:rotate"]->getDouble() != 0.0) - m_outputSink << " transform=\" translate(" << doubleToString(72*propList["svg:cx"]->getDouble()) << ", " << doubleToString(72*propList["svg:cy"]->getDouble()) - << ") rotate(" << doubleToString(-propList["libwpg:rotate"]->getDouble()) - << ") translate(" << doubleToString(-72*propList["svg:cx"]->getDouble()) - << ", " << doubleToString(-72*propList["svg:cy"]->getDouble()) + m_outputSink << " transform=\" rotate(" << doubleToString(-propList["libwpg:rotate"]->getDouble()) + << ", " << doubleToString(72*propList["svg:cy"]->getDouble()) + << ", " << doubleToString(72*propList["svg:cy"]->getDouble()) << ")\" "; m_outputSink << "/>\n"; } @@ -459,7 +458,7 @@ void libcdr::CDRSVGGenerator::drawPath(const ::WPXPropertyListVector &path) m_outputSink << (propList["libwpg:sweep"] ? propList["libwpg:sweep"]->getInt() : 1) << " "; m_outputSink << doubleToString(72*(propList["svg:x"]->getDouble())) << "," << doubleToString(72*(propList["svg:y"]->getDouble())); } - else if ((i >= path.count()-1 && i > 2) && propList["libwpg:path-action"] && propList["libwpg:path-action"]->getStr() == "Z" ) + else if (propList["libwpg:path-action"] && propList["libwpg:path-action"]->getStr() == "Z") { isClosed = true; m_outputSink << "\nZ"; @@ -478,8 +477,34 @@ void libcdr::CDRSVGGenerator::drawGraphicObject(const ::WPXPropertyList &propLis WPXString base64 = binaryData.getBase64Data(); m_outputSink << "<svg:image "; if (propList["svg:x"] && propList["svg:y"] && propList["svg:width"] && propList["svg:height"]) - m_outputSink << "x=\"" << doubleToString(72*(propList["svg:x"]->getDouble())) << "\" y=\"" << doubleToString(72*(propList["svg:y"]->getDouble())) << "\" "; - m_outputSink << "width=\"" << doubleToString(72*(propList["svg:width"]->getDouble())) << "\" height=\"" << doubleToString(72*(propList["svg:height"]->getDouble())) << "\" "; + { + double x(propList["svg:x"]->getDouble()); + double y(propList["svg:y"]->getDouble()); + double width(propList["svg:width"]->getDouble()); + double height(propList["svg:height"]->getDouble()); + bool flipX(propList["draw:mirror-horizontal"] && propList["draw:mirror-horizontal"]->getInt()); + bool flipY(propList["draw:mirror-vertical"] && propList["draw:mirror-vertical"]->getInt()); + + double xmiddle = x + width / 2.0; + double ymiddle = y + height / 2.0; + m_outputSink << "x=\"" << doubleToString(72*x) << "\" y=\"" << doubleToString(72*y) << "\" "; + m_outputSink << "width=\"" << doubleToString(72*width) << "\" height=\"" << doubleToString(72*height) << "\" "; + m_outputSink << "transform=\""; + m_outputSink << " translate(" << doubleToString(72*xmiddle) << ", " << doubleToString (72*ymiddle) << ") "; + m_outputSink << " scale(" << (flipX ? "-1" : "1") << ", " << (flipY ? "-1" : "1") << ") "; + // rotation is around the center of the object's bounding box + if (propList["libwpg:rotate"]) + { + double angle(propList["libwpg:rotate"]->getDouble()); + while (angle > 180.0) + angle -= 360.0; + while (angle < -180.0) + angle += 360.0; + m_outputSink << " rotate(" << doubleToString(angle) << ") "; + } + m_outputSink << " translate(" << doubleToString(-72*xmiddle) << ", " << doubleToString (-72*ymiddle) << ") "; + m_outputSink << "\" "; + } m_outputSink << "xlink:href=\"data:" << propList["libwpg:mime-type"]->getStr().cstr() << ";base64,"; m_outputSink << base64.cstr(); m_outputSink << "\" />\n"; @@ -487,15 +512,60 @@ void libcdr::CDRSVGGenerator::drawGraphicObject(const ::WPXPropertyList &propLis void libcdr::CDRSVGGenerator::startTextObject(const ::WPXPropertyList &propList, const ::WPXPropertyListVector & /* path */) { + double x = 0.0; + double y = 0.0; + double height = 0.0; m_outputSink << "<svg:text "; if (propList["svg:x"] && propList["svg:y"]) - m_outputSink << "x=\"" << doubleToString(72*(propList["svg:x"]->getDouble())) << "\" y=\"" << doubleToString(72*(propList["svg:y"]->getDouble())) << "\""; + { + x = propList["svg:x"]->getDouble(); + y = propList["svg:y"]->getDouble(); + } + + double xmiddle = x; + double ymiddle = y; + + if (propList["svg:width"]) + { + double width = propList["svg:width"]->getDouble(); + xmiddle += width / 2.0; + } + + if (propList["svg:height"]) + { + height = propList["svg:height"]->getDouble(); + ymiddle += height / 2.0; + } + + if (propList["draw:textarea-vertical-align"]) + { + if (propList["draw:textarea-vertical-align"]->getStr() == "middle") + y = ymiddle; + if (propList["draw:textarea-vertical-align"]->getStr() == "bottom") + { + y += height; + if (propList["fo:padding-bottom"]) + y -= propList["fo:padding-bottom"]->getDouble(); + } + } + else + y += height; + + if (propList["fo:padding-left"]) + x += propList["fo:padding-left"]->getDouble(); + + m_outputSink << "x=\"" << doubleToString(72*x) << "\" y=\"" << doubleToString(72*y) << "\""; + + // rotation is around the center of the object's bounding box if (propList["libwpg:rotate"] && propList["libwpg:rotate"]->getDouble() != 0.0) - m_outputSink << " transform=\"translate(" << doubleToString(72*propList["svg:x"]->getDouble()) << ", " << doubleToString(72*propList["svg:y"]->getDouble()) - << ") rotate(" << doubleToString(-propList["libwpg:rotate"]->getDouble()) - << ") translate(" << doubleToString(-72*propList["svg:x"]->getDouble()) - << ", " << doubleToString(-72*propList["svg:y"]->getDouble()) - << ")\""; + { + double angle(propList["libwpg:rotate"]->getDouble()); + while (angle > 180.0) + angle -= 360.0; + while (angle < -180.0) + angle += 360.0; + m_outputSink << " transform=\"rotate(" << doubleToString(angle) << ", " << doubleToString(72*xmiddle) << ", " << doubleToString(72*ymiddle) << ")\" "; + } m_outputSink << ">\n"; } commit 3f5713d58d85fb331d73ba01e958c4d3e628e0ee Author: Fridrich Å trba <fridrich.st...@bluewin.ch> Date: Wed Feb 27 08:55:22 2013 +0100 Some more arc fixes diff --git a/src/lib/CDRParser.cpp b/src/lib/CDRParser.cpp index 8ba5d0b..3e9f6c3 100644 --- a/src/lib/CDRParser.cpp +++ b/src/lib/CDRParser.cpp @@ -1206,10 +1206,10 @@ void libcdr::CDRParser::readEllipse(WPXInputStream *input) double x1 = cx + rx*cos(angle2); double y1 = cy - ry*sin(angle2); - bool largeArc = (angle2 - angle1 > M_PI || angle2 - angle1 < -M_PI); + bool largeArc = (angle2 - angle1 > M_PI); m_collector->collectMoveTo(x0, y0); - m_collector->collectArcTo(rx, ry, largeArc, true, x1, y1); + m_collector->collectArcTo(rx, ry, largeArc, false, x1, y1); if (pie) { m_collector->collectLineTo(cx, cy); diff --git a/src/lib/CDRTransforms.cpp b/src/lib/CDRTransforms.cpp index 9a76a21..5451b9b 100644 --- a/src/lib/CDRTransforms.cpp +++ b/src/lib/CDRTransforms.cpp @@ -120,7 +120,7 @@ void libcdr::CDRTransform::applyToArc(double &rx, double &ry, double &rotation, sweep = !sweep; if (v4 < 0) sweep = !sweep; - + } double libcdr::CDRTransform::_getScaleX() const
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits