summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/source/drawingml/shape.cxx16
-rw-r--r--oox/source/drawingml/textbodypropertiescontext.cxx3
-rw-r--r--oox/source/export/drawingml.cxx18
-rw-r--r--oox/source/token/properties.txt1
-rw-r--r--sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptxbin0 -> 34718 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx34
6 files changed, 63 insertions, 9 deletions
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index a0058bb30242..88ed816c21c0 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -597,13 +597,15 @@ static void lcl_createPresetShape(const uno::Reference<drawing::XShape>& xShape,
lcl_resetPropertyValue( aGeomPropVec, sPath );
lcl_resetPropertyValue( aGeomPropVec, sAdjustmentValues);
- // Some shapes don't need scaling
- bool bScale = true;
- if ( rPresetType == "textRingInside"
- || rPresetType == "textRingOutside"
- || rPresetType == "textCirclePour" )
+ bool bFromWordArt(false);
+ pTextBody->getTextProperties().maPropertyMap.getProperty(PROP_FromWordArt) >>= bFromWordArt;
+
+ bool bScaleX(false);
+ if (!bFromWordArt
+ && (rPresetType == "textArchDown" || rPresetType == "textArchUp"
+ || rPresetType == "textCircle" || rPresetType == "textButton"))
{
- bScale = false;
+ bScaleX = true;
}
// Apply geometry properties
@@ -612,7 +614,7 @@ static void lcl_createPresetShape(const uno::Reference<drawing::XShape>& xShape,
{ { sTextPath, uno::makeAny( true ) },
{ "TextPathMode",
uno::Any( drawing::EnhancedCustomShapeTextPathMode_PATH ) },
- { "ScaleX", uno::Any( bScale ) } } ) );
+ { "ScaleX", uno::Any(bScaleX) } } ) );
lcl_setPropertyValue( aGeomPropVec, sTextPath,
comphelper::makePropertyValue( sTextPath, aPropertyValues ) );
diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx
index 9c18536a4a86..48654a0bc4d2 100644
--- a/oox/source/drawingml/textbodypropertiescontext.cxx
+++ b/oox/source/drawingml/textbodypropertiescontext.cxx
@@ -82,7 +82,8 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper cons
// bool bCompatLineSpacing = rAttribs.getBool( XML_compatLnSpc, false );
// bool bForceAA = rAttribs.getBool( XML_forceAA, false );
-// bool bFromWordArt = rAttribs.getBool( XML_fromWordArt, false );
+ bool bFromWordArt = rAttribs.getBool(XML_fromWordArt, false);
+ mrTextBodyProp.maPropertyMap.setProperty(PROP_FromWordArt, bFromWordArt);
// ST_TextHorzOverflowType
// sal_Int32 nHorzOverflow = rAttribs.getToken( XML_horzOverflow, XML_overflow );
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index e81c9026df9b..11d900e28794 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2584,7 +2584,9 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
}
}
- Sequence<drawing::EnhancedCustomShapeAdjustmentValue>aAdjustmentSeq;
+ Sequence<drawing::EnhancedCustomShapeAdjustmentValue> aAdjustmentSeq;
+ uno::Sequence<beans::PropertyValue> aTextPathSeq;
+ bool bScaleX(false);
if (GetProperty(rXPropSet, "CustomShapeGeometry"))
{
@@ -2610,10 +2612,23 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
}
else if (aProps[i].Name == "AdjustmentValues")
aProps[i].Value >>= aAdjustmentSeq;
+ else if (aProps[i].Name == "TextPath")
+ {
+ aProps[i].Value >>= aTextPathSeq;
+ for (int k = 0; k < aTextPathSeq.getLength(); k++)
+ {
+ if (aTextPathSeq[k].Name == "ScaleX")
+ aTextPathSeq[k].Value >>= bScaleX;
+ }
+ }
}
}
}
+ bool bFromWordArt = !bScaleX
+ && ( presetWarp == "textArchDown" || presetWarp == "textArchUp"
+ || presetWarp == "textButton" || presetWarp == "textCircle");
+
TextHorizontalAdjust eHorizontalAlignment( TextHorizontalAdjust_CENTER );
bool bHorizontalCenter = false;
if (GetProperty(rXPropSet, "TextHorizontalAdjust"))
@@ -2646,6 +2661,7 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
}
mpFS->startElementNS( (nXmlNamespace ? nXmlNamespace : XML_a), XML_bodyPr,
XML_wrap, pWrap,
+ XML_fromWordArt, bFromWordArt ? "1" : nullptr,
XML_lIns, (nLeft != DEFLRINS) ? OString::number(oox::drawingml::convertHmmToEmu(nLeft)).getStr() : nullptr,
XML_rIns, (nRight != DEFLRINS) ? OString::number(oox::drawingml::convertHmmToEmu(nRight)).getStr() : nullptr,
XML_tIns, (nTop != DEFTBINS) ? OString::number(oox::drawingml::convertHmmToEmu(nTop)).getStr() : nullptr,
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index 1b06aa741d94..13734d05fadf 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -198,6 +198,7 @@ FooterIsShared
ForceIntercept
FormulaConvention
FrameIsAutomaticHeight
+FromWordArt
Function
GapwidthSequence
GenerateVbaEvents
diff --git a/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx
new file mode 100644
index 000000000000..e8d1938a2308
--- /dev/null
+++ b/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 9305c0122343..22761ecd2d8c 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -24,6 +24,7 @@
#include <editeng/lrspitem.hxx>
#include <editeng/postitem.hxx>
#include <editeng/bulletitem.hxx>
+#include <editeng/unoprnms.hxx>
#include <oox/drawingml/drawingmltypes.hxx>
@@ -59,6 +60,7 @@
#include <com/sun/star/awt/Gradient.hpp>
#include <com/sun/star/awt/XBitmap.hpp>
#include <com/sun/star/awt/FontDescriptor.hpp>
+#include <com/sun/star/awt/Rectangle.hpp>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeParameterPair.hpp>
#include <com/sun/star/drawing/EnhancedCustomShapeAdjustmentValue.hpp>
@@ -185,6 +187,7 @@ public:
void testTdf118806();
void testTdf111789();
void testTdf100348_convert_Fontwork2TextWarp();
+ void testTdf1225573_FontWorkScaleX();
/// SmartArt animated elements
void testTdf104792();
void testTdf90627();
@@ -275,6 +278,7 @@ public:
CPPUNIT_TEST(testTdf118806);
CPPUNIT_TEST(testTdf111789);
CPPUNIT_TEST(testTdf100348_convert_Fontwork2TextWarp);
+ CPPUNIT_TEST(testTdf1225573_FontWorkScaleX);
CPPUNIT_TEST(testTdf104792);
CPPUNIT_TEST(testTdf90627);
CPPUNIT_TEST(testTdf104786);
@@ -2395,6 +2399,36 @@ void SdOOXMLExportTest2::testTdf100348_convert_Fontwork2TextWarp()
xDocShRef->DoClose();
}
+void SdOOXMLExportTest2::testTdf1225573_FontWorkScaleX()
+{
+ const OUString sPath("/sd/qa/unit/data/pptx/tdf125573_FontWorkScaleX.pptx");
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc(sPath), PPTX);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ // Error was, that attribute 'fromWordArt' was ignored
+ // ensure, resulting pptx has fromWordArt="1" on textArchDown shape
+ xmlDocPtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ const OString sPathStart("/p:sld/p:cSld/p:spTree/p:sp[1]/p:txBody/a:bodyPr");
+ assertXPath(pXmlDocContent, sPathStart + "[@fromWordArt='1']");
+
+ // Error was, that text in legacy shapes of category "Follow Path" was not scaled to the path.
+ uno::Reference<beans::XPropertySet> xShapeArchProps(getShapeFromPage(0, 0, xDocShRef));
+ awt::Rectangle aBoundRectArch;
+ xShapeArchProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectArch;
+ // difference should be zero, but allow some range for stroke thickness
+ CPPUNIT_ASSERT_LESS(static_cast<long>(50), labs(aBoundRectArch.Width - 13081));
+
+ // Error was, that text in shapes of category "Warp" was not scaled to the path.
+ uno::Reference<beans::XPropertySet> xShapeWaveProps(getShapeFromPage(0, 1, xDocShRef));
+ awt::Rectangle aBoundRectWave;
+ xShapeWaveProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRectWave;
+ // difference should be zero, but allow some range for stroke thickness
+ CPPUNIT_ASSERT_LESS(static_cast<long>(50), labs(aBoundRectWave.Width - 11514));
+
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest2);
CPPUNIT_PLUGIN_IMPLEMENT();