diff options
Diffstat (limited to 'svx')
-rw-r--r-- | svx/qa/unit/customshapes.cxx | 42 | ||||
-rw-r--r-- | svx/qa/unit/data/tdf160421_3D_FlipLight.odp | bin | 0 -> 23011 bytes | |||
-rw-r--r-- | svx/source/customshapes/EnhancedCustomShape3d.cxx | 8 | ||||
-rw-r--r-- | svx/source/sdr/properties/textproperties.cxx | 60 | ||||
-rw-r--r-- | svx/source/svdraw/svdpntv.cxx | 7 |
5 files changed, 83 insertions, 34 deletions
diff --git a/svx/qa/unit/customshapes.cxx b/svx/qa/unit/customshapes.cxx index 6ae5cc819c..fcc68aacf4 100644 --- a/svx/qa/unit/customshapes.cxx +++ b/svx/qa/unit/customshapes.cxx @@ -63,6 +63,9 @@ protected: // get shape nShapeIndex from page 0 uno::Reference<drawing::XShape> getShape(sal_uInt8 nShapeIndex); sal_uInt8 countShapes(); + // fX and fY are positions relative to the size of the bitmap of the shape + // Thus the position is indepedent from DPI + Color getColor(uno::Reference<drawing::XShape> xShape, const double& fX, const double& fY); }; uno::Reference<drawing::XShape> CustomshapesTest::getShape(sal_uInt8 nShapeIndex) @@ -89,6 +92,18 @@ sal_uInt8 CustomshapesTest::countShapes() return xDrawPage->getCount(); } +Color CustomshapesTest::getColor(uno::Reference<drawing::XShape> xShape, const double& fX, + const double& fY) +{ + GraphicHelper::SaveShapeAsGraphicToPath(mxComponent, xShape, "image/png", maTempFile.GetURL()); + SvFileStream aFileStream(maTempFile.GetURL(), StreamMode::READ); + vcl::PngImageReader aPNGReader(aFileStream); + Bitmap aBMP = aPNGReader.read().GetBitmap(); + Size aSize = aBMP.GetSizePixel(); + BitmapScopedReadAccess pRead(aBMP); + return pRead->GetColor(aSize.Height() * fY, aSize.Width() * fX); +} + CPPUNIT_TEST_FIXTURE(CustomshapesTest, testTdf150302) { loadFromFile(u"FontworkSameLetterHeights.fodg"); @@ -1381,6 +1396,33 @@ CPPUNIT_TEST_FIXTURE(CustomshapesTest, testTdf153000_MS0_SPT_25_31) CPPUNIT_ASSERT_EQUAL(aExpected[i], aCoordinates.getLength()); } } + +CPPUNIT_TEST_FIXTURE(CustomshapesTest, testTdf160421_3D_FlipLight) +{ + // The document contains (0)an extruded 'rectangle' custom shape which is illuminated with front + // light, (1) this shape vertically flipped and (2) this shape horizontally flipped. + // When the shape is flipped vertically or horizontally, the light direction should not + // change. MS Office behaves in this way for ppt and pptx and it is meaningful as flipping is + // applied to the shape, not to the scene. + + // Load document. + loadFromFile(u"tdf160421_3D_FlipLight.odp"); + + // Get color from untransformed shape (0). + uno::Reference<drawing::XShape> xShape = getShape(0); + Color aNormalColor = getColor(xShape, 0.6, 0.6); + + // Test that color from vertically flipped shape (1) is same as normal color. Without the fix + // it was only build from ambient light and thus much darker. + xShape = getShape(1); + sal_uInt16 nColorDistance = aNormalColor.GetColorError(getColor(xShape, 0.6, 0.6)); + CPPUNIT_ASSERT_LESS(sal_uInt16(6), nColorDistance); + + // Same for horizontally flipped shape (2) + xShape = getShape(2); + nColorDistance = aNormalColor.GetColorError(getColor(xShape, 0.6, 0.6)); + CPPUNIT_ASSERT_LESS(sal_uInt16(6), nColorDistance); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/qa/unit/data/tdf160421_3D_FlipLight.odp b/svx/qa/unit/data/tdf160421_3D_FlipLight.odp Binary files differnew file mode 100644 index 0000000000..2decc51e3e --- /dev/null +++ b/svx/qa/unit/data/tdf160421_3D_FlipLight.odp diff --git a/svx/source/customshapes/EnhancedCustomShape3d.cxx b/svx/source/customshapes/EnhancedCustomShape3d.cxx index a401246277..2a2d049e18 100644 --- a/svx/source/customshapes/EnhancedCustomShape3d.cxx +++ b/svx/source/customshapes/EnhancedCustomShape3d.cxx @@ -838,6 +838,14 @@ rtl::Reference<SdrObject> EnhancedCustomShape3d::Create3DObject( basegfx::B3DVector aLight2Vector(aSecondLightDirection.DirectionX, -aSecondLightDirection.DirectionY, aSecondLightDirection.DirectionZ); aLight2Vector.normalize(); + // tdf#160421 a single flip inverts the light directions currently (March 2024). So invert + // their directions here for rendering. + if (bIsMirroredX != bIsMirroredY) + { + aLight1Vector *= -1.0; + aLight2Vector *= -1.0; + } + // Light Intensity // For "FirstLight" the 3D-Scene light "1" is regularly used. In case of surface "Matte" diff --git a/svx/source/sdr/properties/textproperties.cxx b/svx/source/sdr/properties/textproperties.cxx index 55b366bdc0..17f63d044d 100644 --- a/svx/source/sdr/properties/textproperties.cxx +++ b/svx/source/sdr/properties/textproperties.cxx @@ -554,50 +554,44 @@ namespace sdr::properties if(!rObj.HasText()) return; + SfxHintId nId(rHint.GetId()); const svx::ITextProvider& rTextProvider(getTextProvider()); - if(dynamic_cast<const SfxStyleSheet *>(&rBC) != nullptr) - { - SfxHintId nId(rHint.GetId()); - if(SfxHintId::DataChanged == nId) + if(SfxHintId::DataChanged == nId && dynamic_cast<const SfxStyleSheet *>(&rBC) != nullptr) + { + sal_Int32 nText = rTextProvider.getTextCount(); + while (nText--) { - sal_Int32 nText = rTextProvider.getTextCount(); - while (nText--) - { - OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); - if( pParaObj ) - pParaObj->ClearPortionInfo(); - } - rObj.SetTextSizeDirty(); - - if(rObj.IsTextFrame() && rObj.NbcAdjustTextFrameWidthAndHeight()) - { - // here only repaint wanted - rObj.ActionChanged(); - //rObj.BroadcastObjectChange(); - } + OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); + if( pParaObj ) + pParaObj->ClearPortionInfo(); + } + rObj.SetTextSizeDirty(); - // #i101556# content of StyleSheet has changed -> new version - maVersion++; + if(rObj.IsTextFrame() && rObj.NbcAdjustTextFrameWidthAndHeight()) + { + // here only repaint wanted + rObj.ActionChanged(); + //rObj.BroadcastObjectChange(); } - if(SfxHintId::Dying == nId) + // #i101556# content of StyleSheet has changed -> new version + maVersion++; + } + else if(SfxHintId::Dying == nId && dynamic_cast<const SfxStyleSheet *>(&rBC) != nullptr) + { + sal_Int32 nText = rTextProvider.getTextCount(); + while (nText--) { - sal_Int32 nText = rTextProvider.getTextCount(); - while (nText--) - { - OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); - if( pParaObj ) - pParaObj->ClearPortionInfo(); - } + OutlinerParaObject* pParaObj = rTextProvider.getText( nText )->GetOutlinerParaObject(); + if( pParaObj ) + pParaObj->ClearPortionInfo(); } } - else if(dynamic_cast<const SfxStyleSheetBasePool *>(&rBC) != nullptr) + else if (nId == SfxHintId::StyleSheetModified && dynamic_cast<const SfxStyleSheetBasePool *>(&rBC) != nullptr) { const SfxStyleSheetModifiedHint* pExtendedHint = dynamic_cast<const SfxStyleSheetModifiedHint*>(&rHint); - - if(pExtendedHint - && SfxHintId::StyleSheetModified == pExtendedHint->GetId()) + if (pExtendedHint) { const OUString& aOldName(pExtendedHint->GetOldName()); OUString aNewName(pExtendedHint->GetStyleSheet()->GetName()); diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx index f092887250..780227f4a1 100644 --- a/svx/source/svdraw/svdpntv.cxx +++ b/svx/source/svdraw/svdpntv.cxx @@ -858,7 +858,12 @@ void SdrPaintView::InvalidateAllWin(const tools::Rectangle& rRect) void SdrPaintView::InvalidateOneWin(OutputDevice& rDevice) { // do not erase background, that causes flicker (!) - rDevice.GetOwnerWindow()->Invalidate(InvalidateFlags::NoErase); + // tdf#160444 check device's owner window is a nullptr + // Since commit 563f7077f1dbce31ff95ee8d2e8d17b629693db1, the + // device's owner window gets deleted before this object is + // deleted. + if (rDevice.GetOwnerWindow()) + rDevice.GetOwnerWindow()->Invalidate(InvalidateFlags::NoErase); } void SdrPaintView::InvalidateOneWin(OutputDevice& rDevice, const tools::Rectangle& rRect) |