tdf#129961 svx: add rendering for table shadow as direct format
There was already shadow support in ViewContactOfTableObj::createViewIndependentPrimitive2DSequence(), but the UNO API and UI could only set the shadow properties on a shape style, so shadow-as-direct-format is new. One difference between the PowerPoint shadow and our shadow is that we draw shadow for table text as well, while PowerPoint only does it for the borders / cell fill style. This means we're either backwards-compatible or compatible with PowerPoint. Solve this problem by leaving the style case unchanged, but render direct formatting like PowerPoint. Change-Id: I2bc64fea8062f9d8162b95d1eaccb49c3466b5c5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107073 Reviewed-by: Miklos Vajna <vmiklos@collabora.com> Tested-by: Jenkins
This commit is contained in:
parent
5b464179c1
commit
a75bf43a8d
@ -71,7 +71,8 @@ namespace drawinglayer::primitive2d
|
||||
Primitive2DContainer SVXCORE_DLLPUBLIC createEmbeddedShadowPrimitive(
|
||||
const Primitive2DContainer& rContent,
|
||||
const attribute::SdrShadowAttribute& rShadow,
|
||||
const basegfx::B2DHomMatrix& rObjectMatrix = basegfx::B2DHomMatrix());
|
||||
const basegfx::B2DHomMatrix& rObjectMatrix = basegfx::B2DHomMatrix(),
|
||||
const Primitive2DContainer* pContentForShadow = nullptr);
|
||||
|
||||
Primitive2DContainer SVXCORE_DLLPUBLIC createEmbeddedGlowPrimitive(
|
||||
const Primitive2DContainer& rContent,
|
||||
|
@ -16,12 +16,23 @@
|
||||
#include <com/sun/star/beans/XPropertySet.hpp>
|
||||
#include <com/sun/star/awt/XControlModel.hpp>
|
||||
#include <com/sun/star/graphic/XGraphic.hpp>
|
||||
#include <com/sun/star/table/XCellRange.hpp>
|
||||
#include <com/sun/star/text/XTextRange.hpp>
|
||||
|
||||
#include <comphelper/processfactory.hxx>
|
||||
#include <comphelper/propertysequence.hxx>
|
||||
#include <test/bootstrapfixture.hxx>
|
||||
#include <unotest/macros_test.hxx>
|
||||
#include <unotools/tempfile.hxx>
|
||||
#include <svx/unopage.hxx>
|
||||
#include <vcl/virdev.hxx>
|
||||
#include <svx/sdr/contact/displayinfo.hxx>
|
||||
#include <drawinglayer/tools/primitive2dxmldump.hxx>
|
||||
#include <svx/sdr/contact/viewcontact.hxx>
|
||||
#include <svx/sdr/contact/viewobjectcontact.hxx>
|
||||
#include <test/xmltesttools.hxx>
|
||||
|
||||
#include <sdr/contact/objectcontactofobjlistpainter.hxx>
|
||||
|
||||
using namespace ::com::sun::star;
|
||||
|
||||
@ -30,7 +41,7 @@ namespace
|
||||
char const DATA_DIRECTORY[] = "/svx/qa/unit/data/";
|
||||
|
||||
/// Tests for svx/source/unodraw/ code.
|
||||
class UnodrawTest : public test::BootstrapFixture, public unotest::MacrosTest
|
||||
class UnodrawTest : public test::BootstrapFixture, public unotest::MacrosTest, public XmlTestTools
|
||||
{
|
||||
protected:
|
||||
uno::Reference<lang::XComponent> mxComponent;
|
||||
@ -132,6 +143,37 @@ CPPUNIT_TEST_FIXTURE(UnodrawTest, testTableShadowDirect)
|
||||
xShapeProps->setPropertyValue("ShadowColor", uno::makeAny(nRed));
|
||||
CPPUNIT_ASSERT(xShapeProps->getPropertyValue("ShadowColor") >>= nRed);
|
||||
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0xff0000), nRed);
|
||||
|
||||
// Add text.
|
||||
uno::Reference<table::XCellRange> xTable(xShapeProps->getPropertyValue("Model"),
|
||||
uno::UNO_QUERY);
|
||||
uno::Reference<text::XTextRange> xCell(xTable->getCellByPosition(0, 0), uno::UNO_QUERY);
|
||||
xCell->setString("A1");
|
||||
|
||||
// Generates drawinglayer primitives for the shape.
|
||||
auto pDrawPage = dynamic_cast<SvxDrawPage*>(xDrawPage.get());
|
||||
CPPUNIT_ASSERT(pDrawPage);
|
||||
SdrPage* pSdrPage = pDrawPage->GetSdrPage();
|
||||
ScopedVclPtrInstance<VirtualDevice> aVirtualDevice;
|
||||
sdr::contact::ObjectContactOfObjListPainter aObjectContact(*aVirtualDevice,
|
||||
{ pSdrPage->GetObj(0) }, nullptr);
|
||||
const sdr::contact::ViewObjectContact& rDrawPageVOContact
|
||||
= pSdrPage->GetViewContact().GetViewObjectContact(aObjectContact);
|
||||
sdr::contact::DisplayInfo aDisplayInfo;
|
||||
drawinglayer::primitive2d::Primitive2DContainer xPrimitiveSequence
|
||||
= rDrawPageVOContact.getPrimitive2DSequenceHierarchy(aDisplayInfo);
|
||||
|
||||
// Check the primitives.
|
||||
drawinglayer::Primitive2dXmlDump aDumper;
|
||||
xmlDocUniquePtr pDocument = aDumper.dumpAndParse(xPrimitiveSequence);
|
||||
assertXPath(pDocument, "//shadow", /*nNumberOfNodes=*/1);
|
||||
|
||||
// Without the accompanying fix in place, this test would have failed with:
|
||||
// - Expected: 0
|
||||
// - Actual : 1
|
||||
// i.e. there was shadow for the cell text, while here PowerPoint-compatible output is expected,
|
||||
// which has no shadow for cell text (only for cell borders and cell background).
|
||||
assertXPath(pDocument, "//shadow//sdrblocktext", /*nNumberOfNodes=*/0);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -484,7 +484,8 @@ namespace drawinglayer::primitive2d
|
||||
Primitive2DContainer createEmbeddedShadowPrimitive(
|
||||
const Primitive2DContainer& rContent,
|
||||
const attribute::SdrShadowAttribute& rShadow,
|
||||
const basegfx::B2DHomMatrix& rObjectMatrix)
|
||||
const basegfx::B2DHomMatrix& rObjectMatrix,
|
||||
const Primitive2DContainer* pContentForShadow)
|
||||
{
|
||||
if(!rContent.empty())
|
||||
{
|
||||
@ -524,7 +525,7 @@ namespace drawinglayer::primitive2d
|
||||
aShadowOffset,
|
||||
rShadow.getColor(),
|
||||
rShadow.getBlur(),
|
||||
rContent));
|
||||
(pContentForShadow ? *pContentForShadow : rContent)));
|
||||
|
||||
if(0.0 != rShadow.getTransparence())
|
||||
{
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include <basegfx/matrix/b2dhommatrixtools.hxx>
|
||||
#include <svx/framelink.hxx>
|
||||
#include <svx/framelinkarray.hxx>
|
||||
#include <svx/sdooitm.hxx>
|
||||
#include <vcl/canvastools.hxx>
|
||||
|
||||
#include <cell.hxx>
|
||||
@ -205,6 +206,7 @@ namespace sdr::contact
|
||||
// directly to aRetval, Border info to aBorderSequence and added
|
||||
// later to get the correct overlapping
|
||||
drawinglayer::primitive2d::Primitive2DContainer aRetval;
|
||||
drawinglayer::primitive2d::Primitive2DContainer aRetvalForShadow;
|
||||
const sal_Int32 nRowCount(xTable->getRowCount());
|
||||
const sal_Int32 nColCount(xTable->getColumnCount());
|
||||
const sal_Int32 nAllCount(nRowCount * nColCount);
|
||||
@ -317,6 +319,16 @@ namespace sdr::contact
|
||||
aCellMatrix, aAttribute));
|
||||
aRetval.append(xCellReference);
|
||||
}
|
||||
|
||||
// Create cell primitive without text.
|
||||
aAttribute
|
||||
= drawinglayer::primitive2d::createNewSdrFillTextAttribute(
|
||||
rCellItemSet, nullptr);
|
||||
const drawinglayer::primitive2d::Primitive2DReference
|
||||
xCellReference(
|
||||
new drawinglayer::primitive2d::SdrCellPrimitive2D(
|
||||
aCellMatrix, aAttribute));
|
||||
aRetvalForShadow.append(xCellReference);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -364,6 +376,10 @@ namespace sdr::contact
|
||||
new drawinglayer::primitive2d::TransformPrimitive2D(
|
||||
aTransform,
|
||||
aCellBorderPrimitives));
|
||||
|
||||
// Borders are always the same for shadow as well.
|
||||
aRetvalForShadow.append(new drawinglayer::primitive2d::TransformPrimitive2D(
|
||||
aTransform, aCellBorderPrimitives));
|
||||
}
|
||||
}
|
||||
|
||||
@ -376,7 +392,23 @@ namespace sdr::contact
|
||||
|
||||
if(!aNewShadowAttribute.isDefault())
|
||||
{
|
||||
aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive(aRetval, aNewShadowAttribute);
|
||||
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(
|
||||
aRetval, aNewShadowAttribute, aMatrix, &aRetvalForShadow);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Shadow as style: shadow for text, to be backwards-compatible.
|
||||
aRetval = drawinglayer::primitive2d::createEmbeddedShadowPrimitive(
|
||||
aRetval, aNewShadowAttribute);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user