[poppler] poppler/SplashOutputDev.cc splash/Splash.cc splash/Splash.h splash/SplashState.cc splash/SplashState.h

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Aug 6 23:16:09 UTC 2022


 poppler/SplashOutputDev.cc |    6 +++---
 splash/Splash.cc           |   35 ++++++++++++-----------------------
 splash/Splash.h            |    6 ++----
 splash/SplashState.cc      |   27 ++++-----------------------
 splash/SplashState.h       |    9 ++++-----
 5 files changed, 25 insertions(+), 58 deletions(-)

New commits:
commit 1abe4a246adc4b655b7e2bf9a00c537d8d360329
Author: Albert Astals Cid <aacid at kde.org>
Date:   Sat Aug 6 11:50:40 2022 +0200

    Save copying data in SplashState::setLineDash

diff --git a/poppler/SplashOutputDev.cc b/poppler/SplashOutputDev.cc
index c690b5d3..ac96db02 100644
--- a/poppler/SplashOutputDev.cc
+++ b/poppler/SplashOutputDev.cc
@@ -15,7 +15,7 @@
 //
 // Copyright (C) 2005 Takashi Iwai <tiwai at suse.de>
 // Copyright (C) 2006 Stefan Schweizer <genstef at gentoo.org>
-// Copyright (C) 2006-2021 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2006-2022 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk at gmail.com>
 // Copyright (C) 2006 Scott Turner <scotty1024 at mac.com>
 // Copyright (C) 2007 Koji Otani <sho at bbr.jp>
@@ -1404,7 +1404,7 @@ void SplashOutputDev::startPage(int pageNum, GfxState *state, XRef *xrefA)
     splash->setFillPattern(new SplashSolidColor(color));
     splash->setLineCap(splashLineCapButt);
     splash->setLineJoin(splashLineJoinMiter);
-    splash->setLineDash(nullptr, 0, 0);
+    splash->setLineDash({}, 0);
     splash->setMiterLimit(10);
     splash->setFlatness(1);
     // the SA parameter supposedly defaults to false, but Acrobat
@@ -1485,7 +1485,7 @@ void SplashOutputDev::updateLineDash(GfxState *state)
             dash[i] = 0;
         }
     }
-    splash->setLineDash(dash.data(), dashLength, (SplashCoord)dashStart);
+    splash->setLineDash(std::move(dash), (SplashCoord)dashStart);
 }
 
 void SplashOutputDev::updateFlatness(GfxState *state)
diff --git a/splash/Splash.cc b/splash/Splash.cc
index e3f6e9e9..aa5aaa38 100644
--- a/splash/Splash.cc
+++ b/splash/Splash.cc
@@ -1558,16 +1558,6 @@ SplashCoord Splash::getFlatness()
     return state->flatness;
 }
 
-SplashCoord *Splash::getLineDash()
-{
-    return state->lineDash;
-}
-
-int Splash::getLineDashLength()
-{
-    return state->lineDashLength;
-}
-
 SplashCoord Splash::getLineDashPhase()
 {
     return state->lineDashPhase;
@@ -1690,9 +1680,9 @@ void Splash::setFlatness(SplashCoord flatness)
     }
 }
 
-void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength, SplashCoord lineDashPhase)
+void Splash::setLineDash(std::vector<SplashCoord> &&lineDash, SplashCoord lineDashPhase)
 {
-    state->setLineDash(lineDash, lineDashLength, lineDashPhase);
+    state->setLineDash(std::move(lineDash), lineDashPhase);
 }
 
 void Splash::setStrokeAdjust(bool strokeAdjust)
@@ -1898,7 +1888,7 @@ SplashError Splash::stroke(SplashPath *path)
     SplashCoord d1, d2, t1, t2, w;
 
     if (debugMode) {
-        printf("stroke [dash:%d] [width:%.2f]:\n", state->lineDashLength, (double)state->lineWidth);
+        printf("stroke [dash:%ld] [width:%.2f]:\n", state->lineDash.size(), (double)state->lineWidth);
         dumpPath(path);
     }
     opClipRes = splashClipAllOutside;
@@ -1906,7 +1896,7 @@ SplashError Splash::stroke(SplashPath *path)
         return splashErrEmptyPath;
     }
     path2 = flattenPath(path, state->matrix, state->flatness);
