Related: tdf#128611 RTF import: handle vertical flip of line shapes
UI uses SdrEditView::MirrorMarkedObjVertical() to flip a line shape vertically, handle it similarly at import time as well. Also note that this flips in-place, while the naive '*= -1' for the height would have an incorrect vertical position. Change-Id: I42b7feb5f799b99337ddec734dcf98dd1d553755 Reviewed-on: https://gerrit.libreoffice.org/83929 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
This commit is contained in:
parent
895cd72158
commit
f9f421b7be
3 changed files with 67 additions and 0 deletions
29
sw/qa/extras/rtfimport/data/tdf128611.rtf
Normal file
29
sw/qa/extras/rtfimport/data/tdf128611.rtf
Normal file
|
@ -0,0 +1,29 @@
|
|||
{\rtf1
|
||||
\paperw11906\paperh16838\margl1417\margr1417\margt1417\margb1417
|
||||
\pard\plain
|
||||
{\shp
|
||||
{\*\shpinst\shpleft-5\shptop248\shpright8933\shpbottom1838\shpfhdr0\shpbxmargin\shpbxignore\shpbymargin\shpbyignore\shpwr0\shpwrk0\shpfblwtxt0\shpz0\shplid1028
|
||||
{\sp
|
||||
{\sn shapeType}
|
||||
{\sv 20}
|
||||
}
|
||||
{\sp
|
||||
{\sn fFlipH}
|
||||
{\sv 0}
|
||||
}
|
||||
{\sp
|
||||
{\sn fFlipV}
|
||||
{\sv 1}
|
||||
}
|
||||
{\sp
|
||||
{\sn posrelh}
|
||||
{\sv 3}
|
||||
}
|
||||
}
|
||||
{\shprslt
|
||||
{\*\do\dobxmargin\dobymargin\dodhgt8192
|
||||
\dpline\dpptx8938\dppty0\dpptx0\dppty1590\dpx-5\dpy9248\dpxsize8938\dpysize1590\dplinew15\dplinecor0\dplinecog0\dplinecob0}
|
||||
}
|
||||
}
|
||||
\par
|
||||
}
|
|
@ -903,6 +903,25 @@ CPPUNIT_TEST_FIXTURE(Test, testOleInline)
|
|||
getProperty<text::TextContentAnchorType>(getShape(1), "AnchorType"));
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(Test, testTdf128611)
|
||||
{
|
||||
load(mpTestDocumentPath, "tdf128611.rtf");
|
||||
auto aPolyPolySequence
|
||||
= getProperty<uno::Sequence<uno::Sequence<awt::Point>>>(getShape(1), "PolyPolygon");
|
||||
CPPUNIT_ASSERT(aPolyPolySequence.hasElements());
|
||||
uno::Sequence<awt::Point>& rPolygon = aPolyPolySequence[0];
|
||||
CPPUNIT_ASSERT_GREATER(static_cast<sal_uInt32>(1), rPolygon.size());
|
||||
sal_Int32 nY1 = rPolygon[0].Y;
|
||||
sal_Int32 nY2 = rPolygon[1].Y;
|
||||
|
||||
// Without the accompanying fix in place, this test would have failed with:
|
||||
// - Expected greater than: 6242
|
||||
// - Actual : 3438
|
||||
// i.e. the vertical flip was missing, and the y1 > y2 assert failed, because the line pointed
|
||||
// from top left to bottom right, not bottom left to top right.
|
||||
CPPUNIT_ASSERT_GREATER(nY2, nY1);
|
||||
}
|
||||
|
||||
CPPUNIT_TEST_FIXTURE(Test, testFdo80742)
|
||||
{
|
||||
load(mpTestDocumentPath, "fdo80742.rtf");
|
||||
|
|
|
@ -45,6 +45,9 @@
|
|||
#include <oox/helper/propertyset.hxx>
|
||||
#include <boost/logic/tribool.hpp>
|
||||
#include <basegfx/matrix/b2dhommatrix.hxx>
|
||||
#include <svx/unoapi.hxx>
|
||||
#include <svx/svdobj.hxx>
|
||||
|
||||
#include <dmapper/GraphicZOrderHelper.hxx>
|
||||
#include "rtfdocumentimpl.hxx"
|
||||
|
||||
|
@ -1046,6 +1049,22 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap
|
|||
"CustomShapeGeometry",
|
||||
uno::makeAny(aCustomShapeGeometry.getAsConstPropertyValueList()));
|
||||
}
|
||||
else if (SdrObject* pObject = GetSdrObjectFromXShape(xShape))
|
||||
{
|
||||
Point aRef1 = pObject->GetSnapRect().Center();
|
||||
Point aRef2(aRef1);
|
||||
if (obFlipH == true)
|
||||
{
|
||||
// Horizontal mirror means a vertical reference line.
|
||||
aRef2.AdjustY(1);
|
||||
}
|
||||
if (obFlipV == true)
|
||||
{
|
||||
// Vertical mirror means a horizontal reference line.
|
||||
aRef2.AdjustX(1);
|
||||
}
|
||||
pObject->Mirror(aRef1, aRef2);
|
||||
}
|
||||
}
|
||||
|
||||
if (rShape.getHoriOrientRelation() != 0)
|
||||
|
|
Loading…
Reference in a new issue