[poppler] 5 commits - splash/SplashFont.cc splash/SplashFontEngine.cc splash/SplashFontEngine.h splash/SplashFontFile.h splash/SplashFont.h splash/SplashFTFont.cc splash/SplashFTFontFile.cc splash/SplashFTFontFile.h splash/SplashFTFont.h

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Oct 4 23:30:21 UTC 2018


 splash/SplashFTFont.cc     |    2 
 splash/SplashFTFont.h      |    2 
 splash/SplashFTFontFile.cc |    2 
 splash/SplashFTFontFile.h  |    2 
 splash/SplashFont.cc       |    2 
 splash/SplashFont.h        |    4 -
 splash/SplashFontEngine.cc |  100 ++++++++++++++++++---------------------------
 splash/SplashFontEngine.h  |   10 +---
 splash/SplashFontFile.h    |    2 
 9 files changed, 52 insertions(+), 74 deletions(-)

New commits:
commit 3f08b610e4dbbbcb449e686d46360255efd78cfc
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Thu Sep 13 20:55:28 2018 +0200

    Fold the constant splashFontCacheSize
    
    As the cache is a std::array now, the constant is only used in a
    single location.  Hence there is no need to keep it as a separate
    name.

diff --git a/splash/SplashFontEngine.h b/splash/SplashFontEngine.h
index 193a1979..3e8a7545 100644
--- a/splash/SplashFontEngine.h
+++ b/splash/SplashFontEngine.h
@@ -45,10 +45,6 @@ class SplashFont;
 class SplashFontSrc;
 
 //------------------------------------------------------------------------
-
-#define splashFontCacheSize 16
-
-//------------------------------------------------------------------------
 // SplashFontEngine
 //------------------------------------------------------------------------
 
@@ -96,7 +92,7 @@ public:
 
 private:
 
-  std::array<SplashFont*,splashFontCacheSize> fontCache;
+  std::array<SplashFont*,16> fontCache;
 
   SplashFTFontEngine *ftEngine;
 };
commit a7ffcfe9612970bf37edb1a78480d357d7ecd62b
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Thu Sep 13 20:53:32 2018 +0200

    Reimplement the Splash font cache as a std::array
    
    std::find_if and std::rotate nicely replace the hand-written loops.

diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc
index df47176f..d9f5118c 100644
--- a/splash/SplashFontEngine.cc
+++ b/splash/SplashFontEngine.cc
@@ -36,6 +36,8 @@
 #ifdef HAVE_UNISTD_H
 #  include <unistd.h>
 #endif
+#include <algorithm>
+
 #include "goo/gmem.h"
 #include "goo/GooString.h"
 #include "SplashMath.h"
