summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTamás Zolnai <tamas.zolnai@collabora.com>2017-09-22 01:17:14 +0200
committerTamás Zolnai <tamas.zolnai@collabora.com>2017-09-22 02:29:12 +0200
commit31919b8909fa7b34412dd52c3d4dff17bc5b6fab (patch)
treee73aaec7ee71950f3ed1de1587121dc459b1a637
parent46fa042b94a0364c09482e8a09f8874119db231c (diff)
tdf#112552: Shape's gray background is lost after saving to PPTX
Change-Id: I30f371ad301eede82ddcece4d91ffcd32e164115 Reviewed-on: https://gerrit.libreoffice.org/42598 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Tamás Zolnai <tamas.zolnai@collabora.com>
-rw-r--r--include/oox/export/drawingml.hxx7
-rw-r--r--include/svx/EnhancedCustomShape2d.hxx4
-rw-r--r--oox/source/export/drawingml.cxx89
-rw-r--r--oox/source/export/shapes.cxx2
-rwxr-xr-xsd/qa/unit/data/odp/tdf112552.odpbin0 -> 11331 bytes
-rw-r--r--sd/qa/unit/export-tests-ooxml2.cxx17
6 files changed, 68 insertions, 51 deletions
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index c33bb40f4306..ded3f4e488aa 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -45,6 +45,7 @@
#endif
class Graphic;
+class SdrObjCustomShape;
namespace com { namespace sun { namespace star {
namespace awt {
@@ -58,6 +59,8 @@ namespace beans {
}
namespace drawing {
class XShape;
+ struct EnhancedCustomShapeParameterPair;
+ struct EnhancedCustomShapeParameter;
}
namespace style {
struct LineSpacing;
@@ -212,7 +215,9 @@ public:
void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList );
void WritePresetShape( const char* pShape );
void WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool bPredefinedHandlesUsed, sal_Int32 nAdjustmentsWhichNeedsToBeConverted, const css::beans::PropertyValue& rProp );
- bool WriteCustomGeometry( const css::uno::Reference<css::drawing::XShape>& rXShape );
+ bool WriteCustomGeometry( const css::uno::Reference<css::drawing::XShape>& rXShape, const SdrObjCustomShape* pShape );
+ void WriteCustomGeometryPoint(const css::drawing::EnhancedCustomShapeParameterPair& rParamPair, const SdrObjCustomShape* pShape);
+ static sal_Int32 GetCustomGeometryPointValue(const css::drawing::EnhancedCustomShapeParameter& rParam, const SdrObjCustomShape* pShape);
void WritePolyPolygon( const tools::PolyPolygon& rPolyPolygon );
void WriteFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
void WriteShapeStyle( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
diff --git a/include/svx/EnhancedCustomShape2d.hxx b/include/svx/EnhancedCustomShape2d.hxx
index 86ec0f082628..df6603a46183 100644
--- a/include/svx/EnhancedCustomShape2d.hxx
+++ b/include/svx/EnhancedCustomShape2d.hxx
@@ -125,8 +125,6 @@ class SVX_DLLPUBLIC EnhancedCustomShape2d : public SfxItemSet
SAL_DLLPRIVATE Color GetColorData( const Color& rFillColor, sal_uInt32 nIndex, double dBrightness ) const;
SAL_DLLPRIVATE void AdaptObjColor(SdrPathObj& rObj, const SfxItemSet& rCustomShapeSet,
sal_uInt32& nColorIndex, sal_uInt32 nColorCount);
- SAL_DLLPRIVATE void GetParameter( double& rParameterReturnValue, const css::drawing::EnhancedCustomShapeParameter&,
- const bool bReplaceGeoWidth, const bool bReplaceGeoHeight ) const;
SAL_DLLPRIVATE Point GetPoint( const css::drawing::EnhancedCustomShapeParameterPair&,
const bool bScale = true, const bool bReplaceGeoSize = false ) const;
@@ -188,6 +186,8 @@ class SVX_DLLPUBLIC EnhancedCustomShape2d : public SfxItemSet
SAL_DLLPRIVATE double GetEnumFunc( const EnhancedCustomShape::ExpressionFunct eVal ) const;
+ void GetParameter( double& rParameterReturnValue, const css::drawing::EnhancedCustomShapeParameter&,
+ const bool bReplaceGeoWidth, const bool bReplaceGeoHeight ) const;
SAL_DLLPRIVATE double GetAdjustValueAsDouble( const sal_Int32 nIndex ) const;
SAL_DLLPRIVATE double GetEquationValueAsDouble( const sal_Int32 nIndex ) const;
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 1ce02a7e2b53..198ac917bb92 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -95,6 +95,7 @@
#include <svx/svdomedia.hxx>
#include <svx/unoapi.hxx>
#include <svx/unoshape.hxx>
+#include <svx/EnhancedCustomShape2d.hxx>
#include <android/compatibility.hxx>
using namespace ::css;
@@ -2498,7 +2499,7 @@ void DrawingML::WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool b
mpFS->endElementNS( XML_a, XML_prstGeom );
}
-bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
+bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape, const SdrObjCustomShape* pShape )
{
uno::Reference< beans::XPropertySet > aXPropSet;
uno::Any aAny( rXShape->queryInterface(cppu::UnoType<beans::XPropertySet>::get()));
@@ -2598,15 +2599,16 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
for ( int j = 0; j < aPairs.getLength(); ++j )
{
- sal_Int32 nCandidate(0);
- if ((aPairs[j].First.Value >>= nCandidate) && nCandidate < nXMin)
- nXMin = nCandidate;
- if ((aPairs[j].Second.Value >>= nCandidate) && nCandidate < nYMin)
- nYMin = nCandidate;
- if ((aPairs[j].First.Value >>= nCandidate) && nCandidate > nXMax)
- nXMax = nCandidate;
- if ((aPairs[j].Second.Value >>= nCandidate) && nCandidate > nYMax)
- nYMax = nCandidate;
+ sal_Int32 nX = GetCustomGeometryPointValue(aPairs[j].First, pShape);
+ sal_Int32 nY = GetCustomGeometryPointValue(aPairs[j].Second, pShape);
+ if (nX < nXMin)
+ nXMin = nX;
+ if (nY < nYMin)
+ nYMin = nY;
+ if (nX > nXMax)
+ nXMax = nX;
+ if (nY > nYMax)
+ nYMax = nY;
}
mpFS->startElementNS( XML_a, XML_path,
XML_w, I64S( nXMax - nXMin ),
@@ -2629,16 +2631,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
case drawing::EnhancedCustomShapeSegmentCommand::MOVETO :
{
mpFS->startElementNS( XML_a, XML_moveTo, FSEND );
-
- sal_Int32 nX(0), nY(0);
- aPairs[nPairIndex].First.Value >>= nX;
- aPairs[nPairIndex].Second.Value >>= nY;
-
- mpFS->singleElementNS( XML_a, XML_pt,
- XML_x, I64S(nX),
- XML_y, I64S(nY),
- FSEND );
-
+ WriteCustomGeometryPoint(aPairs[nPairIndex], pShape);
mpFS->endElementNS( XML_a, XML_moveTo );
nPairIndex++;
break;
@@ -2646,15 +2639,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
case drawing::EnhancedCustomShapeSegmentCommand::LINETO :
{
mpFS->startElementNS( XML_a, XML_lnTo, FSEND );
-
- sal_Int32 nX(0), nY(0);
- aPairs[nPairIndex].First.Value >>= nX;
- aPairs[nPairIndex].Second.Value >>= nY;
-
- mpFS->singleElementNS( XML_a, XML_pt,
- XML_x, I64S(nX),
- XML_y, I64S(nY),
- FSEND );
+ WriteCustomGeometryPoint(aPairs[nPairIndex], pShape);
mpFS->endElementNS( XML_a, XML_lnTo );
nPairIndex++;
break;
@@ -2664,15 +2649,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
mpFS->startElementNS( XML_a, XML_cubicBezTo, FSEND );
for( sal_uInt8 l = 0; l <= 2; ++l )
{
- sal_Int32 nX(0), nY(0);
- aPairs[nPairIndex+l].First.Value >>= nX;
- aPairs[nPairIndex+l].Second.Value >>= nY;
-
- mpFS->singleElementNS( XML_a, XML_pt,
- XML_x, I64S( nX ),
- XML_y, I64S( nY ),
- FSEND );
-
+ WriteCustomGeometryPoint(aPairs[nPairIndex+l], pShape);
}
mpFS->endElementNS( XML_a, XML_cubicBezTo );
nPairIndex += 3;
@@ -2703,15 +2680,7 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
mpFS->startElementNS( XML_a, XML_quadBezTo, FSEND );
for( sal_uInt8 l = 0; l < 2; ++l )
{
- sal_Int32 nX(0), nY(0);
- aPairs[nPairIndex+l].First.Value >>= nX;
- aPairs[nPairIndex+l].Second.Value >>= nY;
-
- mpFS->singleElementNS( XML_a, XML_pt,
- XML_x, I64S( nX ),
- XML_y, I64S( nY ),
- FSEND );
-
+ WriteCustomGeometryPoint(aPairs[nPairIndex+l], pShape);
}
mpFS->endElementNS( XML_a, XML_quadBezTo );
nPairIndex += 2;
@@ -2738,6 +2707,32 @@ bool DrawingML::WriteCustomGeometry( const Reference< XShape >& rXShape )
return false;
}
+void DrawingML::WriteCustomGeometryPoint(const drawing::EnhancedCustomShapeParameterPair& rParamPair, const SdrObjCustomShape* pShape)
+{
+ sal_Int32 nX = GetCustomGeometryPointValue(rParamPair.First, pShape);
+ sal_Int32 nY = GetCustomGeometryPointValue(rParamPair.Second, pShape);
+
+ mpFS->singleElementNS( XML_a, XML_pt,
+ XML_x, OString::number(nX).getStr(),
+ XML_y, OString::number(nY).getStr(),
+ FSEND );
+}
+
+sal_Int32 DrawingML::GetCustomGeometryPointValue(const css::drawing::EnhancedCustomShapeParameter& rParam, const SdrObjCustomShape* pShape)
+{
+ sal_Int32 nValue = 0;
+ if(pShape)
+ {
+ const EnhancedCustomShape2d aCustoShape2d (const_cast<SdrObjCustomShape*>(pShape));
+ double fValue = 0.0;
+ aCustoShape2d.GetParameter(fValue, rParam, false, false);
+ nValue = std::lround(fValue);
+ }
+ else
+ rParam.Value >>= nValue;
+ return nValue;
+}
+
void DrawingML::WritePolyPolygon( const tools::PolyPolygon& rPolyPolygon )
{
// In case of Writer, the parent element is <wps:spPr>, and there the
diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 955f15894dfa..b3d42048ec6d 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -864,7 +864,7 @@ ShapeExport& ShapeExport::WriteCustomShape( const Reference< XShape >& xShape )
else if (bCustGeom)
{
WriteShapeTransformation( xShape, XML_a, bFlipH, bFlipV );
- bool bSuccess = WriteCustomGeometry( xShape );
+ bool bSuccess = WriteCustomGeometry( xShape, pShape );
if (!bSuccess)
WritePresetShape( sPresetShape );
}
diff --git a/sd/qa/unit/data/odp/tdf112552.odp b/sd/qa/unit/data/odp/tdf112552.odp
new file mode 100755
index 000000000000..df4afb76b14a
--- /dev/null
+++ b/sd/qa/unit/data/odp/tdf112552.odp
Binary files differ
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index 72d0cd04306c..512a4dc32b73 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -109,6 +109,7 @@ public:
void testTdf112280();
void testTdf112088();
void testTdf112333();
+ void testTdf112552();
CPPUNIT_TEST_SUITE(SdOOXMLExportTest2);
@@ -145,6 +146,7 @@ public:
CPPUNIT_TEST(testTdf112280);
CPPUNIT_TEST(testTdf112088);
CPPUNIT_TEST(testTdf112333);
+ CPPUNIT_TEST(testTdf112552);
CPPUNIT_TEST_SUITE_END();
@@ -1098,6 +1100,21 @@ void SdOOXMLExportTest2::testTdf112333()
CPPUNIT_ASSERT_EQUAL(OUString("fillcolor"), sAttributeName);
}
+void SdOOXMLExportTest2::testTdf112552()
+{
+ // Background fill was not displayed, but it was because of the wrong geometry
+ ::sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("/sd/qa/unit/data/odp/tdf112552.odp"), ODP);
+ utl::TempFile tempFile;
+ xDocShRef = saveAndReload(xDocShRef.get(), PPTX, &tempFile);
+
+ xmlDocPtr pXmlDocContent = parseExport(tempFile, "ppt/slides/slide1.xml");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", "w", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path", "h", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt", "x", "21600");
+ assertXPath(pXmlDocContent, "/p:sld/p:cSld/p:spTree/p:sp/p:spPr/a:custGeom/a:pathLst/a:path/a:lnTo[1]/a:pt", "y", "0");
+ xDocShRef->DoClose();
+}
+
CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest2);
CPPUNIT_PLUGIN_IMPLEMENT();