[poppler] Branch 'xpdf303merge' - fofi/FoFiTrueType.cc poppler/GfxFont.cc splash/SplashScreen.cc splash/SplashXPath.cc

Carlos Garcia Campos carlosgc at kemper.freedesktop.org
Tue Aug 30 07:24:53 PDT 2011


 fofi/FoFiTrueType.cc   |   55 ++++++++++++++++++++++---------------------------
 poppler/GfxFont.cc     |   24 ++++++++++++++-------
 splash/SplashScreen.cc |   12 +++++++---
 splash/SplashXPath.cc  |   44 +++++++++++++++++----------------------
 4 files changed, 69 insertions(+), 66 deletions(-)

New commits:
commit 1df3489392a77e2b75adbafcc2fa10de829c172e
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Tue Aug 30 16:21:40 2011 +0200

    xpdf303: Use std::sort (with functors) in place of qsort
    
    It can be significantly faster. Not included changes in
    SplashXPathScanner.cc since they depend on other changes not yet merged.

diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc
index 4793acf..79d2fe2 100644
--- a/fofi/FoFiTrueType.cc
+++ b/fofi/FoFiTrueType.cc
@@ -32,6 +32,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <algorithm>
 #include "goo/gtypes.h"
 #include "goo/gmem.h"
 #include "goo/GooString.h"
@@ -137,29 +138,26 @@ struct TrueTypeLoca {
 #define vrt2Tag 0x76727432
 #define vertTag 0x76657274
 
-static int cmpTrueTypeLocaOffset(const void *p1, const void *p2) {
-  TrueTypeLoca *loca1 = (TrueTypeLoca *)p1;
-  TrueTypeLoca *loca2 = (TrueTypeLoca *)p2;
-
-  if (loca1->origOffset == loca2->origOffset) {
-    return loca1->idx - loca2->idx;
+struct cmpTrueTypeLocaOffsetFunctor {
+  bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) {
+    if (loca1.origOffset == loca2.origOffset) {
+      return loca1.idx < loca2.idx;
+    }
+    return loca1.origOffset < loca2.origOffset;
   }
-  return loca1->origOffset - loca2->origOffset;
-}
-
-static int cmpTrueTypeLocaIdx(const void *p1, const void *p2) {
-  TrueTypeLoca *loca1 = (TrueTypeLoca *)p1;
-  TrueTypeLoca *loca2 = (TrueTypeLoca *)p2;
-
-  return loca1->idx - loca2->idx;
-}
+};
 
-static int cmpTrueTypeTableTag(const void *p1, const void *p2) {
-  TrueTypeTable *tab1 = (TrueTypeTable *)p1;
-  TrueTypeTable *tab2 = (TrueTypeTable *)p2;
+struct cmpTrueTypeLocaIdxFunctor {
+  bool operator()(const TrueTypeLoca &loca1, const TrueTypeLoca &loca2) {
+    return loca1.idx < loca2.idx;
+  }
+};
 
-  return (int)tab1->tag - (int)tab2->tag;
-}
+struct cmpTrueTypeTableTagFunctor {
+  bool operator()(const TrueTypeTable &tab1, const TrueTypeTable &tab2) {
+    return tab1.tag < tab2.tag;
+  }
+};
 
 //------------------------------------------------------------------------
 
@@ -997,14 +995,13 @@ void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc,
   // the same pos value remain in the same order)
   glyfLen = 0; // make gcc happy
   if (unsortedLoca) {
-    qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
-	  &cmpTrueTypeLocaOffset);
+    std::sort(locaTable, locaTable + nGlyphs + 1,
+	      cmpTrueTypeLocaOffsetFunctor());
     for (i = 0; i < nGlyphs; ++i) {
       locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
     }
     locaTable[nGlyphs].len = 0;
-    qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
-	  &cmpTrueTypeLocaIdx);
+    std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor());
     pos = 0;
     for (i = 0; i <= nGlyphs; ++i) {
       locaTable[i].newOffset = pos;
@@ -1272,8 +1269,7 @@ void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc,
     newTables[j].len = sizeof(os2Tab);
     ++j;
   }
-  qsort(newTables, nNewTables, sizeof(TrueTypeTable),
-	&cmpTrueTypeTableTag);
+  std::sort(newTables, newTables + nNewTables, cmpTrueTypeTableTagFunctor());
   pos = 12 + nNewTables * 16;
   for (i = 0; i < nNewTables; ++i) {
     newTables[i].offset = pos;
@@ -1568,14 +1564,13 @@ void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
       locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
     }
   }
-  qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
-	&cmpTrueTypeLocaOffset);
+  std::sort(locaTable, locaTable + nGlyphs + 1,
+	    cmpTrueTypeLocaOffsetFunctor());
   for (i = 0; i < nGlyphs; ++i) {
     locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
   }
   locaTable[nGlyphs].len = 0;
