splash/Splash.cc |   37 +++++++++++++++----------------------
 1 file changed, 15 insertions(+), 22 deletions(-)

New commits:
commit 141405e0cc6aead0f2eed83f2f5834afa2b0dbe9
Author: Stefan BrĂ¼ns <[email protected]>
Date:   Wed Aug 29 00:16:02 2018 +0200

    Allocate SplashXPathScanner on the stack
    
    SplashXPathScanner is only used inside the each fill function, but newer
    passed to the outside. As it is small, there is no reason to not
    allocate it on the stack.

diff --git a/splash/Splash.cc b/splash/Splash.cc
index 483ace4f..33efa83c 100644
--- a/splash/Splash.cc
+++ b/splash/Splash.cc
@@ -2488,7 +2488,6 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
                                    SplashPattern *pattern,
                                    SplashCoord alpha) {
   SplashPipe pipe = {};
-  SplashXPathScanner *scanner;
   int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
   SplashClipResult clipRes, clipRes2;
   bool adjustLine = false; 
@@ -2553,13 +2552,13 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
     yMinI = yMinI * splashAASize;
     yMaxI = (yMaxI + 1) * splashAASize - 1;
   }
-  scanner = new SplashXPathScanner(&xPath, eo, yMinI, yMaxI);
+  SplashXPathScanner scanner(&xPath, eo, yMinI, yMaxI);
 
   // get the min and max x and y values
   if (vectorAntialias && !inShading) {
-    scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
+    scanner.getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
   } else {
-    scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
+    scanner.getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
   }
 
   if (eo && (yMinI == yMaxI || xMinI == xMaxI) && thinLineMode != 
splashThinLineDefault) {
@@ -2568,7 +2567,6 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
     delta = (yMinI == yMaxI) ? yMaxFP - yMinFP : xMaxFP - xMinFP;
     if (delta < 0.2) {
       opClipRes = splashClipAllOutside;
-      delete scanner;
       return splashOk;
     }
   }
@@ -2576,7 +2574,7 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
   // check clipping
   if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
       != splashClipAllOutside) {
-    if (scanner->hasPartialClip()) {
+    if (scanner.hasPartialClip()) {
       clipRes = splashClipPartial;
     }
 
@@ -2586,7 +2584,7 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
     // draw the spans
     if (vectorAntialias && !inShading) {
       for (y = yMinI; y <= yMaxI; ++y) {
-       scanner->renderAALine(aaBuf, &x0, &x1, y, thinLineMode != 
splashThinLineDefault && xMinI == xMaxI);
+       scanner.renderAALine(aaBuf, &x0, &x1, y, thinLineMode != 
splashThinLineDefault && xMinI == xMaxI);
        if (clipRes != splashClipAllInside) {
          state->clip->clipAALine(aaBuf, &x0, &x1, y, thinLineMode != 
splashThinLineDefault && xMinI == xMaxI);
        }
@@ -2604,7 +2602,7 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
       }
     } else {
       for (y = yMinI; y <= yMaxI; ++y) {
-       SplashXPathScanIterator iterator(*scanner, y);
+       SplashXPathScanIterator iterator(scanner, y);
        while (iterator.getNextSpan(&x0, &x1)) {
          if (clipRes == splashClipAllInside) {
            drawSpan(&pipe, x0, x1, y, true);
@@ -2625,7 +2623,6 @@ SplashError Splash::fillWithPattern(SplashPath *path, 
bool eo,
   }
   opClipRes = clipRes;
 
-  delete scanner;
   return splashOk;
 }
 
@@ -2698,7 +2695,6 @@ bool Splash::pathAllOutside(SplashPath *path) {
 
 SplashError Splash::xorFill(SplashPath *path, bool eo) {
   SplashPipe pipe;
-  SplashXPathScanner *scanner;
   int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
   SplashClipResult clipRes, clipRes2;
   SplashBlendFunc origBlendFunc;
@@ -2708,16 +2704,16 @@ SplashError Splash::xorFill(SplashPath *path, bool eo) {
   }
   SplashXPath xPath(path, state->matrix, state->flatness, true);
   xPath.sort();
-  scanner = new SplashXPathScanner(&xPath, eo, state->clip->getYMinI(),
+  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);
+  scanner.getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
 
   // check clipping
   if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
       != splashClipAllOutside) {
-    if (scanner->hasPartialClip()) {
+    if (scanner.hasPartialClip()) {
       clipRes = splashClipPartial;
     }
 
@@ -2727,7 +2723,7 @@ SplashError Splash::xorFill(SplashPath *path, bool eo) {
 
     // draw the spans
     for (y = yMinI; y <= yMaxI; ++y) {
-      SplashXPathScanIterator iterator(*scanner, y);
+      SplashXPathScanIterator iterator(scanner, y);
       while (iterator.getNextSpan(&x0, &x1)) {
        if (clipRes == splashClipAllInside) {
          drawSpan(&pipe, x0, x1, y, true);
@@ -2748,7 +2744,6 @@ SplashError Splash::xorFill(SplashPath *path, bool eo) {
   }
   opClipRes = clipRes;
 
-  delete scanner;
   return splashOk;
 }
 
@@ -6395,7 +6390,6 @@ void Splash::dumpXPath(SplashXPath *path) {
 SplashError Splash::shadedFill(SplashPath *path, bool hasBBox,
                                SplashPattern *pattern) {
   SplashPipe pipe;
-  SplashXPathScanner *scanner;
   int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
   SplashClipResult clipRes;
 
@@ -6416,13 +6410,13 @@ SplashError Splash::shadedFill(SplashPath *path, bool 
hasBBox,
     yMinI = yMinI * splashAASize;
     yMaxI = (yMaxI + 1) * splashAASize - 1;
   }
-  scanner = new SplashXPathScanner(&xPath, false, yMinI, yMaxI);
+  SplashXPathScanner scanner(&xPath, false, yMinI, yMaxI);
 
   // get the min and max x and y values
   if (vectorAntialias) {
-    scanner->getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
+    scanner.getBBoxAA(&xMinI, &yMinI, &xMaxI, &yMaxI);
   } else {
-    scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
+    scanner.getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
   }
 
   // check clipping
@@ -6440,7 +6434,7 @@ SplashError Splash::shadedFill(SplashPath *path, bool 
hasBBox,
     // draw the spans
     if (vectorAntialias) {
       for (y = yMinI; y <= yMaxI; ++y) {
-        scanner->renderAALine(aaBuf, &x0, &x1, y);
+        scanner.renderAALine(aaBuf, &x0, &x1, y);
         if (clipRes != splashClipAllInside) {
           state->clip->clipAALine(aaBuf, &x0, &x1, y);
         }
@@ -6498,7 +6492,7 @@ SplashError Splash::shadedFill(SplashPath *path, bool 
hasBBox,
     } else {
       SplashClipResult clipRes2;
       for (y = yMinI; y <= yMaxI; ++y) {
-        SplashXPathScanIterator iterator(*scanner, y);
+        SplashXPathScanIterator iterator(scanner, y);
         while (iterator.getNextSpan(&x0, &x1)) {
           if (clipRes == splashClipAllInside) {
             drawSpan(&pipe, x0, x1, y, true);
@@ -6519,6 +6513,5 @@ SplashError Splash::shadedFill(SplashPath *path, bool 
hasBBox,
   }
   opClipRes = clipRes;
 
-  delete scanner;
   return splashOk;
 }
_______________________________________________
poppler mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to