-    if (state->lineDashLength > 0) {
+    if (!state->lineDash.empty()) {
         dPath = makeDashedPath(path2);
         delete path2;
         path2 = dPath;
@@ -2175,12 +2165,11 @@ SplashPath *Splash::makeDashedPath(SplashPath *path)
     SplashCoord lineDashStartPhase, lineDashDist, segLen;
     SplashCoord x0, y0, x1, y1, xa, ya;
     bool lineDashStartOn, lineDashOn, newPath;
-    int lineDashStartIdx, lineDashIdx;
     int i, j, k;
 
     lineDashTotal = 0;
-    for (i = 0; i < state->lineDashLength; ++i) {
-        lineDashTotal += state->lineDash[i];
+    for (SplashCoord dash : state->lineDash) {
+        lineDashTotal += dash;
     }
     // Acrobat simply draws nothing if the dash array is [0]
     if (lineDashTotal == 0) {
@@ -2190,14 +2179,14 @@ SplashPath *Splash::makeDashedPath(SplashPath *path)
     i = splashFloor(lineDashStartPhase / lineDashTotal);
     lineDashStartPhase -= (SplashCoord)i * lineDashTotal;
     lineDashStartOn = true;
-    lineDashStartIdx = 0;
+    size_t lineDashStartIdx = 0;
     if (lineDashStartPhase > 0) {
-        while (lineDashStartIdx < state->lineDashLength && lineDashStartPhase >= state->lineDash[lineDashStartIdx]) {
+        while (lineDashStartIdx < state->lineDash.size() && lineDashStartPhase >= state->lineDash[lineDashStartIdx]) {
             lineDashStartOn = !lineDashStartOn;
             lineDashStartPhase -= state->lineDash[lineDashStartIdx];
             ++lineDashStartIdx;
         }
-        if (unlikely(lineDashStartIdx == state->lineDashLength)) {
+        if (unlikely(lineDashStartIdx == state->lineDash.size())) {
             return new SplashPath();
         }
     }
@@ -2215,7 +2204,7 @@ SplashPath *Splash::makeDashedPath(SplashPath *path)
 
         // initialize the dash parameters
         lineDashOn = lineDashStartOn;
-        lineDashIdx = lineDashStartIdx;
+        size_t lineDashIdx = lineDashStartIdx;
         lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase;
 
         // process each segment of the subpath
@@ -2262,7 +2251,7 @@ SplashPath *Splash::makeDashedPath(SplashPath *path)
                 // get the next entry in the dash array
                 if (lineDashDist <= 0) {
                     lineDashOn = !lineDashOn;
-                    if (++lineDashIdx == state->lineDashLength) {
+                    if (++lineDashIdx == state->lineDash.size()) {
                         lineDashIdx = 0;
                     }
                     lineDashDist = state->lineDash[lineDashIdx];
@@ -5864,7 +5853,7 @@ SplashPath *Splash::makeStrokePath(SplashPath *path, SplashCoord w, bool flatten
 
     if (flatten) {
         pathIn = flattenPath(path, state->matrix, state->flatness);
-        if (state->lineDashLength > 0) {
+        if (!state->lineDash.empty()) {
             dashPath = makeDashedPath(pathIn);
             delete pathIn;
             pathIn = dashPath;
diff --git a/splash/Splash.h b/splash/Splash.h
index 68f27ae6..e13be54c 100644
--- a/splash/Splash.h
+++ b/splash/Splash.h
@@ -12,7 +12,7 @@
 // under GPL version 2 or later
 //
 // Copyright (C) 2005 Marco Pesenti Gritti <mpg at redhat.com>
-// Copyright (C) 2007, 2011, 2018, 2019, 2021 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2007, 2011, 2018, 2019, 2021, 2022 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2010-2013, 2015 Thomas Freitag <Thomas.Freitag at alfa.de>
 // Copyright (C) 2010 Christian Feuersänger <cfeuersaenger at googlemail.com>
 // Copyright (C) 2012, 2017 Adrian Johnson <ajohnson at redneon.com>
@@ -105,8 +105,6 @@ public:
     int getLineJoin();
     SplashCoord getMiterLimit();
     SplashCoord getFlatness();
-    SplashCoord *getLineDash();
-    int getLineDashLength();
     SplashCoord getLineDashPhase();
     bool getStrokeAdjust();
     SplashClip *getClip();
@@ -133,7 +131,7 @@ public:
     void setMiterLimit(SplashCoord miterLimit);
     void setFlatness(SplashCoord flatness);
     // the <lineDash> array will be copied
-    void setLineDash(SplashCoord *lineDash, int lineDashLength, SplashCoord lineDashPhase);
+    void setLineDash(std::vector<SplashCoord> &&lineDash, SplashCoord lineDashPhase);
     void setStrokeAdjust(bool strokeAdjust);
     // NB: uses transformed coordinates.
     void clipResetToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1);
diff --git a/splash/SplashState.cc b/splash/SplashState.cc
index 89400d37..39f3c530 100644
--- a/splash/SplashState.cc
+++ b/splash/SplashState.cc
@@ -13,7 +13,7 @@
 //
 // Copyright (C) 2009, 2011, 2012, 2015 Thomas Freitag <Thomas.Freitag at alfa.de>
 // Copyright (C) 2017 Adrian Johnson <ajohnson at redneon.com>
-// Copyright (C) 2019, 2021 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2019, 2021, 2022 Albert Astals Cid <aacid at kde.org>
 // Copyright (C) 2020 Peter Wang <novalazy at gmail.com>
 //
 // To see a description of the changes please see the Changelog file that
@@ -64,8 +64,6 @@ SplashState::SplashState(int width, int height, bool vectorAntialias, SplashScre
     lineJoin = splashLineJoinMiter;
     miterLimit = 10;
     flatness = 1;
-    lineDash = nullptr;
-    lineDashLength = 0;
     lineDashPhase = 0;
     strokeAdjust = false;
     clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
@@ -119,8 +117,6 @@ SplashState::SplashState(int width, int height, bool vectorAntialias, SplashScre
     lineJoin = splashLineJoinMiter;
     miterLimit = 10;
     flatness = 1;
-    lineDash = nullptr;
-    lineDashLength = 0;
     lineDashPhase = 0;
     strokeAdjust = false;
     clip = new SplashClip(0, 0, width - 0.001, height - 0.001, vectorAntialias);
@@ -165,14 +161,7 @@ SplashState::SplashState(const SplashState *state)
     lineJoin = state->lineJoin;
     miterLimit = state->miterLimit;
     flatness = state->flatness;
-    if (state->lineDash) {
-        lineDashLength = state->lineDashLength;
-        lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
-        memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
-    } else {
-        lineDash = nullptr;
-        lineDashLength = 0;
-    }
+    lineDash = state->lineDash;
     lineDashPhase = state->lineDashPhase;
     strokeAdjust = state->strokeAdjust;
     clip = state->clip->copy();
@@ -203,7 +192,6 @@ SplashState::~SplashState()
     delete strokePattern;
     delete fillPattern;
     delete screen;
-    gfree(lineDash);
     delete clip;
     if (deleteSoftMask && softMask) {
         delete softMask;
@@ -228,16 +216,9 @@ void SplashState::setScreen(SplashScreen *screenA)
     screen = screenA;
 }
 
-void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA, SplashCoord lineDashPhaseA)
+void SplashState::setLineDash(std::vector<SplashCoord> &&lineDashA, SplashCoord lineDashPhaseA)
 {
-    gfree(lineDash);
-    lineDashLength = lineDashLengthA;
-    if (lineDashLength > 0) {
-        lineDash = (SplashCoord *)gmallocn(lineDashLength, sizeof(SplashCoord));
-        memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
-    } else {
-        lineDash = nullptr;
-    }
+    lineDash = lineDashA;
     lineDashPhase = lineDashPhaseA;
 }
 
diff --git a/splash/SplashState.h b/splash/SplashState.h
index a7e4f686..009c1f14 100644
--- a/splash/SplashState.h
+++ b/splash/SplashState.h
@@ -13,7 +13,7 @@
 //
 // Copyright (C) 2011, 2012, 2015 Thomas Freitag <Thomas.Freitag at alfa.de>
 // Copyright (C) 2017 Adrian Johnson <ajohnson at redneon.com>
-// Copyright (C) 2018, 2021 Albert Astals Cid <aacid at kde.org>
+// Copyright (C) 2018, 2021, 2022 Albert Astals Cid <aacid at kde.org>
 //
 // To see a description of the changes please see the Changelog file that
 // came with your tarball or type make ChangeLog if you are building from git
@@ -74,8 +74,8 @@ public:
     // Set the screen.  This does not copy <screenA>.
     void setScreen(SplashScreen *screenA);
 
-    // Set the line dash pattern.  This copies the <lineDashA> array.
-    void setLineDash(SplashCoord *lineDashA, int lineDashLengthA, SplashCoord lineDashPhaseA);
+    // Set the line dash pattern.
+    void setLineDash(std::vector<SplashCoord> &&lineDashA, SplashCoord lineDashPhaseA);
 
     // Set the soft mask bitmap.
     void setSoftMask(SplashBitmap *softMaskA);
@@ -106,8 +106,7 @@ private:
     int lineJoin;
     SplashCoord miterLimit;
     SplashCoord flatness;
-    SplashCoord *lineDash;
-    int lineDashLength;
+    std::vector<SplashCoord> lineDash;
     SplashCoord lineDashPhase;
     bool strokeAdjust;
     SplashClip *clip;


More information about the poppler mailing list