-  qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
-	&cmpTrueTypeLocaIdx);
+  std::sort(locaTable, locaTable + nGlyphs + 1, cmpTrueTypeLocaIdxFunctor());
   pos = 0;
   for (i = 0; i <= nGlyphs; ++i) {
     locaTable[i].newOffset = pos;
diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc
index d77047d..f4ff78c 100644
--- a/poppler/GfxFont.cc
+++ b/poppler/GfxFont.cc
@@ -1307,13 +1307,19 @@ Dict *Gfx8BitFont::getResources() {
 // GfxCIDFont
 //------------------------------------------------------------------------
 
-static bool cmpWidthExcep(const GfxFontCIDWidthExcep &w1, const GfxFontCIDWidthExcep &w2) {
-  return w1.first < w2.first;
-}
+struct cmpWidthExcepFunctor {
+  bool operator()(const GfxFontCIDWidthExcep &w1,
+		  const GfxFontCIDWidthExcep &w2) {
+    return w1.first < w2.first;
+  }
+};
 
-static bool cmpWidthExcepV(const GfxFontCIDWidthExcepV &w1, const GfxFontCIDWidthExcepV &w2) {
-  return w1.first < w2.first;
-}
+struct cmpWidthExcepVFunctor {
+  bool operator()(const GfxFontCIDWidthExcepV &w1,
+		  const GfxFontCIDWidthExcepV &w2) {
+    return w1.first < w2.first;
+  }
+};
 
 GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
 		       Dict *fontDict):
@@ -1573,7 +1579,8 @@ GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
       obj3.free();
       obj2.free();
     }
-    std::sort(widths.exceps, widths.exceps + widths.nExceps, &cmpWidthExcep);
+    std::sort(widths.exceps, widths.exceps + widths.nExceps,
+	      cmpWidthExcepFunctor());
   }
   obj1.free();
 
@@ -1656,7 +1663,8 @@ GfxCIDFont::GfxCIDFont(XRef *xref, const char *tagA, Ref idA, GooString *nameA,
       obj3.free();
       obj2.free();
     }
-    std::sort(widths.excepsV, widths.excepsV + widths.nExcepsV, &cmpWidthExcepV);
+    std::sort(widths.excepsV, widths.excepsV + widths.nExcepsV,
+	      cmpWidthExcepVFunctor());
   }
   obj1.free();
 
diff --git a/splash/SplashScreen.cc b/splash/SplashScreen.cc
index 6b75c0c..40f2466 100644
--- a/splash/SplashScreen.cc
+++ b/splash/SplashScreen.cc
@@ -26,6 +26,7 @@
 
 #include <stdlib.h>
 #include <string.h>
+#include <algorithm>
 #include "goo/gmem.h"
 #include "SplashMath.h"
 #include "SplashScreen.h"
@@ -46,9 +47,12 @@ struct SplashScreenPoint {
   int dist;
 };
 
-static int cmpDistances(const void *p0, const void *p1) {
-  return ((SplashScreenPoint *)p0)->dist - ((SplashScreenPoint *)p1)->dist;
-}
+
+struct cmpDistancesFunctor {
+  bool operator()(const SplashScreenPoint &p0, const SplashScreenPoint &p1) {
+    return p0.dist < p1.dist;
+  }
+};
 
 //------------------------------------------------------------------------
 // SplashScreen
@@ -360,7 +364,7 @@ void SplashScreen::buildSCDMatrix(int r) {
 	}
       }
     }
-    qsort(pts, n, sizeof(SplashScreenPoint), &cmpDistances);
+    std::sort(pts, pts + n, cmpDistancesFunctor());
     for (j = 0; j < n; ++j) {
       // map values in [0 .. n-1] --> [255 .. 1]
       mat[pts[j].y * size + pts[j].x] = 255 - (254 * j) / (n - 1);
diff --git a/splash/SplashXPath.cc b/splash/SplashXPath.cc
index a896323..37d164d 100644
--- a/splash/SplashXPath.cc
+++ b/splash/SplashXPath.cc
@@ -412,31 +412,27 @@ void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0,
   ++length;
 }
 
-static bool cmpXPathSegs(const SplashXPathSeg &seg0, const SplashXPathSeg &seg1) {
-  SplashCoord x0, y0, x1, y1;
+struct cmpXPathSegsFunctor {
+  bool operator()(const SplashXPathSeg &seg0, const SplashXPathSeg &seg1) {
+    SplashCoord x0, y0, x1, y1;
 
-  if (seg0.flags & splashXPathFlip) {
-    x0 = seg0.x1;
-    y0 = seg0.y1;
-  } else {
-    x0 = seg0.x0;
-    y0 = seg0.y0;
-  }
-  if (seg1.flags & splashXPathFlip) {
-    x1 = seg1.x1;
-    y1 = seg1.y1;
-  } else {
-    x1 = seg1.x0;
-    y1 = seg1.y0;
-  }
-  if (y0 != y1) {
-    return (y0 < y1) ? true : false;
-  }
-  if (x0 != x1) {
-    return (x0 < x1) ? true : false;
+    if (seg0.flags & splashXPathFlip) {
+      x0 = seg0.x1;
+      y0 = seg0.y1;
+    } else {
+      x0 = seg0.x0;
+      y0 = seg0.y0;
+    }
+    if (seg1.flags & splashXPathFlip) {
+      x1 = seg1.x1;
+      y1 = seg1.y1;
+    } else {
+      x1 = seg1.x0;
+      y1 = seg1.y0;
+    }
+    return (y0 != y1) ? (y0 < y1) : (x0 < x1);
   }
-  return false;
-}
+};
 
 void SplashXPath::aaScale() {
   SplashXPathSeg *seg;
@@ -451,5 +447,5 @@ void SplashXPath::aaScale() {
 }
 
 void SplashXPath::sort() {
-  std::sort(segs, segs + length, &cmpXPathSegs);
+  std::sort(segs, segs + length, cmpXPathSegsFunctor());
 }


More information about the poppler mailing list