filter/source/msfilter/msdffimp.cxx | 29 ++++++++++----- sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt |binary sd/qa/unit/import-tests.cxx | 29 +++++++++++++++ svx/source/customshapes/EnhancedCustomShapeGeometry.cxx | 4 +- 4 files changed, 52 insertions(+), 10 deletions(-)
New commits: commit b795e540e4c4d31618a16ca8456476d5651a4d01 Author: Regina Henschel <rb.hensc...@t-online.de> AuthorDate: Fri Mar 8 19:02:13 2019 +0100 Commit: Regina Henschel <rb.hensc...@t-online.de> CommitDate: Thu Mar 14 13:30:41 2019 +0100 tdf#122899 use unsigned integer for mso_sptArc The path coordinates were read as sal_Int16. But for a mso_sptArc shape the values are unsigned integer. I correct it for this shape type only, because I don't know, whether other places actually need sal_Int16. The change from 0xa504 to 0xa604 in the defaults means a change from 'ClockwiseArcTo' to 'ClockwiseArc' so that an implicit moveto is used, same as in VML command 'wr'. Change-Id: Ib9c594c15d5a97048595efd644a4a6e8774fcefd Reviewed-on: https://gerrit.libreoffice.org/68941 Tested-by: Jenkins Reviewed-by: Regina Henschel <rb.hensc...@t-online.de> diff --git a/filter/source/msfilter/msdffimp.cxx b/filter/source/msfilter/msdffimp.cxx index edf85fe7cbaa..c7a974008f4b 100644 --- a/filter/source/msfilter/msdffimp.cxx +++ b/filter/source/msfilter/msdffimp.cxx @@ -2169,12 +2169,25 @@ void DffPropertyReader::ApplyCustomShapeGeometryAttributes( SvStream& rIn, SfxIt } else { - sal_Int16 nTmpA(0), nTmpB(0); - rIn.ReadInt16( nTmpA ) - .ReadInt16( nTmpB ); - - nX = nTmpA; - nY = nTmpB; + // The mso-spt19 (arc) uses this. But it needs unsigned integer. I don't + // know if other shape types also need it. They can be added as necessary. + bool bNeedsUnsigned = rObjData.eShapeType == mso_sptArc; + if (bNeedsUnsigned) + { + sal_uInt16 nTmpA(0), nTmpB(0); + rIn.ReadUInt16(nTmpA) + .ReadUInt16(nTmpB); + nX = nTmpA; + nY = nTmpB; + } + else + { + sal_Int16 nTmpA(0), nTmpB(0); + rIn.ReadInt16( nTmpA ) + .ReadInt16( nTmpB ); + nX = nTmpA; + nY = nTmpB; + } } EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aCoordinates[ i ].First, nX ); EnhancedCustomShape2d::SetEnhancedCustomShapeParameter( aCoordinates[ i ].Second, nY ); @@ -4528,8 +4541,8 @@ SdrObject* SvxMSDffManager::ImportShape( const DffRecordHeader& rHd, SvStream& r sal_Int32 nX = 0, nY = 0; seqCoordinates[ nPtNum ].First.Value >>= nX; seqCoordinates[ nPtNum ].Second.Value >>= nY; - aP.setX( nX ); - aP.setY( nY ); + aP.setX(nX); + aP.setY(nY); aXP[ static_cast<sal_uInt16>(nPtNum) ] = aP; } aPolyBoundRect = aXP.GetBoundRect(); diff --git a/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt new file mode 100644 index 000000000000..9df17e9a8085 Binary files /dev/null and b/sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt differ diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index 58eb86f3a9fa..ef62c5bfecdc 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -25,6 +25,7 @@ #include <editeng/numitem.hxx> #include <editeng/lrspitem.hxx> #include <editeng/postitem.hxx> +#include <editeng/unoprnms.hxx> #include <svl/style.hxx> #include <sfx2/sfxsids.hrc> @@ -195,6 +196,7 @@ public: void testDescriptionImport(); void testTdf83247(); void testTdf47365(); + void testTdf122899(); CPPUNIT_TEST_SUITE(SdImportTest); @@ -282,6 +284,7 @@ public: CPPUNIT_TEST(testDescriptionImport); CPPUNIT_TEST(testTdf83247); CPPUNIT_TEST(testTdf47365); + CPPUNIT_TEST(testTdf122899); CPPUNIT_TEST_SUITE_END(); }; @@ -2696,6 +2699,32 @@ void SdImportTest::testTdf47365() xDocShRef->DoClose(); } +void SdImportTest::testTdf122899() +{ + // tdf122899 FILEOPEN: ppt: old kind arc from MS Office 97 is broken + // Error was, that the path coordinates of a mso_sptArc shape were read as sal_Int16 + // although they are unsigned 16 bit. This leads to wrong positions of start and end + // point and results to a huge shape width in the test document. + OUString aSrc="sd/qa/unit/data/ppt/tdf122899_Arc_90_to_91_clockwise.ppt"; + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(aSrc), PPT); + uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier( + xDocShRef->GetDoc()->getUnoModel(), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get XDrawPagesSupplier", xDrawPagesSupplier.is()); + uno::Reference<drawing::XDrawPages> xDrawPages(xDrawPagesSupplier->getDrawPages()); + uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPages->getByIndex(0), uno::UNO_QUERY_THROW); + CPPUNIT_ASSERT_MESSAGE("Could not get xDrawPage", xDrawPage.is()); + uno::Reference<drawing::XShape> xShape(xDrawPage->getByIndex(0), uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get xShape", xShape.is()); + awt::Rectangle aFrameRect; + uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get the shape properties", xShapeProps.is()); + xShapeProps->getPropertyValue(UNO_NAME_MISC_OBJ_FRAMERECT) >>= aFrameRect; + // original width is 9cm, add some tolerance + CPPUNIT_ASSERT_LESS(static_cast<sal_Int32>(9020), aFrameRect.Width); + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); diff --git a/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx b/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx index 22533f893eae..ab6d19bcfa07 100644 --- a/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx +++ b/svx/source/customshapes/EnhancedCustomShapeGeometry.cxx @@ -95,8 +95,8 @@ static const SvxMSDffVertPair mso_sptArcVert[] = }; static const sal_uInt16 mso_sptArcSegm[] = { - 0xa504, 0xab00, 0x0001, 0x6001, 0x8000, - 0xa504, 0xaa00, 0x8000 + 0xa604, 0xab00, 0x0001, 0x6001, 0x8000, + 0xa604, 0xaa00, 0x8000 }; static const SvxMSDffCalculationData mso_sptArcCalc[] = { _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits