drawinglayer/source/texture/texture.cxx |   13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

New commits:
commit 93915c0be321c79821bbeca0b0af95ba452c5011
Author:     Stephan Bergmann <[email protected]>
AuthorDate: Mon May 8 10:06:33 2023 +0200
Commit:     Stephan Bergmann <[email protected]>
CommitDate: Mon May 8 15:17:06 2023 +0200

    Avoid more division by zero
    
    Similar to <https://gerrit.libreoffice.org/c/core/+/151495> "Avoid division 
by
    zero", CppunitTest_sw_ooxmlexport7 CPPUNIT_TEST_NAME=testFdo78957::TestBody
    started to fail with
    
    > drawinglayer/source/texture/texture.cxx:470:71: runtime error: division 
by zero
    >  #0 in 
drawinglayer::texture::GeoTexSvxGradientRadial::appendTransformationsAndColors(std::function<void
 (basegfx::B2DHomMatrix const&, basegfx::BColor const&)>) at 
drawinglayer/source/texture/texture.cxx:470:71
    >  #1 in 
drawinglayer::primitive2d::FillGradientPrimitive2D::generateMatricesAndColors(std::function<void
 (basegfx::B2DHomMatrix const&, basegfx::BColor const&)>) const at 
drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx:99:31
    >  #2 in 
drawinglayer::processor2d::VclPixelProcessor2D::processFillGradientPrimitive2D(drawinglayer::primitive2d::FillGradientPrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:1017:24
    >  #3 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:363:13
    >  #4 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #5 in 
drawinglayer::processor2d::VclProcessor2D::RenderMaskPrimitive2DPixel(drawinglayer::primitive2d::MaskPrimitive2D
 const&) at drawinglayer/source/processor2d/vclprocessor2d.cxx:866:9
    >  #6 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:257:13
    >  #7 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #8 in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >  #9 in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const at 
drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:41:14
    >  #10 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >  #11 in 
drawinglayer::processor2d::VclPixelProcessor2D::processPolyPolygonGradientPrimitive2D(drawinglayer::primitive2d::PolyPolygonGradientPrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:490:9
    >  #12 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:232:13
    >  #13 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #14 in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >  #15 in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const at 
drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:41:14
    >  #16 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >  #17 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:378:13
    >  #18 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #19 in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >  #20 in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const at 
drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:41:14
    >  #21 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >  #22 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:378:13
    >  #23 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #24 in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >  #25 in 
drawinglayer::primitive2d::GroupPrimitive2D::getChildren(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&)
 const at include/drawinglayer/primitive2d/groupprimitive2d.hxx:76:90
    >  #26 in 
drawinglayer::primitive2d::GroupPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const at 
drawinglayer/source/primitive2d/groupprimitive2d.cxx:53:13
    >  #27 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >  #28 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:378:13
    >  #29 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #30 in 
drawinglayer::processor2d::VclProcessor2D::RenderTransformPrimitive2D(drawinglayer::primitive2d::TransformPrimitive2D
 const&) at drawinglayer/source/processor2d/vclprocessor2d.cxx:1004:5
    >  #31 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:284:13
    >  #32 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #33 in 
drawinglayer::processor2d::VclProcessor2D::RenderTransformPrimitive2D(drawinglayer::primitive2d::TransformPrimitive2D
 const&) at drawinglayer/source/processor2d/vclprocessor2d.cxx:1004:5
    >  #34 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:284:13
    >  #35 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #36 in 
drawinglayer::processor2d::VclProcessor2D::RenderTransformPrimitive2D(drawinglayer::primitive2d::TransformPrimitive2D
 const&) at drawinglayer/source/processor2d/vclprocessor2d.cxx:1004:5
    >  #37 in 
drawinglayer::processor2d::VclPixelProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) at drawinglayer/source/processor2d/vclpixelprocessor2d.cxx:284:13
    >  #38 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) at drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >  #39 in 
drawinglayer::convertToBitmapEx(drawinglayer::primitive2d::Primitive2DContainer&&,
 drawinglayer::geometry::ViewInformation2D const&, unsigned int, unsigned int, 
unsigned int) at drawinglayer/source/tools/converters.cxx:217:24
    >  #40 in 
drawinglayer::convertPrimitive2DContainerToBitmapEx(drawinglayer::primitive2d::Primitive2DContainer&&,
 basegfx::B2DRange const&, unsigned int, o3tl::Length, std::optional<Size> 
const&) at drawinglayer/source/tools/converters.cxx:332:28
    >  #41 in SvxShape::GetBitmap(bool) const at 
svx/source/unodraw/unoshape.cxx:717:21
    >  #42 in SvxShape::getPropertyValueImpl(rtl::OUString const&, 
SfxItemPropertyMapEntry const*, com::sun::star::uno::Any&) at 
svx/source/unodraw/unoshape.cxx:2597:18
    >  #43 in SvxCustomShape::getPropertyValueImpl(rtl::OUString const&, 
