xmloff/source/draw/ximpcustomshape.cxx | 44 ++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-)
New commits: commit 4e04ad3623f2ab4693dcd50a9934fc836e190a6f Author: Armin Le Grand <a...@apache.org> Date: Wed Mar 19 14:51:18 2014 +0000 i124452 correct svg:viewBox for EnhancedCustomShape geometry import when no width and no height are given diff --git a/xmloff/source/draw/ximpcustomshape.cxx b/xmloff/source/draw/ximpcustomshape.cxx index 3c65884..98ae15a 100644 --- a/xmloff/source/draw/ximpcustomshape.cxx +++ b/xmloff/source/draw/ximpcustomshape.cxx @@ -52,6 +52,7 @@ #include <com/sun/star/drawing/EnhancedCustomShapeSegmentCommand.hpp> #include <com/sun/star/drawing/EnhancedCustomShapeTextPathMode.hpp> #include <com/sun/star/drawing/ProjectionMode.hpp> +#include <basegfx/vector/b2dvector.hxx> #include <hash_map> using namespace ::com::sun::star; @@ -853,7 +854,48 @@ void XMLEnhancedCustomShapeContext::StartElement( const uno::Reference< xml::sax case EAS_viewBox : { SdXMLImExViewBox aViewBox( rValue, GetImport().GetMM100UnitConverter() ); - awt::Rectangle aRect( aViewBox.GetX(), aViewBox.GetY(), aViewBox.GetWidth(), aViewBox.GetHeight() ); + awt::Rectangle aRect( + basegfx::fround(aViewBox.GetX()), + basegfx::fround(aViewBox.GetY()), + basegfx::fround(aViewBox.GetWidth()), + basegfx::fround(aViewBox.GetHeight())); + + if(0 == aRect.Width && 0 == aRect.Height) + { + // #124452# If in svg:viewBox no width and height is given the objects should normally + // not be visible at all, but in this case it is a bug in LO to write empty svg:viewBox + // entries for CustomShapes. To allow for a better ODF user experience, just correct this + // here by getting the real object scale from the already set transformation from the xShape. + // Hopefully LO will fix that bug (but this will still leave the files with the error), but + // even when not this will do no harm as long noone uses this state explicitely for some + // purpose (e.g. to really have CustomShapes without content, but unlikely). + // When they do fix this they will need this fix anyways to read their own misformed ODF files + // again, so I guess it will be taken, too... + uno::Reference< beans::XPropertySet > xProps(mrxShape, uno::UNO_QUERY_THROW); + uno::Any aObjectTransform = xProps->getPropertyValue(rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Transformation"))); + drawing::HomogenMatrix3 aTransformMatrix; + aObjectTransform >>= aTransformMatrix; + basegfx::B2DHomMatrix aMatrix; + + aMatrix.set(0, 0, aTransformMatrix.Line1.Column1); + aMatrix.set(0, 1, aTransformMatrix.Line1.Column2); + aMatrix.set(0, 2, aTransformMatrix.Line1.Column3); + aMatrix.set(1, 0, aTransformMatrix.Line2.Column1); + aMatrix.set(1, 1, aTransformMatrix.Line2.Column2); + aMatrix.set(1, 2, aTransformMatrix.Line2.Column3); + aMatrix.set(2, 0, aTransformMatrix.Line3.Column1); + aMatrix.set(2, 1, aTransformMatrix.Line3.Column2); + aMatrix.set(2, 2, aTransformMatrix.Line3.Column3); + + basegfx::B2DVector aScale, aTranslate; + double fRotate, fShearX; + + aMatrix.decompose(aScale, aTranslate, fRotate, fShearX); + + aRect.Width = basegfx::fround(fabs(aScale.getX())); + aRect.Height = basegfx::fround(fabs(aScale.getY())); + } + beans::PropertyValue aProp; aProp.Name = EASGet( EAS_ViewBox ); aProp.Value <<= aRect; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits