[poppler] splash/Splash.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Jan 2 14:00:03 UTC 2019


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

New commits:
commit 141405e0cc6aead0f2eed83f2f5834afa2b0dbe9
Author: Stefan BrĂ¼ns <stefan.bruens at rwth-aachen.de>
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;
 }


More information about the poppler mailing list