SfxItemPropertyMapEntry const*, com::sun::star::uno::Any&) at 
svx/source/unodraw/unoshap2.cxx:1780:26
    >  #44 in SvxShape::_getPropertyValue(rtl::OUString const&) at 
svx/source/unodraw/unoshape.cxx:1638:14
    >  #45 in SvxShape::getPropertyValue(rtl::OUString const&) at 
svx/source/unodraw/unoshape.cxx:1622:16
    >  #46 in non-virtual thunk to SvxShape::getPropertyValue(rtl::OUString 
const&) at svx/source/unodraw/unoshape.cxx
    >  #47 in SwXShape::_getPropAtAggrObj(rtl::OUString const&) at 
sw/source/core/unocore/unodraw.cxx:1823:23
    >  #48 in SwXShape::getPropertyValue(rtl::OUString const&) at 
sw/source/core/unocore/unodraw.cxx:1753:20
    >  #49 in non-virtual thunk to SwXShape::getPropertyValue(rtl::OUString 
const&) at sw/source/core/unocore/unodraw.cxx
    >  #50 in 
writerfilter::TagLogger::unoPropertySet(com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet>
 const&) at writerfilter/source/dmapper/TagLogger.cxx:123:47
    >  #51 in 
writerfilter::dmapper::DomainMapper_Impl::PushShapeContext(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
 const&) at writerfilter/source/dmapper/DomainMapper_Impl.cxx:4204:38
    >  #52 in 
writerfilter::dmapper::DomainMapper::lcl_startShape(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
 const&) at writerfilter/source/dmapper/DomainMapper.cxx:3680:18
    >  #53 in 
writerfilter::LoggedStream::startShape(com::sun::star::uno::Reference<com::sun::star::drawing::XShape>
 const&) at writerfilter/source/dmapper/LoggedResources.cxx:139:5
    >  #54 in writerfilter::ooxml::OOXMLFastContextHandlerShape::sendShape(int) 
at writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:1810:19
    >  #55 in 
writerfilter::ooxml::OOXMLFastContextHandlerShape::lcl_endFastElement(int) at 
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:1829:9
    >  #56 in writerfilter::ooxml::OOXMLFastContextHandler::endFastElement(int) 
at writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:223:9
    >  #57 in (anonymous namespace)::Entity::endElement() at 
sax/source/fastparser/fastparser.cxx:515:27
    >  #58 in sax_fastparser::FastSaxParserImpl::callbackEndElement() at 
sax/source/fastparser/fastparser.cxx:1330:17
    >  #59 in (anonymous namespace)::call_callbackEndElement(void*, unsigned 
char const*, unsigned char const*, unsigned char const*) at 
sax/source/fastparser/fastparser.cxx:339:18
    >  #60 in xmlParseEndTag2 at workdir/UnpackedTarball/libxml2/parser.c:9742:2
    >  #61 in xmlParseTryOrFinish at 
workdir/UnpackedTarball/libxml2/parser.c:11642:14
    >  #62 in xmlParseChunk at workdir/UnpackedTarball/libxml2/parser.c:12351:13
    >  #63 in sax_fastparser::FastSaxParserImpl::parse() at 
sax/source/fastparser/fastparser.cxx:1111:25
    >  #64 in 
