summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@suse.cz>2013-06-24 14:13:39 +0200
committerMiklos Vajna <vmiklos@suse.cz>2013-06-24 16:42:18 +0200
commit48a25944a8bc00f4cac90c602c01f9f1ecd63256 (patch)
treebbd74dc0873be12614d999bc9ad6ac0e05d13794
parent59d70e958005cd0ca93eb5def4fae7174bc9fb65 (diff)
bnc#823655 fix RTF import of freeform shape coordinates
E.g. 0,1 was imported as 1,0, as we did not differentiate between not having the coordinate yet and having it as zero. Change-Id: Ia5fbbcc791dc9c6866ffd4c146793690661d81b4 (cherry picked from commit ddddfe8d6ffa05c467bddb3480e43d7043a3d3c9)
-rw-r--r--sw/qa/extras/rtfimport/data/n823655.rtf48
-rw-r--r--sw/qa/extras/rtfimport/rtfimport.cxx26
-rw-r--r--writerfilter/source/rtftok/rtfsdrimport.cxx14
3 files changed, 81 insertions, 7 deletions
diff --git a/sw/qa/extras/rtfimport/data/n823655.rtf b/sw/qa/extras/rtfimport/data/n823655.rtf
new file mode 100644
index 000000000000..94e73edaa6a3
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/n823655.rtf
@@ -0,0 +1,48 @@
+{\rtf1
+foo
+{\shp
+{\*\shpinst\shpleft450\shptop1904\shpright11595\shpbottom2190\shpfhdr0\shpbxpage\shpbxignore\shpbypage\shpbyignore\shpwr3\shpwrk0\shpfblwtxt1\shpz0\shplid1026
+{\sp
+{\sn shapeType}
+{\sv 0}
+}
+{\sp
+{\sn fFlipH}
+{\sv 0}
+}
+{\sp
+{\sn fFlipV}
+{\sv 0}
+}
+{\sp
+{\sn geoRight}
+{\sv 11145}
+}
+{\sp
+{\sn geoBottom}
+{\sv 286}
+}
+{\sp
+{\sn pVerticies}
+{\sv 8;4;(0,286);(11145,286);(11145,1);(0,1)}
+}
+{\sp
+{\sn pSegmentInfo}
+{\sv 2;5;16384;1;1;1;32768}
+}
+{\sp
+{\sn fFillOK}
+{\sv 1}
+}
+{\sp
+{\sn fillColor}
+{\sv 15000804}
+}
+{\sp
+{\sn fFilled}
+{\sv 1}
+}
+}
+}
+\par
+}
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index d3362da67239..84d59c0b69af 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -27,6 +27,7 @@
#include <com/sun/star/document/XFilter.hpp>
#include <com/sun/star/document/XImporter.hpp>
+#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeSegment.hpp>
#include <com/sun/star/drawing/LineStyle.hpp>
#include <com/sun/star/drawing/XDrawPageSupplier.hpp>
@@ -151,6 +152,7 @@ public:
void testFdo64671();
void testN825305();
void testParaBottomMargin();
+ void testN823655();
CPPUNIT_TEST_SUITE(Test);
#if !defined(MACOSX) && !defined(WNT)
@@ -272,6 +274,7 @@ void Test::run()
{"fdo64671.rtf", &Test::testFdo64671},
{"n825305.rtf", &Test::testN825305},
{"para-bottom-margin.rtf", &Test::testParaBottomMargin},
+ {"n823655.rtf", &Test::testN823655},
};
for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i)
{
@@ -1252,6 +1255,29 @@ void Test::testParaBottomMargin()
CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty<sal_Int32>(getParagraph(1), "ParaBottomMargin"));
}
+void Test::testN823655()
+{
+ uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY);
+ uno::Reference<container::XIndexAccess> xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY);
+ uno::Sequence<beans::PropertyValue> aProps = getProperty< uno::Sequence<beans::PropertyValue> >(xDraws->getByIndex(0), "CustomShapeGeometry");
+ uno::Sequence<beans::PropertyValue> aPathProps;
+ for (int i = 0; i < aProps.getLength(); ++i)
+ {
+ const beans::PropertyValue& rProp = aProps[i];
+ if (rProp.Name == "Path")
+ aPathProps = rProp.Value.get< uno::Sequence<beans::PropertyValue> >();
+ }
+ uno::Sequence<drawing::EnhancedCustomShapeParameterPair> aCoordinates;
+ for (int i = 0; i < aPathProps.getLength(); ++i)
+ {
+ const beans::PropertyValue& rProp = aPathProps[i];
+ if (rProp.Name == "Coordinates")
+ aCoordinates = rProp.Value.get< uno::Sequence<drawing::EnhancedCustomShapeParameterPair> >();
+ }
+ // The first coordinate pair of this freeform shape was 286,0 instead of 0,286.
+ CPPUNIT_ASSERT_EQUAL(sal_Int32(286), aCoordinates[0].Second.Value.get<sal_Int32>());
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(Test);
CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx
index 3bb7af932492..62a6cb5b1e38 100644
--- a/writerfilter/source/rtftok/rtfsdrimport.cxx
+++ b/writerfilter/source/rtftok/rtfsdrimport.cxx
@@ -192,19 +192,19 @@ void RTFSdrImport::resolve(RTFShape& rShape)
// The coordinates are in an (x,y) form.
aToken = aToken.copy(1, aToken.getLength() - 2);
sal_Int32 nI = 0;
- sal_Int32 nX = 0;
- sal_Int32 nY = 0;
+ boost::optional<sal_Int32> oX;
+ boost::optional<sal_Int32> oY;
do
{
OUString aPoint = aToken.getToken(0, ',', nI);
- if (!nX)
- nX = aPoint.toInt32();
+ if (!oX)
+ oX.reset(aPoint.toInt32());
else
- nY = aPoint.toInt32();
+ oY.reset(aPoint.toInt32());
}
while (nI >= 0);
- aCoordinates[nIndex].First.Value <<= nX;
- aCoordinates[nIndex].Second.Value <<= nY;
+ aCoordinates[nIndex].First.Value <<= *oX;
+ aCoordinates[nIndex].Second.Value <<= *oY;
nIndex++;
}
}