diff options
-rw-r--r-- | svx/qa/unit/data/tdf150020-shadow-alignment.pptx | bin | 51529 -> 45485 bytes | |||
-rw-r--r-- | svx/qa/unit/sdr.cxx | 81 | ||||
-rw-r--r-- | svx/source/table/viewcontactoftableobj.cxx | 54 |
3 files changed, 81 insertions, 54 deletions
diff --git a/svx/qa/unit/data/tdf150020-shadow-alignment.pptx b/svx/qa/unit/data/tdf150020-shadow-alignment.pptx Binary files differindex caba1a122da5..0002667bd4d9 100644 --- a/svx/qa/unit/data/tdf150020-shadow-alignment.pptx +++ b/svx/qa/unit/data/tdf150020-shadow-alignment.pptx diff --git a/svx/qa/unit/sdr.cxx b/svx/qa/unit/sdr.cxx index b98df8b58041..4d6c4226d11b 100644 --- a/svx/qa/unit/sdr.cxx +++ b/svx/qa/unit/sdr.cxx @@ -85,46 +85,67 @@ CPPUNIT_TEST_FIXTURE(SdrTest, testShadowAlignment) loadFromURL(u"tdf150020-shadow-alignment.pptx"); uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(mxComponent, uno::UNO_QUERY); - uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), - uno::UNO_QUERY); - drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence - = renderPageToPrimitives(xDrawPage); + { + // Page 1 contains 9 shapes with each shadow alignment + uno::Reference<drawing::XDrawPage> xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(0), uno::UNO_QUERY); + drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence + = renderPageToPrimitives(xDrawPage); - // Examine the created primitives. - drawinglayer::Primitive2dXmlDump aDumper; - xmlDocUniquePtr pDocument = aDumper.dumpAndParse(xPrimitiveSequence); + // Examine the created primitives. + drawinglayer::Primitive2dXmlDump aDumper; + xmlDocUniquePtr pDocument = aDumper.dumpAndParse(xPrimitiveSequence); - // Without the accompanying fix in place, this test would have failed with: - // - Expected: -567 - // - Actual : 162 - // - In <>, attribute 'xy13' of '(//shadow/transform)[1]' incorrect value. - // i.e. shadow alignment was ignored while scaling the shadow. - assertXPath(pDocument, "(//shadow/transform)[1]", "xy13", "-567"); - assertXPath(pDocument, "(//shadow/transform)[1]", "xy23", "162"); + // Without the accompanying fix in place, this test would have failed with: + // - Expected: -567 + // - Actual : 162 + // - In <>, attribute 'xy13' of '(//shadow/transform)[1]' incorrect value. + // i.e. shadow alignment was ignored while scaling the shadow. + assertXPath(pDocument, "(//shadow/transform)[1]", "xy13", "-567"); + assertXPath(pDocument, "(//shadow/transform)[1]", "xy23", "162"); - assertXPath(pDocument, "(//shadow/transform)[2]", "xy13", "-1794"); - assertXPath(pDocument, "(//shadow/transform)[2]", "xy23", "162"); + assertXPath(pDocument, "(//shadow/transform)[2]", "xy13", "-1794"); + assertXPath(pDocument, "(//shadow/transform)[2]", "xy23", "162"); - assertXPath(pDocument, "(//shadow/transform)[3]", "xy13", "-3021"); - assertXPath(pDocument, "(//shadow/transform)[3]", "xy23", "161"); + assertXPath(pDocument, "(//shadow/transform)[3]", "xy13", "-3021"); + assertXPath(pDocument, "(//shadow/transform)[3]", "xy23", "161"); - assertXPath(pDocument, "(//shadow/transform)[4]", "xy13", "-567"); - assertXPath(pDocument, "(//shadow/transform)[4]", "xy23", "-749"); + assertXPath(pDocument, "(//shadow/transform)[4]", "xy13", "-567"); + assertXPath(pDocument, "(//shadow/transform)[4]", "xy23", "-749"); - assertXPath(pDocument, "(//shadow/transform)[5]", "xy13", "-3021"); - assertXPath(pDocument, "(//shadow/transform)[5]", "xy23", "-750"); + assertXPath(pDocument, "(//shadow/transform)[5]", "xy13", "-3021"); + assertXPath(pDocument, "(//shadow/transform)[5]", "xy23", "-750"); - assertXPath(pDocument, "(//shadow/transform)[6]", "xy13", "-566"); - assertXPath(pDocument, "(//shadow/transform)[6]", "xy23", "-1691"); + assertXPath(pDocument, "(//shadow/transform)[6]", "xy13", "-566"); + assertXPath(pDocument, "(//shadow/transform)[6]", "xy23", "-1691"); - assertXPath(pDocument, "(//shadow/transform)[7]", "xy13", "-1794"); - assertXPath(pDocument, "(//shadow/transform)[7]", "xy23", "-1693"); + assertXPath(pDocument, "(//shadow/transform)[7]", "xy13", "-1794"); + assertXPath(pDocument, "(//shadow/transform)[7]", "xy23", "-1693"); - assertXPath(pDocument, "(//shadow/transform)[8]", "xy13", "-3022"); - assertXPath(pDocument, "(//shadow/transform)[8]", "xy23", "-1691"); + assertXPath(pDocument, "(//shadow/transform)[8]", "xy13", "-3022"); + assertXPath(pDocument, "(//shadow/transform)[8]", "xy23", "-1691"); - assertXPath(pDocument, "(//shadow/transform)[9]", "xy13", "-1794"); - assertXPath(pDocument, "(//shadow/transform)[9]", "xy23", "-750"); + assertXPath(pDocument, "(//shadow/transform)[9]", "xy13", "-1794"); + assertXPath(pDocument, "(//shadow/transform)[9]", "xy23", "-750"); + } + { + // Page 2 contains a table with shadow alignment center + uno::Reference<drawing::XDrawPage> xDrawPage( + xDrawPagesSupplier->getDrawPages()->getByIndex(1), uno::UNO_QUERY); + drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence + = renderPageToPrimitives(xDrawPage); + + // Examine the created primitives. + drawinglayer::Primitive2dXmlDump aDumper; + xmlDocUniquePtr pDocument = aDumper.dumpAndParse(xPrimitiveSequence); + + // Without the accompanying fix in place, this test would have failed with: + // - Expected: -5196 + // - Actual : 0 + // - In<>, attribute 'xy13' of '//shadow/transform' incorrect value. + assertXPath(pDocument, "//shadow/transform", "xy13", "-5196"); + assertXPath(pDocument, "//shadow/transform", "xy23", "-2290"); + } } CPPUNIT_TEST_FIXTURE(SdrTest, testZeroWidthTextWrap) diff --git a/svx/source/table/viewcontactoftableobj.cxx b/svx/source/table/viewcontactoftableobj.cxx index 3f17c5ccae21..5b9418ab06bf 100644 --- a/svx/source/table/viewcontactoftableobj.cxx +++ b/svx/source/table/viewcontactoftableobj.cxx @@ -448,33 +448,39 @@ namespace sdr::contact aRetvalForShadow.append(new drawinglayer::primitive2d::TransformPrimitive2D( aTransform, std::move(aCellBorderPrimitives))); } - } - - if(!aRetval.empty()) - { - // check and create evtl. shadow for created content - const SfxItemSet& rObjectItemSet = rTableObj.GetMergedItemSet(); - const drawinglayer::attribute::SdrShadowAttribute aNewShadowAttribute( - drawinglayer::primitive2d::createNewSdrShadowAttribute(rObjectItemSet)); - if(!aNewShadowAttribute.isDefault()) + if(!aRetval.empty()) { - bool bDirectShadow - = rObjectItemSet.Get(SDRATTR_SHADOW, /*bSrchInParent=*/false) - .GetValue(); - if (bDirectShadow) - { - // Shadow as direct formatting: no shadow for text, to be compatible - // with PowerPoint. - basegfx::B2DHomMatrix aMatrix; - aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive( - std::move(aRetval), aNewShadowAttribute, aMatrix, &aRetvalForShadow); - } - else + // check and create evtl. shadow for created content + const SfxItemSet& rObjectItemSet = rTableObj.GetMergedItemSet(); + const drawinglayer::attribute::SdrShadowAttribute aNewShadowAttribute( + drawinglayer::primitive2d::createNewSdrShadowAttribute(rObjectItemSet)); + + if(!aNewShadowAttribute.isDefault()) { - // Shadow as style: shadow for text, to be backwards-compatible. - aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive( - std::move(aRetval), aNewShadowAttribute); + // pass in table's transform and scale matrix, to + // correctly scale and align shadows + const basegfx::B2DHomMatrix aTransformScaleMatrix + = basegfx::utils::createScaleTranslateB2DHomMatrix( + aObjectRange.getRange(), aObjectRange.getMinimum()); + + bool bDirectShadow + = rObjectItemSet.Get(SDRATTR_SHADOW, /*bSrchInParent=*/false) + .GetValue(); + if (bDirectShadow) + { + // Shadow as direct formatting: no shadow for text, to be compatible + // with PowerPoint. + aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive( + std::move(aRetval), aNewShadowAttribute, aTransformScaleMatrix, + &aRetvalForShadow); + } + else + { + // Shadow as style: shadow for text, to be backwards-compatible. + aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive( + std::move(aRetval), aNewShadowAttribute, aTransformScaleMatrix); + } } } } |