sax_fastparser::FastSaxParserImpl::parseStream(com::sun::star::xml::sax::InputSource
 const&) at sax/source/fastparser/fastparser.cxx:891:9
    >  #65 in 
sax_fastparser::FastSaxParser::parseStream(com::sun::star::xml::sax::InputSource
 const&) at sax/source/fastparser/fastparser.cxx:1469:13
    >  #66 in 
writerfilter::ooxml::OOXMLDocumentImpl::resolve(writerfilter::Stream&) at 
writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:515:18
    >  #67 in writerfilter::dmapper::DomainMapper_Impl::substream(unsigned int, 
tools::SvRef<writerfilter::Reference<writerfilter::Stream>> const&) at 
writerfilter/source/dmapper/DomainMapper_Impl.cxx:9143:14
    >  #68 in writerfilter::dmapper::DomainMapper::lcl_substream(unsigned int, 
tools::SvRef<writerfilter::Reference<writerfilter::Stream>>) at 
writerfilter/source/dmapper/DomainMapper.cxx:4390:14
    >  #69 in writerfilter::LoggedStream::substream(unsigned int, 
tools::SvRef<writerfilter::Reference<writerfilter::Stream>>) at 
writerfilter/source/dmapper/LoggedResources.cxx:272:5
    >  #70 in 
writerfilter::ooxml::OOXMLDocumentImpl::resolveFastSubStreamWithId(writerfilter::Stream&,
 tools::SvRef<writerfilter::Reference<writerfilter::Stream>> const&, unsigned 
int) at writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:126:13
    >  #71 in 
writerfilter::ooxml::OOXMLDocumentImpl::resolveHeader(writerfilter::Stream&, 
int, rtl::OUString const&) at 
writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:385:10
    >  #72 in writerfilter::ooxml::OOXMLFastContextHandler::resolveHeader(int, 
rtl::OUString const&) at 
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:888:35
    >  #73 in writerfilter::ooxml::OOXMLHeaderHandler::finalize() at 
writerfilter/source/ooxml/Handler.cxx:214:20
    >  #74 in 
writerfilter::ooxml::OOXMLFastContextHandlerProperties::handleHdrFtr() at 
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:1113:28
    >  #75 in 
writerfilter::ooxml::OOXMLFactory_wml::endAction(writerfilter::ooxml::OOXMLFastContextHandler*)
 at workdir/CustomTarget/writerfilter/source/ooxml/OOXMLFactory_wml.cxx:7482:26
    >  #76 in 
writerfilter::ooxml::OOXMLFactory::endAction(writerfilter::ooxml::OOXMLFastContextHandler*)
 at writerfilter/source/ooxml/OOXMLFactory.cxx:157:19
    >  #77 in writerfilter::ooxml::OOXMLFastContextHandler::endAction() at 
writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:316:5
    >  #78 in 
writerfilter::ooxml::OOXMLFastContextHandlerProperties::lcl_endFastElement(int) 
at writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:1034:9
    >  #79 in writerfilter::ooxml::OOXMLFastContextHandler::endFastElement(int) 
at writerfilter/source/ooxml/OOXMLFastContextHandler.cxx:223:9
    >  #80 in (anonymous namespace)::Entity::endElement() at 
sax/source/fastparser/fastparser.cxx:515:27
    >  #81 in sax_fastparser::FastSaxParserImpl::callbackEndElement() at 
sax/source/fastparser/fastparser.cxx:1330:17
    >  #82 in (anonymous namespace)::call_callbackEndElement(void*, unsigned 
char const*, unsigned char const*, unsigned char const*) at 
sax/source/fastparser/fastparser.cxx:339:18
    >  #83 in xmlParseTryOrFinish at 
workdir/UnpackedTarball/libxml2/parser.c:11493:8
    >  #84 in xmlParseChunk at workdir/UnpackedTarball/libxml2/parser.c:12351:13
    >  #85 in sax_fastparser::FastSaxParserImpl::parse() at 
sax/source/fastparser/fastparser.cxx:1086:21
    >  #86 in 
sax_fastparser::FastSaxParserImpl::parseStream(com::sun::star::xml::sax::InputSource
 const&) at sax/source/fastparser/fastparser.cxx:891:9
    >  #87 in 
sax_fastparser::FastSaxParser::parseStream(com::sun::star::xml::sax::InputSource
 const&) at sax/source/fastparser/fastparser.cxx:1469:13
    >  #88 in 
writerfilter::ooxml::OOXMLDocumentImpl::resolve(writerfilter::Stream&) at 
writerfilter/source/ooxml/OOXMLDocumentImpl.cxx:515:18
    >  #89 in (anonymous 
namespace)::WriterFilter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
 const&) at writerfilter/source/filter/WriterFilter.cxx:208:24
    >  #90 in SfxObjectShell::ImportFrom(SfxMedium&, 
com::sun::star::uno::Reference<com::sun::star::text::XTextRange> const&) at 
sfx2/source/doc/objstor.cxx:2272:34
    >  #91 in SfxObjectShell::DoLoad(SfxMedium*) at 
sfx2/source/doc/objstor.cxx:739:23
    >  #92 in 
SfxBaseModel::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
 const&) at sfx2/source/doc/sfxbasemodel.cxx:1940:36
    >  #93 in (anonymous 
namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
 const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) 
at sfx2/source/view/frmload.cxx:720:28
    >  #94 in framework::LoadEnv::impl_loadContent() at 
framework/source/loadenv/loadenv.cxx:1176:37
    >  #95 in framework::LoadEnv::start() at 
framework/source/loadenv/loadenv.cxx:412:20
    >  #96 in framework::LoadEnv::startLoading(rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, 
com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, 
rtl::OUString const&, int, LoadEnvFeatures) at 
framework/source/loadenv/loadenv.cxx:308:5
    >  #97 in 
framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader>
 const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> 
const&, rtl::OUString const&, rtl::OUString const&, int, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at 
framework/source/loadenv/loadenv.cxx:168:14
    >  #98 in framework::Desktop::loadComponentFromURL(rtl::OUString const&, 
rtl::OUString const&, int, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at 
framework/source/services/desktop.cxx:593:16
    >  #99 in non-virtual thunk to 
framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString 
const&, int, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at 
framework/source/services/desktop.cxx
    >  #100 in unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, 
rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) at 
unotest/source/cpp/macros_test.cxx:71:62
    >  #101 in UnoApiTest::load(rtl::OUString const&, char const*) at 
test/source/unoapi_test.cxx:115:11
    >  #102 in SwModelTestBase::loadURL(rtl::OUString const&, char const*, char 
const*) at sw/qa/unit/swmodeltestbase.cxx:470:20
    >  #103 in SwModelTestBase::load(char const*, char const*) at 
sw/qa/inc/swmodeltestbase.hxx:353:16
    >  #104 in SwModelTestBase::loadAndSave(char const*) at 
sw/qa/unit/swmodeltestbase.cxx:523:5
    >  #105 in testFdo78957::TestBody() at 
sw/qa/extras/ooxmlexport/ooxmlexport7.cxx:783:5
    
    Change-Id: Ifbc7da0b6c971df61e9908cc02b10a9f50769fcf
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151496
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <[email protected]>

diff --git a/drawinglayer/source/texture/texture.cxx 
b/drawinglayer/source/texture/texture.cxx
index 648359931bd0..aeeb5b61bb05 100644
--- a/drawinglayer/source/texture/texture.cxx
+++ b/drawinglayer/source/texture/texture.cxx
@@ -467,7 +467,11 @@ namespace drawinglayer::texture
                     // set and add at target
                     aCallback(
                         maGradientInfo.getTextureTransform() * 
basegfx::utils::createScaleB2DHomMatrix(fSize, fSize),
-                        interpolate(aCStart, aCEnd, double(innerLoop) / 
double(nSteps - 1)));
+                        interpolate(
+                            aCStart, aCEnd,
+                            nSteps == 1
+                                ? std::numeric_limits<double>::infinity()
+                                : double(innerLoop) / double(nSteps - 1)));
                 }
             }
 
