tdf#91684 RTF import: handle fFlipH and fFlipV shape props

Change-Id: I930f99647de00c2e43ef94b1ac0320daa440eae9
Reviewed-on: https://gerrit.libreoffice.org/26349
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
Tested-by: Jenkins <ci@libreoffice.org>
This commit is contained in:
Miklos Vajna
2016-06-16 09:13:04 +02:00
parent b0a9ba98ba
commit 63965d7dc5
3 changed files with 133 additions and 0 deletions

View File

@@ -0,0 +1,96 @@
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31506\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0
\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0
\f31506\fs22\lang1033\langfe1033\cgrid\langnp1033\langfenp1033
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid12721412
{\shp
{\*\shpinst\shpleft537\shptop201\shpright2361\shpbottom1136\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026
{\sp
{\sn shapeType}
{\sv 6}
}
{\sp
{\sn fFlipH}
{\sv 1}
}
{\sp
{\sn fFlipV}
{\sv 1}
}
{\sp
{\sn wzName}
{\sv h-and-v}
}
}
{\shprslt
}
}
{\shp
{\*\shpinst\shpleft537\shptop1201\shpright2361\shpbottom2136\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026
{\sp
{\sn shapeType}
{\sv 6}
}
{\sp
{\sn fFlipH}
{\sv 1}
}
{\sp
{\sn fFlipV}
{\sv 0}
}
{\sp
{\sn wzName}
{\sv h-only}
}
}
{\shprslt
}
}
{\shp
{\*\shpinst\shpleft537\shptop2201\shpright2361\shpbottom3136\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026
{\sp
{\sn shapeType}
{\sv 6}
}
{\sp
{\sn fFlipH}
{\sv 0}
}
{\sp
{\sn fFlipV}
{\sv 1}
}
{\sp
{\sn wzName}
{\sv v-only}
}
}
{\shprslt
}
}
{\shp
{\*\shpinst\shpleft537\shptop3201\shpright2361\shpbottom4136\shpfhdr0\shpbxcolumn\shpbxignore\shpbypara\shpbyignore\shpwr3\shpwrk0\shpfblwtxt0\shpz0\shplid1026
{\sp
{\sn shapeType}
{\sv 6}
}
{\sp
{\sn fFlipH}
{\sv 0}
}
{\sp
{\sn fFlipV}
{\sv 0}
}
{\sp
{\sn wzName}
{\sv neither-h-nor-v}
}
}
{\shprslt
}
}
}
{\rtlch\fcs1 \af31507 \ltrch\fcs0 \insrsid13321744
\par }
}

View File

@@ -2641,6 +2641,26 @@ DECLARE_RTFIMPORT_TEST(testTdf91684, "tdf91684.rtf")
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1337), getShape(1)->getSize().Height);
}
DECLARE_RTFIMPORT_TEST(testFlip, "flip.rtf")
{
comphelper::SequenceAsHashMap aMap = getProperty< uno::Sequence<beans::PropertyValue> >(getShapeByName("h-and-v"), "CustomShapeGeometry");
// This resulted in a uno::RuntimeException, as MirroredX wasn't set at all, so could not extract void to boolean.
CPPUNIT_ASSERT_EQUAL(true, aMap["MirroredX"].get<bool>());
CPPUNIT_ASSERT_EQUAL(true, aMap["MirroredY"].get<bool>());
aMap = getProperty< uno::Sequence<beans::PropertyValue> >(getShapeByName("h-only"), "CustomShapeGeometry");
CPPUNIT_ASSERT_EQUAL(true, aMap["MirroredX"].get<bool>());
CPPUNIT_ASSERT(!aMap["MirroredY"].hasValue());
aMap = getProperty< uno::Sequence<beans::PropertyValue> >(getShapeByName("v-only"), "CustomShapeGeometry");
CPPUNIT_ASSERT(!aMap["MirroredX"].hasValue());
CPPUNIT_ASSERT_EQUAL(true, aMap["MirroredY"].get<bool>());
aMap = getProperty< uno::Sequence<beans::PropertyValue> >(getShapeByName("neither-h-nor-v"), "CustomShapeGeometry");
CPPUNIT_ASSERT(!aMap["MirroredX"].hasValue());
CPPUNIT_ASSERT(!aMap["MirroredY"].hasValue());
}
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */

View File

@@ -351,6 +351,8 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap
sal_Int16 nRelativeWidthRelation = text::RelOrientation::PAGE_FRAME;
sal_Int16 nRelativeHeightRelation = text::RelOrientation::PAGE_FRAME;
boost::logic::tribool obRelFlipV(boost::logic::indeterminate);
boost::logic::tribool obFlipH(boost::logic::indeterminate);
boost::logic::tribool obFlipV(boost::logic::indeterminate);
bool bCustom(false);
int const nType = initShape(xShape, xPropertySet, bCustom, rShape, bClose, shapeOrPict);
@@ -783,6 +785,10 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap
}
else if (rProperty.first == "fRelFlipV")
obRelFlipV = rProperty.second.toInt32() == 1;
else if (rProperty.first == "fFlipH")
obFlipH = rProperty.second.toInt32() == 1;
else if (rProperty.first == "fFlipV")
obFlipV = rProperty.second.toInt32() == 1;
else
SAL_INFO("writerfilter", "TODO handle shape property '" << rProperty.first << "':'" << rProperty.second << "'");
}
@@ -908,6 +914,17 @@ void RTFSdrImport::resolve(RTFShape& rShape, bool bClose, ShapeOrPict const shap
else
xShape->setSize(awt::Size(rShape.nRight - rShape.nLeft, rShape.nBottom - rShape.nTop));
if (obFlipH == true || obFlipV == true)
{
// This has to be set after position and size is set, otherwise flip will affect the position.
comphelper::SequenceAsHashMap aCustomShapeGeometry(xPropertySet->getPropertyValue("CustomShapeGeometry"));
if (obFlipH == true)
aCustomShapeGeometry["MirroredX"] <<= true;
if (obFlipV == true)
aCustomShapeGeometry["MirroredY"] <<= true;
xPropertySet->setPropertyValue("CustomShapeGeometry", uno::makeAny(aCustomShapeGeometry.getAsConstPropertyValueList()));
}
if (rShape.nHoriOrientRelation != 0)
xPropertySet->setPropertyValue("HoriOrientRelation", uno::makeAny(rShape.nHoriOrientRelation));
if (rShape.nVertOrientRelation != 0)