diff options
-rw-r--r-- | include/oox/drawingml/shape.hxx | 1 | ||||
-rw-r--r-- | oox/source/drawingml/shape.cxx | 7 | ||||
-rw-r--r-- | sd/qa/unit/data/pptx/bnc904423.pptx | bin | 0 -> 25119 bytes | |||
-rw-r--r-- | sd/qa/unit/import-tests.cxx | 55 |
4 files changed, 62 insertions, 1 deletions
diff --git a/include/oox/drawingml/shape.hxx b/include/oox/drawingml/shape.hxx index c0303a399643..81ae8abece8c 100644 --- a/include/oox/drawingml/shape.hxx +++ b/include/oox/drawingml/shape.hxx @@ -247,6 +247,7 @@ protected: TextBodyPtr mpTextBody; LinePropertiesPtr mpLinePropertiesPtr; FillPropertiesPtr mpFillPropertiesPtr; + FillPropertiesPtr mpShapeRefFillPropPtr; GraphicPropertiesPtr mpGraphicPropertiesPtr; CustomShapePropertiesPtr mpCustomShapePropertiesPtr; table::TablePropertiesPtr mpTablePropertiesPtr; diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx index 2d489028c50c..819c5607963e 100644 --- a/oox/source/drawingml/shape.cxx +++ b/oox/source/drawingml/shape.cxx @@ -96,6 +96,7 @@ Shape::Shape( const sal_Char* pServiceName, bool bDefaultHeight ) : mbIsChild( false ) , mpLinePropertiesPtr( new LineProperties ) , mpFillPropertiesPtr( new FillProperties ) +, mpShapeRefFillPropPtr( new FillProperties ) , mpGraphicPropertiesPtr( new GraphicProperties ) , mpCustomShapePropertiesPtr( new CustomShapeProperties ) , mp3DPropertiesPtr( new Shape3DProperties ) @@ -125,6 +126,7 @@ Shape::Shape( const ShapePtr& pSourceShape ) , mpTextBody(pSourceShape->mpTextBody) , mpLinePropertiesPtr( pSourceShape->mpLinePropertiesPtr ) , mpFillPropertiesPtr( pSourceShape->mpFillPropertiesPtr ) +, mpShapeRefFillPropPtr( pSourceShape->mpShapeRefFillPropPtr ) , mpGraphicPropertiesPtr( pSourceShape->mpGraphicPropertiesPtr ) , mpCustomShapePropertiesPtr( pSourceShape->mpCustomShapePropertiesPtr ) , mpTablePropertiesPtr( pSourceShape->mpTablePropertiesPtr ) @@ -292,7 +294,7 @@ void Shape::applyShapeReference( const Shape& rReferencedShape, bool bUseText ) mpTextBody.reset(); maShapeProperties = rReferencedShape.maShapeProperties; mpLinePropertiesPtr = LinePropertiesPtr( new LineProperties( *rReferencedShape.mpLinePropertiesPtr.get() ) ); - mpFillPropertiesPtr = FillPropertiesPtr( new FillProperties( *rReferencedShape.mpFillPropertiesPtr.get() ) ); + mpShapeRefFillPropPtr = FillPropertiesPtr( new FillProperties( *rReferencedShape.mpFillPropertiesPtr.get() ) ); mpCustomShapePropertiesPtr = CustomShapePropertiesPtr( new CustomShapeProperties( *rReferencedShape.mpCustomShapePropertiesPtr.get() ) ); mpTablePropertiesPtr = table::TablePropertiesPtr( rReferencedShape.mpTablePropertiesPtr.get() ? new table::TableProperties( *rReferencedShape.mpTablePropertiesPtr.get() ) : NULL ); mpEffectPropertiesPtr = EffectPropertiesPtr( new EffectProperties( *rReferencedShape.mpEffectPropertiesPtr.get() ) ); @@ -575,6 +577,9 @@ Reference< XShape > Shape::createAndInsert( // 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 ); + if( pTheme ) { if( const ShapeStyleRef* pLineRef = getShapeStyleRef( XML_lnRef ) ) diff --git a/sd/qa/unit/data/pptx/bnc904423.pptx b/sd/qa/unit/data/pptx/bnc904423.pptx Binary files differnew file mode 100644 index 000000000000..618ad1b473e1 --- /dev/null +++ b/sd/qa/unit/data/pptx/bnc904423.pptx diff --git a/sd/qa/unit/import-tests.cxx b/sd/qa/unit/import-tests.cxx index bf988624c430..70063c4405d8 100644 --- a/sd/qa/unit/import-tests.cxx +++ b/sd/qa/unit/import-tests.cxx @@ -84,6 +84,7 @@ public: void testBnc584721_2(); void testBnc584721_3(); void testBnc584721_4(); + void testBnc904423(); CPPUNIT_TEST_SUITE(SdImportTest); CPPUNIT_TEST(testDocumentLayout); @@ -111,6 +112,7 @@ public: CPPUNIT_TEST(testBnc584721_2); CPPUNIT_TEST(testBnc584721_3); CPPUNIT_TEST(testBnc584721_4); + CPPUNIT_TEST(testBnc904423); CPPUNIT_TEST_SUITE_END(); }; @@ -865,6 +867,59 @@ void SdImportTest::testBnc584721_4() xDocShRef->DoClose(); } +void SdImportTest::testBnc904423() +{ + // Here the problem was that different fill properties were applied in wrong order on the shape + // Right order: 1) master slide fill style, 2) theme, 3) direct formatting + ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("sd/qa/unit/data/pptx/bnc904423.pptx"), PPTX); + + SdDrawDocument *pDoc = xDocShRef->GetDoc(); + CPPUNIT_ASSERT_MESSAGE( "no document", pDoc != NULL ); + const SdrPage *pPage = pDoc->GetPage(1); + CPPUNIT_ASSERT_MESSAGE( "no page", pPage != NULL ); + + // First shape's background color is defined on master slide + { + SdrObject *const pObj = pPage->GetObj(0); + CPPUNIT_ASSERT(pObj); + + 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(0x00CC99), rColorItem.GetColorValue().GetColor()); + } + + // Second shape's background color is defined by theme + { + SdrObject *const pObj = pPage->GetObj(1); + CPPUNIT_ASSERT(pObj); + + 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(0x3333CC), rColorItem.GetColorValue().GetColor()); + } + + // Third shape's background color is defined by direct formatting + { + SdrObject *const pObj = pPage->GetObj(2); + CPPUNIT_ASSERT(pObj); + + 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()); + } + + xDocShRef->DoClose(); +} + CPPUNIT_TEST_SUITE_REGISTRATION(SdImportTest); CPPUNIT_PLUGIN_IMPLEMENT(); |