@@ -66,11 +68,7 @@ SplashFontEngine::SplashFontEngine(
 				   GBool enableFreeTypeHinting,
 				   GBool enableSlightHinting,
 				   GBool aa) {
-  int i;
-
-  for (i = 0; i < splashFontCacheSize; ++i) {
-    fontCache[i] = nullptr;
-  }
+  std::fill(fontCache.begin(), fontCache.end(), nullptr);
 
   if (enableFreeType) {
     ftEngine = SplashFTFontEngine::init(aa, enableFreeTypeHinting, enableSlightHinting);
@@ -80,12 +78,8 @@ SplashFontEngine::SplashFontEngine(
 }
 
 SplashFontEngine::~SplashFontEngine() {
-  int i;
-
-  for (i = 0; i < splashFontCacheSize; ++i) {
-    if (fontCache[i]) {
-      delete fontCache[i];
-    }
+  for (auto font : fontCache) {
+    delete font;
   }
 
   if (ftEngine) {
@@ -94,12 +88,9 @@ SplashFontEngine::~SplashFontEngine() {
 }
 
 SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) {
-  SplashFontFile *fontFile;
-  int i;
-
-  for (i = 0; i < splashFontCacheSize; ++i) {
-    if (fontCache[i]) {
-      fontFile = fontCache[i]->getFontFile();
+  for (auto font : fontCache) {
+    if (font) {
+      SplashFontFile *fontFile = font->getFontFile();
       if (fontFile && fontFile->getID()->matches(id)) {
 	return fontFile;
       }
@@ -243,8 +234,6 @@ SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
 				      const SplashCoord *textMat,
 				      const SplashCoord *ctm) {
   SplashCoord mat[4];
-  SplashFont *font;
-  int i, j;
 
   mat[0] = textMat[0] * ctm[0] + textMat[1] * ctm[2];
   mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]);
@@ -256,27 +245,24 @@ SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
     mat[2] = 0;     mat[3] = 0.01;
   }
 
-  font = fontCache[0];
-  if (font && font->matches(fontFile, mat, textMat)) {
-    return font;
-  }
-  for (i = 1; i < splashFontCacheSize; ++i) {
-    font = fontCache[i];
-    if (font && font->matches(fontFile, mat, textMat)) {
-      for (j = i; j > 0; --j) {
-	fontCache[j] = fontCache[j-1];
-      }
-      fontCache[0] = font;
-      return font;
-    }
-  }
-  font = fontFile->makeFont(mat, textMat);
-  if (fontCache[splashFontCacheSize - 1]) {
-    delete fontCache[splashFontCacheSize - 1];
+  // Try to find the font in the cache
+  auto fontIt = std::find_if(fontCache.begin(), fontCache.end(),
+                             [&](const SplashFont* font){return font && font->matches(fontFile, mat, textMat);}
+                            );
+
+  // The requested font has been found in the cache
+  if (fontIt != fontCache.end()) {
+    std::rotate(fontCache.begin(), fontIt, fontIt+1);
+    return fontCache[0];
   }
-  for (j = splashFontCacheSize - 1; j > 0; --j) {
-    fontCache[j] = fontCache[j-1];
+
+  // The requested font has not been found in the cache
+  auto newFont = fontFile->makeFont(mat, textMat);
+  if (fontCache.back()) {
+    delete fontCache.back();
   }
-  fontCache[0] = font;
-  return font;
+  std::rotate(fontCache.begin(), fontCache.end()-1, fontCache.end());
+
+  fontCache[0] = newFont;
+  return fontCache[0];
 }
diff --git a/splash/SplashFontEngine.h b/splash/SplashFontEngine.h
index ae96a9b1..193a1979 100644
--- a/splash/SplashFontEngine.h
+++ b/splash/SplashFontEngine.h
@@ -30,6 +30,8 @@
 #pragma interface
 #endif
 
+#include <array>
+
 #include "goo/gtypes.h"
 #include "SplashTypes.h"
 
@@ -94,7 +96,7 @@ public:
 
 private:
 
-  SplashFont *fontCache[splashFontCacheSize];
+  std::array<SplashFont*,splashFontCacheSize> fontCache;
 
   SplashFTFontEngine *ftEngine;
 };
commit 588d96b572a28e5b0bef55e152d134b62818f85a
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Wed Sep 12 21:34:12 2018 +0200

    Make SplashFont::matches a const method

diff --git a/splash/SplashFont.h b/splash/SplashFont.h
index 2bc5a8a1..ab3de8f1 100644
--- a/splash/SplashFont.h
+++ b/splash/SplashFont.h
@@ -66,7 +66,7 @@ public:
 
   // Return true if <this> matches the specified font file and matrix.
   GBool matches(SplashFontFile *fontFileA, SplashCoord *matA,
-		const SplashCoord *textMatA) {
+		const SplashCoord *textMatA) const {
     return fontFileA == fontFile &&
            matA[0] == mat[0] && matA[1] == mat[1] &&
            matA[2] == mat[2] && matA[3] == mat[3] &&
commit d248d3e59165824ca5279db4c451d63f762f1ac3
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Wed Sep 12 16:17:41 2018 +0200

    Make a few pointer arguments const
    
    This increases code legibility, if nothing else.

diff --git a/splash/SplashFTFont.cc b/splash/SplashFTFont.cc
index 2432811d..505b66a1 100644
--- a/splash/SplashFTFont.cc
+++ b/splash/SplashFTFont.cc
@@ -58,7 +58,7 @@ static int glyphPathCubicTo(const FT_Vector *ctrl1, const FT_Vector *ctrl2,
 //------------------------------------------------------------------------
 
 SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA,
-			   SplashCoord *textMatA):
+			   const SplashCoord *textMatA):
   SplashFont(fontFileA, matA, textMatA, fontFileA->engine->aa), 
   textScale(0),
   enableFreeTypeHinting(fontFileA->engine->enableFreeTypeHinting),
diff --git a/splash/SplashFTFont.h b/splash/SplashFTFont.h
index 44e1fc6b..5a6ae90e 100644
--- a/splash/SplashFTFont.h
+++ b/splash/SplashFTFont.h
@@ -44,7 +44,7 @@ class SplashFTFont: public SplashFont {
 public:
 
   SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA,
-	       SplashCoord *textMatA);
+	       const SplashCoord *textMatA);
 
   virtual ~SplashFTFont();
 
diff --git a/splash/SplashFTFontFile.cc b/splash/SplashFTFontFile.cc
index 7fb22be9..91b627c2 100644
--- a/splash/SplashFTFontFile.cc
+++ b/splash/SplashFTFontFile.cc
@@ -137,7 +137,7 @@ SplashFTFontFile::~SplashFTFontFile() {
 }
 
 SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat,
-				       SplashCoord *textMat) {
+				       const SplashCoord *textMat) {
   SplashFont *font;
 
   font = new SplashFTFont(this, mat, textMat);
diff --git a/splash/SplashFTFontFile.h b/splash/SplashFTFontFile.h
index 5931be3f..3ff8ff71 100644
--- a/splash/SplashFTFontFile.h
+++ b/splash/SplashFTFontFile.h
@@ -60,7 +60,7 @@ public:
   // Create a new SplashFTFont, i.e., a scaled instance of this font
   // file.
   SplashFont *makeFont(SplashCoord *mat,
-		       SplashCoord *textMat) override;
+		       const SplashCoord *textMat) override;
 
   // Provide access to the code-to-GID map
   int* getCodeToGID();
diff --git a/splash/SplashFont.cc b/splash/SplashFont.cc
index 261aa419..4f3aedf5 100644
--- a/splash/SplashFont.cc
+++ b/splash/SplashFont.cc
@@ -46,7 +46,7 @@ struct SplashFontCacheTag {
 //------------------------------------------------------------------------
 
 SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
-		       SplashCoord *textMatA, GBool aaA) {
+		       const SplashCoord *textMatA, GBool aaA) {
   fontFile = fontFileA;
   fontFile->incRefCnt();
   mat[0] = matA[0];
diff --git a/splash/SplashFont.h b/splash/SplashFont.h
index f8e72626..2bc5a8a1 100644
--- a/splash/SplashFont.h
+++ b/splash/SplashFont.h
@@ -51,7 +51,7 @@ class SplashFont {
 public:
 
   SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
-	     SplashCoord *textMatA, GBool aaA);
+	     const SplashCoord *textMatA, GBool aaA);
 
   // This must be called after the constructor, so that the subclass
   // constructor has a chance to compute the bbox.
@@ -66,7 +66,7 @@ public:
 
   // Return true if <this> matches the specified font file and matrix.
   GBool matches(SplashFontFile *fontFileA, SplashCoord *matA,
-		SplashCoord *textMatA) {
+		const SplashCoord *textMatA) {
     return fontFileA == fontFile &&
            matA[0] == mat[0] && matA[1] == mat[1] &&
            matA[2] == mat[2] && matA[3] == mat[3] &&
diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc
index 17549c85..df47176f 100644
--- a/splash/SplashFontEngine.cc
+++ b/splash/SplashFontEngine.cc
@@ -240,8 +240,8 @@ void SplashFontEngine::setAA(GBool aa) {
 }
 
 SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
-				      SplashCoord *textMat,
-				      SplashCoord *ctm) {
+				      const SplashCoord *textMat,
+				      const SplashCoord *ctm) {
   SplashCoord mat[4];
   SplashFont *font;
   int i, j;
diff --git a/splash/SplashFontEngine.h b/splash/SplashFontEngine.h
index 346d3697..ae96a9b1 100644
--- a/splash/SplashFontEngine.h
+++ b/splash/SplashFontEngine.h
@@ -88,7 +88,7 @@ public:
   //    [x' y'] = [x y] * mat
   // Note that the Splash y axis points downward.
   SplashFont *getFont(SplashFontFile *fontFile,
-		      SplashCoord *textMat, SplashCoord *ctm);
+		      const SplashCoord *textMat, const SplashCoord *ctm);
   GBool getAA();
   void setAA(GBool aa);
 
diff --git a/splash/SplashFontFile.h b/splash/SplashFontFile.h
index d5291519..f76538f0 100644
--- a/splash/SplashFontFile.h
+++ b/splash/SplashFontFile.h
@@ -73,7 +73,7 @@ public:
 
   // Create a new SplashFont, i.e., a scaled instance of this font
   // file.
-  virtual SplashFont *makeFont(SplashCoord *mat, SplashCoord *textMat) = 0;
+  virtual SplashFont *makeFont(SplashCoord *mat, const SplashCoord *textMat) = 0;
 
   // Get the font file ID.
   SplashFontFileID *getID() { return id; }
commit 1243d28214471444333ea1972616ffb8c8926952
Author: Oliver Sander <oliver.sander at tu-dresden.de>
Date:   Wed Sep 12 16:02:43 2018 +0200

    Minor simplification of font-loading logic
    
    If a pointer is explicitly set to nullptr, there is no
    need to test whether it really is nullptr in the very
    next line.

diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc
index bebe36c2..17549c85 100644
--- a/splash/SplashFontEngine.cc
+++ b/splash/SplashFontEngine.cc
@@ -111,10 +111,9 @@ SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) {
 SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
 						SplashFontSrc *src,
 						const char **enc) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadType1Font(idA, src, enc);
   }
 
@@ -131,10 +130,9 @@ SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
 SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
 						 SplashFontSrc *src,
 						 const char **enc) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadType1CFont(idA, src, enc);
   }
 
@@ -151,10 +149,9 @@ SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
 SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA,
 						      SplashFontSrc *src,
 						      const char **enc) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadOpenTypeT1CFont(idA, src, enc);
   }
 
@@ -170,10 +167,9 @@ SplashFontFile *SplashFontEngine::loadOpenTypeT1CFont(SplashFontFileID *idA,
 
 SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
 					      SplashFontSrc *src) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadCIDFont(idA, src);
   }
 
@@ -191,10 +187,9 @@ SplashFontFile *SplashFontEngine::loadOpenTypeCFFFont(SplashFontFileID *idA,
 						      SplashFontSrc *src,
                                                       int *codeToGID,
                                                       int codeToGIDLen) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadOpenTypeCFFFont(idA, src, codeToGID, codeToGIDLen);
   }
 
@@ -213,10 +208,9 @@ SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
 						   int *codeToGID,
 						   int codeToGIDLen,
 						   int faceIndex) {
-  SplashFontFile *fontFile;
+  SplashFontFile *fontFile = nullptr;
 
-  fontFile = nullptr;
-  if (!fontFile && ftEngine) {
+  if (ftEngine) {
     fontFile = ftEngine->loadTrueTypeFont(idA, src,
                                         codeToGID, codeToGIDLen, faceIndex);
   }


More information about the poppler mailing list