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
This commit is contained in:
48
sw/qa/extras/rtfimport/data/n823655.rtf
Normal file
48
sw/qa/extras/rtfimport/data/n823655.rtf
Normal file
@@ -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
|
||||
}
|
@@ -8,6 +8,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>
|
||||
@@ -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<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();
|
||||
|
@@ -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<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++;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user