commit d7aaec3d11101183b14cb51fe6e444e45736059a
Author:     Stephan Bergmann <[email protected]>
AuthorDate: Mon May 8 09:45:18 2023 +0200
Commit:     Stephan Bergmann <[email protected]>
CommitDate: Mon May 8 15:16:56 2023 +0200

    Avoid division by zero
    
    bb198176684c3d9377e26c04a29ec66deb811949 "MCGR: Make MCGR default for oox
    im/export, cleanup" started to cause CppunitTest_chart2_geometry
    
CPPUNIT_TEST_NAME=Chart2GeometryTest::testTdf128345Legend_CS_TG_axial_import to
    fail with the below UBSan failure (even though the relevant code appears to 
be
    even older than that commit).
    
    At least for now, lets silence that by explicitly using +INF in case the 
divisor
    is zero (and the dividend is known non-negative).
    
    > /drawinglayer/source/texture/texture.cxx:246:71: runtime error: division 
by zero
    >     #0 0x7f2e61d80f7f in 
drawinglayer::texture::GeoTexSvxGradientLinear::appendTransformationsAndColors(std::function<void
 (basegfx::B2DHomMatrix const&, basegfx::BColor const&)>) 
/drawinglayer/source/texture/texture.cxx:246:71
    >     #1 0x7f2e616e187d in 
drawinglayer::primitive2d::FillGradientPrimitive2D::generateMatricesAndColors(std::function<void
 (basegfx::B2DHomMatrix const&, basegfx::BColor const&)>) const 
/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx:75:31
    >     #2 0x7f2e616e4f4f in 
drawinglayer::primitive2d::FillGradientPrimitive2D::createFill(drawinglayer::primitive2d::Primitive2DContainer&,
 bool) const /drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx:172:17
    >     #3 0x7f2e616e66ca in 
drawinglayer::primitive2d::FillGradientPrimitive2D::create2DDecomposition(drawinglayer::primitive2d::Primitive2DContainer&,
 drawinglayer::geometry::ViewInformation2D const&) const 
/drawinglayer/source/primitive2d/fillgradientprimitive2d.cxx:269:17
    >     #4 0x7f2e76cecd04 in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const 
/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:36:9
    >     #5 0x7f2e619b9278 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >     #6 0x7f2e61a38a25 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:917:13
    >     #7 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #8 0x7f2e61a5cc3e in 
drawinglayer::processor2d::VclMetafileProcessor2D::processMaskPrimitive2D(drawinglayer::primitive2d::MaskPrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:2139:13
    >     #9 0x7f2e61a3734a in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:833:13
    >     #10 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #11 0x7f2e619b952c in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >     #12 0x7f2e76ced03a in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const 
/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:41:14
    >     #13 0x7f2e619b9278 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >     #14 0x7f2e61a595e3 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processPolyPolygonGradientPrimitive2D(drawinglayer::primitive2d::PolyPolygonGradientPrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:2014:9
    >     #15 0x7f2e61a36fc0 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:821:13
    >     #16 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #17 0x7f2e61a2e0da in 
drawinglayer::processor2d::VclMetafileProcessor2D::impDumpToMetaFile(drawinglayer::primitive2d::Primitive2DContainer
 const&, GDIMetaFile&) 
/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:244:5
    >     #18 0x7f2e61a60f4a in 
drawinglayer::processor2d::VclMetafileProcessor2D::processTransparencePrimitive2D(drawinglayer::primitive2d::TransparencePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:2292:52
    >     #19 0x7f2e61a378cb in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:851:13
    >     #20 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #21 0x7f2e619b952c in 
drawinglayer::processor2d::BaseProcessor2D::visit(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:56:13
    >     #22 0x7f2e76ced03a in 
drawinglayer::primitive2d::BufferedDecompositionPrimitive2D::get2DDecomposition(drawinglayer::primitive2d::Primitive2DDecompositionVisitor&,
 drawinglayer::geometry::ViewInformation2D const&) const 
/drawinglayer/source/primitive2d/BufferedDecompositionPrimitive2D.cxx:41:14
    >     #23 0x7f2e619b9278 in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:46:24
    >     #24 0x7f2e61a38a25 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:917:13
    >     #25 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #26 0x7f2e61a68781 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processObjectInfoPrimitive2D(drawinglayer::primitive2d::ObjectInfoPrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:965:5
    >     #27 0x7f2e61a38916 in 
drawinglayer::processor2d::VclMetafileProcessor2D::processBasePrimitive2D(drawinglayer::primitive2d::BasePrimitive2D
 const&) /drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx:910:13
    >     #28 0x7f2e619b9a5f in 
drawinglayer::processor2d::BaseProcessor2D::process(drawinglayer::primitive2d::Primitive2DContainer
 const&) /drawinglayer/source/processor2d/baseprocessor2d.cxx:68:21
    >     #29 0x7f2df2676731 in 
sdr::contact::ObjectContactOfPageView::DoProcessDisplay(sdr::contact::DisplayInfo&)
 /svx/source/sdr/contact/objectcontactofpageview.cxx:277:31
    >     #30 0x7f2df26741be in 
sdr::contact::ObjectContactOfPageView::ProcessDisplay(sdr::contact::DisplayInfo&)
 /svx/source/sdr/contact/objectcontactofpageview.cxx:117:21
    >     #31 0x7f2df291809d in 
SdrPageWindow::RedrawAll(sdr::contact::ViewObjectContactRedirector*) 
/svx/source/svdraw/sdrpagewindow.cxx:357:28
    >     #32 0x7f2df363584c in SdrPageView::CompleteRedraw(SdrPaintWindow&, 
vcl::Region const&, sdr::contact::ViewObjectContactRedirector*) 
/svx/source/svdraw/svdpagv.cxx:239:18
    >     #33 0x7f2df36a80b0 in SdrPaintView::DoCompleteRedraw(SdrPaintWindow&, 
vcl::Region const&, sdr::contact::ViewObjectContactRedirector*) 
/svx/source/svdraw/svdpntv.cxx:609:21
    >     #34 0x7f2df36a7b61 in SdrPaintView::CompleteRedraw(OutputDevice*, 
vcl::Region const&, sdr::contact::ViewObjectContactRedirector*) 
/svx/source/svdraw/svdpntv.cxx:522:5
    >     #35 0x7f2df3ec0413 in (anonymous 
namespace)::GraphicExporter::GetGraphic((anonymous namespace)::ExportSettings 
const&, Graphic&, bool) /svx/source/unodraw/UnoGraphicExporter.cxx:740:24
    >     #36 0x7f2df3ec857b in (anonymous 
namespace)::GraphicExporter::filter(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue>
 const&) /svx/source/unodraw/UnoGraphicExporter.cxx:1037:19
    >     #37 0x7f2db53f082a in 
chart::ChartView::getMetaFile(com::sun::star::uno::Reference<com::sun::star::io::XOutputStream>
 const&, bool) /chart2/source/view/main/ChartView.cxx:263:20
    >     #38 0x7f2db53f1d43 in 
chart::ChartView::getTransferData(com::sun::star::datatransfer::DataFlavor 
const&) /chart2/source/view/main/ChartView.cxx:285:11
    >     #39 0x7f2db53f28ae in non-virtual thunk to 
chart::ChartView::getTransferData(com::sun::star::datatransfer::DataFlavor 
const&) /chart2/source/view/main/ChartView.cxx
    >     #40 0x7f2db586547f in 
chart::ChartModel::getPreferredVisualRepresentation(long) 
/chart2/source/model/main/ChartModel.cxx:1054:44
    >     #41 0x7f2db586779e in non-virtual thunk to 
chart::ChartModel::getPreferredVisualRepresentation(long) 
/chart2/source/model/main/ChartModel.cxx
    >     #42 0x7f2db8401589 in 
OCommonEmbeddedObject::getPreferredVisualRepresentation(long) 
/embeddedobj/source/commonembedding/visobj.cxx:186:48
    >     #43 0x7f2e95742555 in 
comphelper::EmbeddedObjectContainer::GetGraphicReplacementStream(long, 
com::sun::star::uno::Reference<com::sun::star::embed::XEmbeddedObject> const&, 
rtl::OUString*) /comphelper/source/container/embeddedobjectcontainer.cxx:1428:54
    >     #44 0x7f2e9573f6b4 in 
comphelper::EmbeddedObjectContainer::StoreAsChildren(bool, bool, bool, 
com::sun::star::uno::Reference<com::sun::star::embed::XStorage> const&) 
/comphelper/source/container/embeddedobjectcontainer.cxx:1198:31
    >     #45 0x7f2e044c7a1f in SfxObjectShell::SaveAsChildren(SfxMedium&) 
/sfx2/source/doc/objstor.cxx:3316:38
    >     #46 0x7f2e044c6d0c in SfxObjectShell::SaveAs(SfxMedium&) 
/sfx2/source/doc/objstor.cxx:160:12
    >     #47 0x7f2e0c509471 in sd::DrawDocShell::SaveAs(SfxMedium&) 
/sd/source/ui/docshell/docshel4.cxx:602:33
    >     #48 0x7f2e0453a4ec in SfxObjectShell::SaveAsOwnFormat(SfxMedium&) 
/sfx2/source/doc/objstor.cxx:3256:16
    >     #49 0x7f2e0c513d7d in sd::DrawDocShell::SaveAsOwnFormat(SfxMedium&) 
/sd/source/ui/docshell/docshel4.cxx:924:28
    >     #50 0x7f2e044f8b0c in SfxObjectShell::SaveTo_Impl(SfxMedium&, 
SfxItemSet const*) /sfx2/source/doc/objstor.cxx:1457:23
    >     #51 0x7f2e04534ef5 in SfxObjectShell::PreDoSaveAs_Impl(rtl::OUString 
const&, rtl::OUString const&, SfxItemSet const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) 
/sfx2/source/doc/objstor.cxx:2993:39
    >     #52 0x7f2e0452c40c in SfxObjectShell::CommonSaveAs_Impl(INetURLObject 
const&, rtl::OUString const&, SfxItemSet&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) 
/sfx2/source/doc/objstor.cxx:2783:9
    >     #53 0x7f2e04486556 in 
SfxObjectShell::APISaveAs_Impl(std::basic_string_view<char16_t, 
std::char_traits<char16_t> >, SfxItemSet&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) 
/sfx2/source/doc/objserv.cxx:319:19
    >     #54 0x7f2e046d7afe in SfxBaseModel::impl_store(rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, 
bool) /sfx2/source/doc/sfxbasemodel.cxx:3151:42
    >     #55 0x7f2e046de8db in SfxBaseModel::storeToURL(rtl::OUString const&, 
com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) 
/sfx2/source/doc/sfxbasemodel.cxx:1785:13
    >     #56 0x7f2dff75b078 in UnoApiTest::save(rtl::OUString const&, char 
const*) /test/source/unoapi_test.cxx:174:16
    >     #57 0x7f2e63063d61 in 
Chart2GeometryTest::testTdf128345Legend_CS_TG_axial_import() 
/chart2/qa/extras/chart2geometry.cxx:322:5
    
    (<>https://ci.libreoffice.org//job/lo_ubsan/2766/)
    
    Change-Id: I72650fba2ee7ba339ec78d24dd690487c31e2600
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/151495
    Tested-by: Jenkins
    Reviewed-by: Stephan Bergmann <[email protected]>

diff --git a/drawinglayer/source/texture/texture.cxx 
b/drawinglayer/source/texture/texture.cxx
index 0960ffbbbde3..648359931bd0 100644
--- a/drawinglayer/source/texture/texture.cxx
+++ b/drawinglayer/source/texture/texture.cxx
@@ -20,6 +20,7 @@
 #include <sal/config.h>
 
 #include <algorithm>
+#include <limits>
 
 #include <texture/texture.hxx>
 #include <basegfx/numeric/ftools.hxx>
@@ -243,7 +244,11 @@ namespace drawinglayer::texture
                     // set and add at target
                     aCallback(
                         maGradientInfo.getTextureTransform() * aNew,
-                        interpolate(aCStart, aCEnd, double(innerLoop) / 
double(nSteps - 1)));
+                        interpolate(
+                            aCStart, aCEnd,
+                            nSteps == 1
+                                ? std::numeric_limits<double>::infinity()
+                                : double(innerLoop) / double(nSteps - 1)));
                 }
             }
 

Reply via email to