GSoC: import VML shape adjustments
Change-Id: Ifcd49f34b889b34eba2464de6e083f9021633bc6 Reviewed-on: https://gerrit.libreoffice.org/38427 Reviewed-by: Jan Holesovsky <kendy@collabora.com> Tested-by: Jan Holesovsky <kendy@collabora.com>
This commit is contained in:
committed by
Jan Holesovsky
parent
9614f12bae
commit
c8e3fea499
@@ -89,6 +89,7 @@ struct OOX_DLLPUBLIC ShapeTypeModel
|
||||
OUString maWrapStyle; ///< Wrapping mode for text.
|
||||
OUString maArcsize; ///< round rectangles arc size
|
||||
OUString maEditAs; ///< Edit As type (e.g. "canvas" etc)
|
||||
OUString maAdjustments; ///< Shape adjustment values
|
||||
|
||||
StrokeModel maStrokeModel; ///< Border line formatting.
|
||||
FillModel maFillModel; ///< Shape fill formatting.
|
||||
|
@@ -2351,16 +2351,17 @@ void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool b
|
||||
EscherPropertyContainer::LookForPolarHandles( eShapeType, nAdjustmentsWhichNeedsToBeConverted );
|
||||
|
||||
sal_Int32 nValue, nLength = aAdjustmentSeq.getLength();
|
||||
//aAdjustments will give info about the number of adj values for a particular geometry. For example for hexagon aAdjustments.size() will be 2 and for circular arrow it will be 5 as per lcl_getAdjNames.
|
||||
if(aAdjustments.size() == static_cast<sal_uInt32>(nLength))// In case there is a mismatch do not write the XML_gd tag.
|
||||
// aAdjustments will give info about the number of adj values for a particular geometry. For example for hexagon aAdjustments.size() will be 2 and for circular arrow it will be 5 as per lcl_getAdjNames.
|
||||
// Sometimes there are more values than needed, so we ignore the excessive ones.
|
||||
if (aAdjustments.size() <= static_cast<sal_uInt32>(nLength))
|
||||
{
|
||||
for( sal_Int32 i=0; i < nLength; i++ )
|
||||
for (sal_Int32 i = 0; i < static_cast<sal_Int32>(aAdjustments.size()); i++)
|
||||
{
|
||||
if( EscherPropertyContainer::GetAdjustmentValue( aAdjustmentSeq[ i ], i, nAdjustmentsWhichNeedsToBeConverted, nValue ) )
|
||||
{
|
||||
// If the document model doesn't have an adjustment name (e.g. shape was created from VML), then take it from the predefined list.
|
||||
OString aAdjName;
|
||||
if (static_cast<sal_uInt32>(i) < aAdjustments.size() && aAdjustmentSeq[i].Name.isEmpty())
|
||||
if (aAdjustmentSeq[i].Name.isEmpty())
|
||||
aAdjName = aAdjustments[i];
|
||||
|
||||
mpFS->singleElementNS( XML_a, XML_gd,
|
||||
|
@@ -789,25 +789,44 @@ Reference< XShape > SimpleShape::implConvertAndInsert( const Reference< XShapes
|
||||
}
|
||||
}
|
||||
|
||||
// custom shape geometry attributes
|
||||
std::vector<css::beans::PropertyValue> aPropVec;
|
||||
|
||||
// When flip has 'x' or 'y', the associated ShapeRect will be changed but direction change doesn't occur.
|
||||
// It might occur internally in SdrObject of "sw" module, not here.
|
||||
// The associated properties "PROP_MirroredX" and "PROP_MirroredY" have to be set here so that direction change will occur internally.
|
||||
if (bFlipX || bFlipY)
|
||||
{
|
||||
assert(!(bFlipX && bFlipY));
|
||||
css::uno::Sequence< css::beans::PropertyValue > aPropSequence (1);
|
||||
css::beans::PropertyValue aProp;
|
||||
if (bFlipX)
|
||||
{
|
||||
aPropSequence [0].Name = "MirroredX";
|
||||
aPropSequence [0].Value <<= bFlipX;
|
||||
}
|
||||
aProp.Name = "MirroredX";
|
||||
else
|
||||
{
|
||||
aPropSequence [0].Name = "MirroredY";
|
||||
aPropSequence [0].Value <<= bFlipY;
|
||||
}
|
||||
aPropertySet.setAnyProperty(PROP_CustomShapeGeometry, makeAny( aPropSequence ) );
|
||||
aProp.Name = "MirroredY";
|
||||
aProp.Value <<= true;
|
||||
aPropVec.push_back(aProp);
|
||||
}
|
||||
|
||||
if (!maTypeModel.maAdjustments.isEmpty())
|
||||
{
|
||||
std::vector<drawing::EnhancedCustomShapeAdjustmentValue> aAdjustmentValues;
|
||||
sal_Int32 nIndex = 0;
|
||||
do
|
||||
{
|
||||
OUString aToken = maTypeModel.maAdjustments.getToken(0, ',', nIndex);
|
||||
drawing::EnhancedCustomShapeAdjustmentValue aAdjustmentValue;
|
||||
aAdjustmentValue.Value <<= aToken.toInt32();
|
||||
aAdjustmentValues.push_back(aAdjustmentValue);
|
||||
} while (nIndex >= 0);
|
||||
|
||||
css::beans::PropertyValue aProp;
|
||||
aProp.Name = "AdjustmentValues";
|
||||
aProp.Value <<= comphelper::containerToSequence(aAdjustmentValues);
|
||||
aPropVec.push_back(aProp);
|
||||
}
|
||||
|
||||
if (!aPropVec.empty())
|
||||
aPropertySet.setAnyProperty(PROP_CustomShapeGeometry, makeAny(comphelper::containerToSequence(aPropVec)));
|
||||
}
|
||||
|
||||
lcl_SetAnchorType(aPropertySet, maTypeModel, rGraphicHelper );
|
||||
|
@@ -312,9 +312,11 @@ ShapeTypeContext::ShapeTypeContext( ContextHandler2Helper& rParent, ShapeType& r
|
||||
mrTypeModel.maFillModel.moColor = rAttribs.getString( XML_fillcolor );
|
||||
|
||||
// For roundrect we may have a arcsize attribute to read
|
||||
mrTypeModel.maArcsize = rAttribs.getString( XML_arcsize,OUString( ) );
|
||||
mrTypeModel.maArcsize = rAttribs.getString(XML_arcsize, OUString());
|
||||
// editas
|
||||
mrTypeModel.maEditAs = rAttribs.getString(XML_editas, OUString());
|
||||
|
||||
mrTypeModel.maAdjustments = rAttribs.getString(XML_adj, OUString());
|
||||
}
|
||||
|
||||
ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const AttributeList& rAttribs )
|
||||
|
BIN
sw/qa/extras/ooxmlimport/data/vml-adjustments.docx
Executable file
BIN
sw/qa/extras/ooxmlimport/data/vml-adjustments.docx
Executable file
Binary file not shown.
@@ -25,6 +25,7 @@
|
||||
#include <com/sun/star/document/XEmbeddedObjectSupplier2.hpp>
|
||||
#include <com/sun/star/drawing/PointSequenceSequence.hpp>
|
||||
#include <com/sun/star/drawing/GraphicExportFilter.hpp>
|
||||
#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
|
||||
#include <com/sun/star/lang/XServiceInfo.hpp>
|
||||
#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
|
||||
#include <com/sun/star/text/HoriOrientation.hpp>
|
||||
@@ -1290,6 +1291,16 @@ DECLARE_OOXMLIMPORT_TEST(testTdf108408, "tdf108408.docx")
|
||||
CPPUNIT_ASSERT_EQUAL(double(20), getProperty<double>(xRun, "CharHeight"));
|
||||
}
|
||||
|
||||
DECLARE_OOXMLIMPORT_TEST(testVmlAdjustments, "vml-adjustments.docx")
|
||||
{
|
||||
uno::Reference<beans::XPropertySet> xPropertySet(getShape(1), uno::UNO_QUERY);
|
||||
comphelper::SequenceAsHashMap aGeometry(xPropertySet->getPropertyValue("CustomShapeGeometry"));
|
||||
uno::Sequence<drawing::EnhancedCustomShapeAdjustmentValue> aAdjustmentValues =
|
||||
aGeometry["AdjustmentValues"].get<uno::Sequence<drawing::EnhancedCustomShapeAdjustmentValue>>();
|
||||
CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aAdjustmentValues.getLength());
|
||||
drawing::EnhancedCustomShapeAdjustmentValue aAdjustmentValue = *aAdjustmentValues.begin();
|
||||
CPPUNIT_ASSERT_EQUAL(sal_Int32(17639), aAdjustmentValue.Value.get<sal_Int32>());
|
||||
}
|
||||
|
||||
// tests should only be added to ooxmlIMPORT *if* they fail round-tripping in ooxmlEXPORT
|
||||
|
||||
|
Reference in New Issue
Block a user