[poppler] splash/Splash.cc splash/SplashClip.cc splash/SplashClip.h splash/SplashXPath.cc splash/SplashXPath.h splash/SplashXPathScanner.cc splash/SplashXPathScanner.h

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Aug 27 11:48:28 UTC 2021


 splash/Splash.cc             |    6 ++---
 splash/SplashClip.cc         |   45 +++++++++++--------------------------------
 splash/SplashClip.h          |    1 
 splash/SplashXPath.cc        |    8 -------
 splash/SplashXPath.h         |    4 ---
 splash/SplashXPathScanner.cc |   20 +++++++++----------
 splash/SplashXPathScanner.h  |    4 +--
 7 files changed, 27 insertions(+), 61 deletions(-)

New commits:
commit 875be6054ff85261e254268a77cf47ebb9c539e9
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Aug 27 13:33:05 2021 +0200

    SplashClip: we don't need to keep the paths around
    
    Since we never used them for anything ^_^
    
    Saves yet another 40% in file from issue #1126

diff --git a/splash/Splash.cc b/splash/Splash.cc
index 3669874d..73fc9f7e 100644
--- a/splash/Splash.cc
+++ b/splash/Splash.cc
@@ -2367,7 +2367,7 @@ SplashError Splash::fillWithPattern(SplashPath *path, bool eo, SplashPattern *pa
         yMinI = yMinI * splashAASize;
         yMaxI = (yMaxI + 1) * splashAASize - 1;
     }
-    SplashXPathScanner scanner(&xPath, eo, yMinI, yMaxI);
+    SplashXPathScanner scanner(xPath, eo, yMinI, yMaxI);
 
     // get the min and max x and y values
     if (vectorAntialias && !inShading) {
@@ -2518,7 +2518,7 @@ SplashError Splash::xorFill(SplashPath *path, bool eo)
     }
     SplashXPath xPath(path, state->matrix, state->flatness, true);
     xPath.sort();
-    SplashXPathScanner scanner(&xPath, eo, state->clip->getYMinI(), state->clip->getYMaxI());
+    SplashXPathScanner scanner(xPath, eo, state->clip->getYMinI(), state->clip->getYMaxI());
 
     // get the min and max x and y values
     scanner.getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
@@ -6118,7 +6118,7 @@ SplashError Splash::shadedFill(SplashPath *path, bool hasBBox, SplashPattern *pa
         yMinI = yMinI * splashAASize;
         yMaxI = (yMaxI + 1) * splashAASize - 1;
     }
-    SplashXPathScanner scanner(&xPath, false, yMinI, yMaxI);
+    SplashXPathScanner scanner(xPath, false, yMinI, yMaxI);
 
     // get the min and max x and y values
     if (vectorAntialias) {
diff --git a/splash/SplashClip.cc b/splash/SplashClip.cc
index 3657f59f..0620c2c0 100644
--- a/splash/SplashClip.cc
+++ b/splash/SplashClip.cc
@@ -64,7 +64,6 @@ SplashClip::SplashClip(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoo
     yMinI = splashFloor(yMin);
     xMaxI = splashCeil(xMax) - 1;
     yMaxI = splashCeil(yMax) - 1;
-    paths = nullptr;
     flags = nullptr;
     length = size = 0;
 }
@@ -84,23 +83,15 @@ SplashClip::SplashClip(const SplashClip *clip)
     yMaxI = clip->yMaxI;
     length = clip->length;
     size = clip->size;
-    paths = (SplashXPath **)gmallocn(size, sizeof(SplashXPath *));
     flags = (unsigned char *)gmallocn(size, sizeof(unsigned char));
     scanners = clip->scanners;
     for (i = 0; i < length; ++i) {
-        paths[i] = clip->paths[i]->copy();
         flags[i] = clip->flags[i];
     }
 }
 
 SplashClip::~SplashClip()
 {
-    int i;
-
-    for (i = 0; i < length; ++i) {
-        delete paths[i];
-    }
-    gfree(paths);
     gfree(flags);
 }
 
