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 c84cb81c9bd3..53be3b296884 100644 --- a/sw/qa/extras/rtfimport/rtfimport.cxx +++ b/sw/qa/extras/rtfimport/rtfimport.cxx @@ -8,6 +8,7 @@ #include #include +#include #include #include #include @@ -144,6 +145,7 @@ public: void testPoshPosv(); void testN825305(); void testParaBottomMargin(); + void testN823655(); CPPUNIT_TEST_SUITE(Test); #if !defined(MACOSX) && !defined(WNT) @@ -275,6 +277,7 @@ void Test::run() {"posh-posv.rtf", &Test::testPoshPosv}, {"n825305.rtf", &Test::testN825305}, {"para-bottom-margin.rtf", &Test::testParaBottomMargin}, + {"n823655.rtf", &Test::testN823655}, }; header(); for (unsigned int i = 0; i < SAL_N_ELEMENTS(aMethods); ++i) @@ -1306,6 +1309,29 @@ void Test::testParaBottomMargin() CPPUNIT_ASSERT_EQUAL(sal_Int32(0), getProperty(getParagraph(1), "ParaBottomMargin")); } +void Test::testN823655() +{ + uno::Reference xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference xDraws(xDrawPageSupplier->getDrawPage(), uno::UNO_QUERY); + uno::Sequence aProps = getProperty< uno::Sequence >(xDraws->getByIndex(0), "CustomShapeGeometry"); + uno::Sequence 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 >(); + } + uno::Sequence 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 >(); + } + // 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()); +} + CPPUNIT_TEST_SUITE_REGISTRATION(Test); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/writerfilter/source/rtftok/rtfsdrimport.cxx b/writerfilter/source/rtftok/rtfsdrimport.cxx index 1b62df3ff071..6cac9c1cceb0 100644 --- a/writerfilter/source/rtftok/rtfsdrimport.cxx +++ b/writerfilter/source/rtftok/rtfsdrimport.cxx @@ -317,19 +317,19 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose) // 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 oX; + boost::optional 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++; } }