diff options
author | Tamás Zolnai <tamas.zolnai@collabora.com> | 2017-09-22 01:17:14 +0200 |
---|---|---|
committer | Tamás Zolnai <tamas.zolnai@collabora.com> | 2017-09-22 02:29:12 +0200 |
commit | 31919b8909fa7b34412dd52c3d4dff17bc5b6fab (patch) | |
tree | e73aaec7ee71950f3ed1de1587121dc459b1a637 /oox | |
parent | 46fa042b94a0364c09482e8a09f8874119db231c (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>
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/export/drawingml.cxx | 89 | ||||
-rw-r--r-- | oox/source/export/shapes.cxx | 2 |
2 files changed, 43 insertions, 48 deletions
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 ); } |