drawinglayer/source/primitive2d/svggradientprimitive2d.cxx |   30 +++++++++----
 1 file changed, 21 insertions(+), 9 deletions(-)

New commits:
commit c20e70d28df21429bba92b6d8a7d7061c2aa5d8b
Author:     Armin Le Grand <armin.le.gr...@me.com>
AuthorDate: Thu Mar 12 13:31:44 2020 +0100
Commit:     Armin Le Grand <armin.le.gr...@me.com>
CommitDate: Thu Mar 12 14:49:39 2020 +0100

    tdf#124424 Corrections at SvgGradientHelper for EMF+
    
    Change-Id: Ibda3568887de5df2bc45a9bc8cb424ba7658a768
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/90382
    Tested-by: Jenkins
    Reviewed-by: Armin Le Grand <armin.le.gr...@me.com>

diff --git a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx 
b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
index 4367d8e3eb1a..20d3182e5ba8 100644
--- a/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
+++ b/drawinglayer/source/primitive2d/svggradientprimitive2d.cxx
@@ -240,29 +240,32 @@ namespace drawinglayer::primitive2d
             double fStart,
             double fEnd) const
         {
+            double fInt(0.0);
+            double fFrac(0.0);
+            double fEnd2(0.0);
+
             if(SpreadMethod::Pad == getSpreadMethod())
             {
                 if(fStart < 0.0)
                 {
+                    fFrac = std::modf(fStart, &fInt);
                     const SvgGradientEntry& 
rFront(getGradientEntries().front());
-                    const SvgGradientEntry aTemp(fStart, rFront.getColor(), 
rFront.getOpacity());
-                    createAtom(rTargetColor, rTargetOpacity, aTemp, rFront, 0, 
0);
+                    const SvgGradientEntry aTemp(1.0 + fFrac, 
rFront.getColor(), rFront.getOpacity());
+                    createAtom(rTargetColor, rTargetOpacity, aTemp, rFront, 
static_cast<sal_Int32>(fInt - 1), 0);
                     fStart = rFront.getOffset();
                 }
 
-                if(fEnd < 1.0)
+                if(fEnd > 1.0)
                 {
-                    const SvgGradientEntry& rBack(getGradientEntries().back());
-                    const SvgGradientEntry aTemp(fEnd, rBack.getColor(), 
rBack.getOpacity());
-                    createAtom(rTargetColor, rTargetOpacity, rBack, aTemp, 0, 
0);
-                    fEnd = rBack.getOffset();
+                    // change fEnd early, but create geometry later (after 
range below)
+                    fEnd2 = fEnd;
+                    fEnd = getGradientEntries().back().getOffset();
                 }
             }
 
             while(fStart < fEnd)
             {
-                double fInt(0.0);
-                double fFrac(std::modf(fStart, &fInt));
+                fFrac = std::modf(fStart, &fInt);
 
                 if(fFrac < 0.0)
                 {
@@ -289,6 +292,15 @@ namespace drawinglayer::primitive2d
                     fStart += 1.0;
                 }
             }
+
+            if(fEnd2 > 1.0)
+            {
+                // create end run for SpreadMethod::Pad late to keep correct 
creation order
+                fFrac = std::modf(fEnd2, &fInt);
+                const SvgGradientEntry& rBack(getGradientEntries().back());
+                const SvgGradientEntry aTemp(fFrac, rBack.getColor(), 
rBack.getOpacity());
+                createAtom(rTargetColor, rTargetOpacity, rBack, aTemp, 0, 
static_cast<sal_Int32>(fInt));
+            }
         }
 
         void SvgGradientHelper::createResult(
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to