diff options
-rw-r--r-- | include/oox/drawingml/shape.hxx | 6 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 111 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/tdf104015.pptx | bin | 0 -> 19185 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 40 |
4 files changed, 130 insertions, 27 deletions
diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index 978b71b52cae..67f9a9b48afd 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -125,7 +125,7 @@ public: table::TablePropertiesPtr const & getTableProperties(); - EffectProperties& getEffectProperties() { return *mpEffectPropertiesPtr; } + EffectProperties& getEffectProperties() const { return *mpEffectPropertiesPtr; } void setChildPosition( css::awt::Point nPosition ){ maChPosition = nPosition; } void setChildSize( css::awt::Size aSize ){ maChSize = aSize; } @@ -258,6 +258,10 @@ protected: void putPropertiesToGrabBag( const css::uno::Sequence< css::beans::PropertyValue >& aProperties ); + FillProperties getActualFillProperties(const Theme* pTheme, const FillProperties* pParentShapeFillProps) const; + LineProperties getActualLineProperties(const Theme* pTheme) const; + EffectProperties getActualEffectProperties(const Theme* pTheme) const; + std::vector< ShapePtr > maChildren; // only used for group shapes css::awt::Size maChSize; // only used for group shapes css::awt::Point maChPosition; // only used for group shapes diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index f027cd159524..0ee6cef28eef 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -303,11 +303,11 @@ void Shape::applyShapeReference( const Shape& rReferencedShape, bool bUseText ) else mpTextBody.reset(); maShapeProperties = rReferencedShape.maShapeProperties; - mpShapeRefLinePropPtr = std::make_shared<LineProperties>( *rReferencedShape.mpLinePropertiesPtr.get() ); - mpShapeRefFillPropPtr = std::make_shared<FillProperties>( *rReferencedShape.mpFillPropertiesPtr.get() ); + mpShapeRefLinePropPtr = std::make_shared<LineProperties>( rReferencedShape.getActualLineProperties(nullptr) ); + mpShapeRefFillPropPtr = std::make_shared<FillProperties>( rReferencedShape.getActualFillProperties(nullptr, nullptr) ); mpCustomShapePropertiesPtr = std::make_shared<CustomShapeProperties>( *rReferencedShape.mpCustomShapePropertiesPtr.get() ); mpTablePropertiesPtr = table::TablePropertiesPtr( rReferencedShape.mpTablePropertiesPtr.get() ? new table::TableProperties( *rReferencedShape.mpTablePropertiesPtr.get() ) : nullptr ); - mpShapeRefEffectPropPtr = std::make_shared<EffectProperties>( *rReferencedShape.mpEffectPropertiesPtr.get() ); + mpShapeRefEffectPropPtr = std::make_shared<EffectProperties>( rReferencedShape.getActualEffectProperties(nullptr) ); mpMasterTextListStyle = std::make_shared<TextListStyle>( *rReferencedShape.mpMasterTextListStyle.get() ); maSize = rReferencedShape.maSize; maPosition = rReferencedShape.maPosition; @@ -654,25 +654,17 @@ Reference< XShape > const & Shape::createAndInsert( const GraphicHelper& rGraphicHelper = rFilterBase.getGraphicHelper(); - LineProperties aLineProperties; - aLineProperties.maLineFill.moFillType = XML_noFill; sal_Int32 nLinePhClr = -1; - FillProperties aFillProperties; - aFillProperties.moFillType = XML_noFill; sal_Int32 nFillPhClr = -1; - EffectProperties aEffectProperties; // TODO: use ph color when applying effect properties //sal_Int32 nEffectPhClr = -1; - // First apply reference shape's properties (shape on the master slide) - aFillProperties.assignUsed( *mpShapeRefFillPropPtr ); - aLineProperties.assignUsed( *mpShapeRefLinePropPtr ); - aEffectProperties.assignUsed( *mpShapeRefEffectPropPtr ); - if( pTheme ) { if( const ShapeStyleRef* pLineRef = getShapeStyleRef( XML_lnRef ) ) { + LineProperties aLineProperties; + aLineProperties.maLineFill.moFillType = XML_noFill; if( const LineProperties* pLineProps = pTheme->getLineStyle( pLineRef->mnThemedIdx ) ) aLineProperties.assignUsed( *pLineProps ); nLinePhClr = pLineRef->maPhClr.getColor( rGraphicHelper ); @@ -690,8 +682,6 @@ Reference< XShape > const & Shape::createAndInsert( } if( const ShapeStyleRef* pFillRef = getShapeStyleRef( XML_fillRef ) ) { - if( const FillProperties* pFillProps = pTheme->getFillStyle( pFillRef->mnThemedIdx ) ) - aFillProperties.assignUsed( *pFillProps ); nFillPhClr = pFillRef->maPhClr.getColor( rGraphicHelper ); OUString sColorScheme = pFillRef->maPhClr.getSchemeName(); @@ -708,8 +698,6 @@ Reference< XShape > const & Shape::createAndInsert( } if( const ShapeStyleRef* pEffectRef = getShapeStyleRef( XML_effectRef ) ) { - if( const EffectProperties* pEffectProps = pTheme->getEffectStyle( pEffectRef->mnThemedIdx ) ) - aEffectProperties.assignUsed( *pEffectProps ); // TODO: use ph color when applying effect properties // nEffectPhClr = pEffectRef->maPhClr.getColor( rGraphicHelper ); @@ -721,15 +709,6 @@ Reference< XShape > const & Shape::createAndInsert( putPropertyToGrabBag( "StyleEffectRef", Any( aProperties ) ); } } - - aLineProperties.assignUsed( getLineProperties() ); - - // group fill inherits from parent - if ( getFillProperties().moFillType.has() && getFillProperties().moFillType.get() == XML_grpFill ) - getFillProperties().assignUsed( rShapeOrParentShapeFillProps ); - aFillProperties.assignUsed( getFillProperties() ); - aEffectProperties.assignUsed ( getEffectProperties() ); - ShapePropertyMap aShapeProps( rFilterBase.getModelObjectHelper() ); // add properties from textbody to shape properties @@ -749,8 +728,12 @@ Reference< XShape > const & Shape::createAndInsert( mpGraphicPropertiesPtr->pushToPropMap( aShapeProps, rGraphicHelper ); if ( mpTablePropertiesPtr.get() && aServiceName == "com.sun.star.drawing.TableShape" ) mpTablePropertiesPtr->pushToPropSet( rFilterBase, xSet, mpMasterTextListStyle ); + + FillProperties aFillProperties = getActualFillProperties(pTheme, &rShapeOrParentShapeFillProps); aFillProperties.pushToPropMap( aShapeProps, rGraphicHelper, mnRotation, nFillPhClr, mbFlipH, mbFlipV ); + LineProperties aLineProperties = getActualLineProperties(pTheme); aLineProperties.pushToPropMap( aShapeProps, rGraphicHelper, nLinePhClr ); + EffectProperties aEffectProperties = getActualEffectProperties(pTheme); // TODO: use ph color when applying effect properties aEffectProperties.pushToPropMap( aShapeProps, rGraphicHelper ); @@ -1461,6 +1444,82 @@ void Shape::putPropertiesToGrabBag( const Sequence< PropertyValue >& aProperties } } +FillProperties Shape::getActualFillProperties(const Theme* pTheme, const FillProperties* pParentShapeFillProps) const +{ + FillProperties aFillProperties; + aFillProperties.moFillType = XML_noFill; + + // Reference shape properties + aFillProperties.assignUsed( *mpShapeRefFillPropPtr ); + + // Theme + if( pTheme != nullptr ) + { + if( const ShapeStyleRef* pFillRef = getShapeStyleRef( XML_fillRef ) ) + { + if( const FillProperties* pFillProps = pTheme->getFillStyle( pFillRef->mnThemedIdx ) ) + aFillProperties.assignUsed( *pFillProps ); + } + } + + // Parent shape's properties + if ( pParentShapeFillProps != nullptr) + if( getFillProperties().moFillType.has() && getFillProperties().moFillType.get() == XML_grpFill ) + aFillProperties.assignUsed( *pParentShapeFillProps ); + + // Properties specified directly for this shape + aFillProperties.assignUsed( getFillProperties() ); + + return aFillProperties; +} + +LineProperties Shape::getActualLineProperties(const Theme* pTheme) const +{ + LineProperties aLineProperties; + aLineProperties.maLineFill.moFillType = XML_noFill; + + // Reference shape properties + aLineProperties.assignUsed( *mpShapeRefLinePropPtr ); + + // Theme + if( pTheme != nullptr ) + { + if( const ShapeStyleRef* pLineRef = getShapeStyleRef( XML_lnRef ) ) + { + if( const LineProperties* pLineProps = pTheme->getLineStyle( pLineRef->mnThemedIdx ) ) + aLineProperties.assignUsed( *pLineProps ); + } + } + + // Properties specified directly for this shape + aLineProperties.assignUsed( getLineProperties() ); + + return aLineProperties; +} + +EffectProperties Shape::getActualEffectProperties(const Theme* pTheme) const +{ + EffectProperties aEffectProperties; + + // Reference shape properties + aEffectProperties.assignUsed( *mpShapeRefEffectPropPtr ); + + // Theme + if( pTheme != nullptr ) + { + if( const ShapeStyleRef* pEffectRef = getShapeStyleRef( XML_effectRef ) ) + { + if( const EffectProperties* pEffectProps = pTheme->getEffectStyle( pEffectRef->mnThemedIdx ) ) + aEffectProperties.assignUsed( *pEffectProps ); + } + } + + // Properties specified directly for this shape + aEffectProperties.assignUsed ( getEffectProperties() ); + + return aEffectProperties; +} + uno::Sequence< uno::Sequence< uno::Any > > Shape::resolveRelationshipsOfTypeFromOfficeDoc(core::XmlFilterBase& rFilter, const OUString& sFragment, const OUString& sType ) { uno::Sequence< uno::Sequence< uno::Any > > xRelListTemp; diff --git a/sd/qa/unit/data/pptx/tdf104015.pptx b/sd/qa/unit/data/pptx/tdf104015.pptx Binary files differnew file mode 100644 index 000000000000..f3675f9e8805 --- /dev/null +++ b/sd/qa/unit/data/pptx/tdf104015.pptx diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index f9f40cc198e5..6c14bd5da3dc 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -129,6 +129,7 @@ public: void testTdf103473(); void testTdf103792(); void testTdf103876(); + void testTdf104015(); CPPUNIT_TEST_SUITE(SdImportTest); @@ -183,6 +184,7 @@ public: CPPUNIT_TEST(testTdf103473); CPPUNIT_TEST(testTdf103792); CPPUNIT_TEST(testTdf103876); + CPPUNIT_TEST(testTdf104015); CPPUNIT_TEST_SUITE_END(); }; @@ -1545,6 +1547,44 @@ void SdImportTest::testTdf103876() xDocShRef->DoClose(); } +void SdImportTest::testTdf104015() +{ + // Shape fill, line and effect properties were not inherited from master slide shape + sd::DrawDocShellRef xDocShRef = loadURL(m_directories.getURLFromSrc("sd/qa/unit/data/pptx/tdf104015.pptx"), PPTX); + + const SdrPage *pPage = GetPage( 1, xDocShRef ); + CPPUNIT_ASSERT_MESSAGE("No page found", pPage != nullptr); + SdrObject *const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT_MESSAGE("Wrong object", pObj != nullptr); + // Should have a red fill color + { + const XFillStyleItem& rStyleItem = dynamic_cast<const XFillStyleItem&>( + pObj->GetMergedItem(XATTR_FILLSTYLE)); + CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, rStyleItem.GetValue()); + const XFillColorItem& rColorItem = dynamic_cast<const XFillColorItem&>( + pObj->GetMergedItem(XATTR_FILLCOLOR)); + CPPUNIT_ASSERT_EQUAL(ColorData(0xFF0000), rColorItem.GetColorValue().GetColor()); + } + // Should have a blue line + { + const XLineStyleItem& rStyleItem = dynamic_cast<const XLineStyleItem&>( + pObj->GetMergedItem(XATTR_LINESTYLE)); + CPPUNIT_ASSERT_EQUAL(drawing::LineStyle_SOLID, rStyleItem.GetValue()); + + const XLineColorItem& rColorItem = dynamic_cast<const XLineColorItem&>( + pObj->GetMergedItem(XATTR_LINECOLOR)); + CPPUNIT_ASSERT_EQUAL(ColorData(0x0000FF), rColorItem.GetColorValue().GetColor()); + } + // Should have some shadow + { + const SdrOnOffItem& rShadowItem = dynamic_cast<const SdrOnOffItem&>( + pObj->GetMergedItem(SDRATTR_SHADOW)); + CPPUNIT_ASSERT(rShadowItem.GetValue()); + } + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); |