@@ -113,21 +104,13 @@ void SplashClip::grow(int nPaths)
         while (size < length + nPaths) {
             size *= 2;
         }
-        paths = (SplashXPath **)greallocn(paths, size, sizeof(SplashXPath *));
         flags = (unsigned char *)greallocn(flags, size, sizeof(unsigned char));
     }
 }
 
 void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0, SplashCoord x1, SplashCoord y1)
 {
-    int i;
-
-    for (i = 0; i < length; ++i) {
-        delete paths[i];
-    }
-    gfree(paths);
     gfree(flags);
-    paths = nullptr;
     flags = nullptr;
     scanners = {};
     length = size = 0;
@@ -197,37 +180,33 @@ SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0, SplashCoord x
 
 SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord *matrix, SplashCoord flatness, bool eo)
 {
-    SplashXPath *xPath;
     int yMinAA, yMaxAA;
 
-    xPath = new SplashXPath(path, matrix, flatness, true);
+    SplashXPath xPath(path, matrix, flatness, true);
 
     // check for an empty path
-    if (xPath->length == 0) {
+    if (xPath.length == 0) {
         xMax = xMin - 1;
         yMax = yMin - 1;
         xMaxI = splashCeil(xMax) - 1;
         yMaxI = splashCeil(yMax) - 1;
-        delete xPath;
 
         // check for a rectangle
-    } else if (xPath->length == 4
-               && ((xPath->segs[0].x0 == xPath->segs[0].x1 && xPath->segs[0].x0 == xPath->segs[1].x0 && xPath->segs[0].x0 == xPath->segs[3].x1 && xPath->segs[2].x0 == xPath->segs[2].x1 && xPath->segs[2].x0 == xPath->segs[1].x1
-                    && xPath->segs[2].x0 == xPath->segs[3].x0 && xPath->segs[1].y0 == xPath->segs[1].y1 && xPath->segs[1].y0 == xPath->segs[0].y1 && xPath->segs[1].y0 == xPath->segs[2].y0 && xPath->segs[3].y0 == xPath->segs[3].y1
-                    && xPath->segs[3].y0 == xPath->segs[0].y0 && xPath->segs[3].y0 == xPath->segs[2].y1)
-                   || (xPath->segs[0].y0 == xPath->segs[0].y1 && xPath->segs[0].y0 == xPath->segs[1].y0 && xPath->segs[0].y0 == xPath->segs[3].y1 && xPath->segs[2].y0 == xPath->segs[2].y1 && xPath->segs[2].y0 == xPath->segs[1].y1
-                       && xPath->segs[2].y0 == xPath->segs[3].y0 && xPath->segs[1].x0 == xPath->segs[1].x1 && xPath->segs[1].x0 == xPath->segs[0].x1 && xPath->segs[1].x0 == xPath->segs[2].x0 && xPath->segs[3].x0 == xPath->segs[3].x1
-                       && xPath->segs[3].x0 == xPath->segs[0].x0 && xPath->segs[3].x0 == xPath->segs[2].x1))) {
-        clipToRect(xPath->segs[0].x0, xPath->segs[0].y0, xPath->segs[2].x0, xPath->segs[2].y0);
-        delete xPath;
+    } else if (xPath.length == 4
+               && ((xPath.segs[0].x0 == xPath.segs[0].x1 && xPath.segs[0].x0 == xPath.segs[1].x0 && xPath.segs[0].x0 == xPath.segs[3].x1 && xPath.segs[2].x0 == xPath.segs[2].x1 && xPath.segs[2].x0 == xPath.segs[1].x1
+                    && xPath.segs[2].x0 == xPath.segs[3].x0 && xPath.segs[1].y0 == xPath.segs[1].y1 && xPath.segs[1].y0 == xPath.segs[0].y1 && xPath.segs[1].y0 == xPath.segs[2].y0 && xPath.segs[3].y0 == xPath.segs[3].y1
+                    && xPath.segs[3].y0 == xPath.segs[0].y0 && xPath.segs[3].y0 == xPath.segs[2].y1)
+                   || (xPath.segs[0].y0 == xPath.segs[0].y1 && xPath.segs[0].y0 == xPath.segs[1].y0 && xPath.segs[0].y0 == xPath.segs[3].y1 && xPath.segs[2].y0 == xPath.segs[2].y1 && xPath.segs[2].y0 == xPath.segs[1].y1
+                       && xPath.segs[2].y0 == xPath.segs[3].y0 && xPath.segs[1].x0 == xPath.segs[1].x1 && xPath.segs[1].x0 == xPath.segs[0].x1 && xPath.segs[1].x0 == xPath.segs[2].x0 && xPath.segs[3].x0 == xPath.segs[3].x1
+                       && xPath.segs[3].x0 == xPath.segs[0].x0 && xPath.segs[3].x0 == xPath.segs[2].x1))) {
+        clipToRect(xPath.segs[0].x0, xPath.segs[0].y0, xPath.segs[2].x0, xPath.segs[2].y0);
 
     } else {
         grow(1);
         if (antialias) {
-            xPath->aaScale();
+            xPath.aaScale();
         }
-        xPath->sort();
-        paths[length] = xPath;
+        xPath.sort();
         flags[length] = eo ? splashClipEO : 0;
         if (antialias) {
             yMinAA = yMinI * splashAASize;
diff --git a/splash/SplashClip.h b/splash/SplashClip.h
index c98fe3ba..74dc616d 100644
--- a/splash/SplashClip.h
+++ b/splash/SplashClip.h
@@ -123,7 +123,6 @@ protected:
     bool antialias;
     SplashCoord xMin, yMin, xMax, yMax;
     int xMinI, yMinI, xMaxI, yMaxI;
-    SplashXPath **paths;
     unsigned char *flags;
     std::vector<std::shared_ptr<SplashXPathScanner>> scanners;
     int length, size;
diff --git a/splash/SplashXPath.cc b/splash/SplashXPath.cc
index 02f2f16d..895dddfb 100644
--- a/splash/SplashXPath.cc
+++ b/splash/SplashXPath.cc
@@ -242,14 +242,6 @@ void SplashXPath::strokeAdjust(SplashXPathAdjust *adjust, SplashCoord *xp, Splas
     }
 }
 
-SplashXPath::SplashXPath(const SplashXPath *xPath)
-{
-    length = xPath->length;
-    size = xPath->size;
-    segs = (SplashXPathSeg *)gmallocn(size, sizeof(SplashXPathSeg));
-    memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg));
-}
-
 SplashXPath::~SplashXPath()
 {
     gfree(segs);
diff --git a/splash/SplashXPath.h b/splash/SplashXPath.h
index a5bcd487..e59649fa 100644
--- a/splash/SplashXPath.h
+++ b/splash/SplashXPath.h
@@ -65,9 +65,6 @@ public:
     // subpaths.
     SplashXPath(SplashPath *path, SplashCoord *matrix, SplashCoord flatness, bool closeSubpaths, bool adjustLines = false, int linePosI = 0);
 
-    // Copy an expanded path.
-    SplashXPath *copy() const { return new SplashXPath(this); }
-
     ~SplashXPath();
 
     SplashXPath(const SplashXPath &) = delete;
@@ -81,7 +78,6 @@ public:
     void sort();
 
 protected:
-    SplashXPath(const SplashXPath *xPath);
     void transform(SplashCoord *matrix, SplashCoord xi, SplashCoord yi, SplashCoord *xo, SplashCoord *yo);
     void strokeAdjust(SplashXPathAdjust *adjust, SplashCoord *xp, SplashCoord *yp);
     void grow(int nSegs);
diff --git a/splash/SplashXPathScanner.cc b/splash/SplashXPathScanner.cc
index f9444d0d..e32fdb4f 100644
--- a/splash/SplashXPathScanner.cc
+++ b/splash/SplashXPathScanner.cc
@@ -38,9 +38,9 @@
 // SplashXPathScanner
 //------------------------------------------------------------------------
 
-SplashXPathScanner::SplashXPathScanner(const SplashXPath *xPath, bool eoA, int clipYMin, int clipYMax)
+SplashXPathScanner::SplashXPathScanner(const SplashXPath &xPath, bool eoA, int clipYMin, int clipYMax)
 {
-    SplashXPathSeg *seg;
+    const SplashXPathSeg *seg;
     SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP;
     int i;
 
@@ -50,8 +50,8 @@ SplashXPathScanner::SplashXPathScanner(const SplashXPath *xPath, bool eoA, int c
     // compute the bbox
     xMin = yMin = 1;
     xMax = yMax = 0;
-    if (xPath->length > 0) {
-        seg = &xPath->segs[0];
+    if (xPath.length > 0) {
+        seg = &xPath.segs[0];
         if (unlikely(std::isnan(seg->x0) || std::isnan(seg->x1) || std::isnan(seg->y0) || std::isnan(seg->y1))) {
             return;
         }
@@ -69,8 +69,8 @@ SplashXPathScanner::SplashXPathScanner(const SplashXPath *xPath, bool eoA, int c
             yMinFP = seg->y0;
             yMaxFP = seg->y1;
         }
-        for (i = 1; i < xPath->length; ++i) {
-            seg = &xPath->segs[i];
+        for (i = 1; i < xPath.length; ++i) {
+            seg = &xPath.segs[i];
             if (unlikely(std::isnan(seg->x0) || std::isnan(seg->x1) || std::isnan(seg->y0) || std::isnan(seg->y1))) {
                 return;
             }
@@ -224,9 +224,9 @@ SplashXPathScanIterator::SplashXPathScanIterator(const SplashXPathScanner &scann
     }
 }
 
-void SplashXPathScanner::computeIntersections(const SplashXPath *xPath)
+void SplashXPathScanner::computeIntersections(const SplashXPath &xPath)
 {
-    SplashXPathSeg *seg;
+    const SplashXPathSeg *seg;
     SplashCoord segXMin, segXMax, segYMin, segYMax, xx0, xx1;
     int x, y, y0, y1, i;
 
@@ -237,8 +237,8 @@ void SplashXPathScanner::computeIntersections(const SplashXPath *xPath)
     // build the list of all intersections
     allIntersections.resize(yMax - yMin + 1);
 
-    for (i = 0; i < xPath->length; ++i) {
-        seg = &xPath->segs[i];
+    for (i = 0; i < xPath.length; ++i) {
+        seg = &xPath.segs[i];
         if (seg->flags & splashXPathFlip) {
             segYMin = seg->y1;
             segYMax = seg->y0;
diff --git a/splash/SplashXPathScanner.h b/splash/SplashXPathScanner.h
index fc9c6a00..476e98c9 100644
--- a/splash/SplashXPathScanner.h
+++ b/splash/SplashXPathScanner.h
@@ -51,7 +51,7 @@ class SplashXPathScanner
 {
 public:
     // Create a new SplashXPathScanner object.  <xPathA> must be sorted.
-    SplashXPathScanner(const SplashXPath *xPath, bool eoA, int clipYMin, int clipYMax);
+    SplashXPathScanner(const SplashXPath &xPath, bool eoA, int clipYMin, int clipYMax);
 
     ~SplashXPathScanner();
 
@@ -94,7 +94,7 @@ public:
     void clipAALine(SplashBitmap *aaBuf, int *x0, int *x1, int y) const;
 
 private:
-    void computeIntersections(const SplashXPath *xPath);
+    void computeIntersections(const SplashXPath &xPath);
     bool addIntersection(double segYMin, double segYMax, int y, int x0, int x1, int count);
 
     bool eo;


More information about the poppler mailing list