freetype-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[freetype2-demos] master 00d5ce5: [ftinspect] Make hinting mode selectio


From: Werner LEMBERG
Subject: [freetype2-demos] master 00d5ce5: [ftinspect] Make hinting mode selection work.
Date: Tue, 10 May 2016 07:01:27 +0000 (UTC)

branch: master
commit 00d5ce5bc68e5b8c96b58283214571d09e5038bd
Author: Werner Lemberg <address@hidden>
Commit: Werner Lemberg <address@hidden>

    [ftinspect] Make hinting mode selection work.
    
    * src/ftinspect.cpp (Engine::loadFont): Set font type.
    (Engine::setCFFHintingMode, Engine::setTTInterpreterVersion): New
    methods.
    (MainGUI::showFont): Updated.
    (MainGUI::checkHinting): Gray out hinting mode combo box items
    depending on font type.
    (MainGUI::checkHintingMode): Implemented.
    (MainGUI::checkAutoHinting): Updated.
    (MainGUI::setDefaults): Updated.
    
    * src/ftinspect.h: Include some internal FreeType header files.
    (Engine): New member `fontType'.
    New enumeration `FontType'.
    Updated.
    (MainGUI): New members `currentCFFHintingMode' and
    `currentTTInterpreterVersion'.
    
    * ftinspect.pro (DEFINES): Add `FT2_BUILD_LIBRARY' to enable access
    to internal FreeType headers.
---
 ChangeLog         |   24 ++++++++++++
 src/ftinspect.cpp |  113 +++++++++++++++++++++++++++++++++++++++++++++++++++--
 src/ftinspect.h   |   21 +++++++++-
 src/ftinspect.pro |    3 ++
 4 files changed, 156 insertions(+), 5 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 1fb61b0..ef9c951 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,29 @@
 2016-05-10  Werner Lemberg  <address@hidden>
 
+       [ftinspect] Make hinting mode selection work.
+
+       * src/ftinspect.cpp (Engine::loadFont): Set font type.
+       (Engine::setCFFHintingMode, Engine::setTTInterpreterVersion): New
+       methods.
+       (MainGUI::showFont): Updated.
+       (MainGUI::checkHinting): Gray out hinting mode combo box items
+       depending on font type.
+       (MainGUI::checkHintingMode): Implemented.
+       (MainGUI::checkAutoHinting): Updated.
+       (MainGUI::setDefaults): Updated.
+
+       * src/ftinspect.h: Include some internal FreeType header files.
+       (Engine): New member `fontType'.
+       New enumeration `FontType'.
+       Updated.
+       (MainGUI): New members `currentCFFHintingMode' and
+       `currentTTInterpreterVersion'.
+
+       * ftinspect.pro (DEFINES): Add `FT2_BUILD_LIBRARY' to enable access
+       to internal FreeType headers.
+
+2016-05-10  Werner Lemberg  <address@hidden>
+
        [ftinspect] Minor.
 
        * src/ftinspect.cpp, src/ftinspect.h: Rename `point indices' to
diff --git a/src/ftinspect.cpp b/src/ftinspect.cpp
index 30942c5..5713e72 100644
--- a/src/ftinspect.cpp
+++ b/src/ftinspect.cpp
@@ -313,6 +313,8 @@ Engine::loadFont(int fontIndex,
 {
   update();
 
+  fontType = FontType_Other;
+
   scaler.face_id = reinterpret_cast<void*>
                      (gui->faceIDHash.value(FaceID(fontIndex,
                                                    faceIndex,
@@ -330,6 +332,14 @@ Engine::loadFont(int fontIndex,
     return -1;
   }
 
+  FT_Module module = &ftSize->face->driver->root;
+
+  // XXX cover all available modules
+  if (!strcmp(module->clazz->module_name, "cff"))
+    fontType = FontType_CFF;
+  else if (!strcmp(module->clazz->module_name, "truetype"))
+    fontType = FontType_TrueType;
+
   return ftSize->face->num_glyphs;
 }
 
@@ -380,6 +390,40 @@ Engine::loadOutline(int glyphIndex)
 
 
 void
+Engine::setCFFHintingMode(int mode)
+{
+  int index = gui->hintingModesCFFHash.key(mode);
+
+  FT_Error error = FT_Property_Set(library,
+                                   "cff",
+                                   "hinting-engine",
+                                   &index);
+  if (!error)
+  {
+    // reset the cache
+    FTC_Manager_Reset(cacheManager);
+  }
+}
+
+
+void
+Engine::setTTInterpreterVersion(int mode)
+{
+  int index = gui->hintingModesTrueTypeHash.key(mode);
+
+  FT_Error error = FT_Property_Set(library,
+                                   "truetype",
+                                   "interpreter-version",
+                                   &index);
+  if (!error)
+  {
+    // reset the cache
+    FTC_Manager_Reset(cacheManager);
+  }
+}
+
+
+void
 Engine::update()
 {
   dpi = gui->dpiSpinBox->value();
@@ -1142,6 +1186,7 @@ MainGUI::showFont()
   checkCurrentFontIndex();
   checkCurrentFaceIndex();
   checkCurrentInstanceIndex();
+  checkHinting();
 
   drawGlyph();
 }
@@ -1152,6 +1197,40 @@ MainGUI::checkHinting()
 {
   if (hintingCheckBox->isChecked())
   {
+    if (engine->fontType == Engine::FontType_CFF)
+    {
+      for (int i = 0; i < hintingModeComboBoxx->count(); i++)
+      {
+        if (hintingModesCFFHash.key(i, -1) != -1)
+          hintingModeComboBoxx->setItemEnabled(i, true);
+        else
+          hintingModeComboBoxx->setItemEnabled(i, false);
+      }
+
+      hintingModeComboBoxx->setCurrentIndex(currentCFFHintingMode);
+    }
+    else if (engine->fontType == Engine::FontType_TrueType)
+    {
+      for (int i = 0; i < hintingModeComboBoxx->count(); i++)
+      {
+        if (hintingModesTrueTypeHash.key(i, -1) != -1)
+          hintingModeComboBoxx->setItemEnabled(i, true);
+        else
+          hintingModeComboBoxx->setItemEnabled(i, false);
+      }
+
+      hintingModeComboBoxx->setCurrentIndex(currentTTInterpreterVersion);
+    }
+    else
+    {
+      hintingModeLabel->setEnabled(false);
+      hintingModeComboBoxx->setEnabled(false);
+    }
+
+    for (int i = 0; i < hintingModesAlwaysDisabled.size(); i++)
+      hintingModeComboBoxx->setItemEnabled(hintingModesAlwaysDisabled[i],
+                                           false);
+
     autoHintingCheckBox->setEnabled(true);
     checkAutoHinting();
   }
@@ -1169,6 +1248,8 @@ MainGUI::checkHinting()
 
     antiAliasingComboBoxx->setItemEnabled(AntiAliasing_Slight, false);
   }
+
+  drawGlyph();
 }
 
 
@@ -1177,7 +1258,19 @@ MainGUI::checkHintingMode()
 {
   int index = hintingModeComboBoxx->currentIndex();
 
-  // XXX to be completed
+  if (engine->fontType == Engine::FontType_CFF)
+  {
+    engine->setCFFHintingMode(index);
+    currentCFFHintingMode = index;
+  }
+  else if (engine->fontType == Engine::FontType_TrueType)
+  {
+    engine->setTTInterpreterVersion(index);
+    currentTTInterpreterVersion = index;
+  }
+
+  // this enforces reloading of the font
+  showFont();
 }
 
 
@@ -1200,8 +1293,12 @@ MainGUI::checkAutoHinting()
   }
   else
   {
-    hintingModeLabel->setEnabled(true);
-    hintingModeComboBoxx->setEnabled(true);
+    if (engine->fontType == Engine::FontType_CFF
+        || engine->fontType == Engine::FontType_TrueType)
+    {
+      hintingModeLabel->setEnabled(true);
+      hintingModeComboBoxx->setEnabled(true);
+    }
 
     horizontalHintingCheckBox->setEnabled(false);
     verticalHintingCheckBox->setEnabled(false);
@@ -1214,6 +1311,8 @@ MainGUI::checkAutoHinting()
     if (antiAliasingComboBoxx->currentIndex() == AntiAliasing_Slight)
       antiAliasingComboBoxx->setCurrentIndex(AntiAliasing_Normal);
   }
+
+  drawGlyph();
 }
 
 
@@ -1512,6 +1611,8 @@ MainGUI::setGraphicsDefaults()
 void
 MainGUI::drawGlyph()
 {
+  // the call to `engine->loadOutline' updates FreeType's load flags
+
   if (!engine)
     return;
 
@@ -2068,9 +2169,13 @@ MainGUI::setDefaults()
   currentNumGlyphs = -1;
   currentGlyphIndex = 0;
 
+  currentCFFHintingMode
+    = hintingModesCFFHash[engine->cffHintingEngineDefault];
+  currentTTInterpreterVersion
+    = hintingModesTrueTypeHash[engine->ttInterpreterVersionDefault];
+
   hintingCheckBox->setChecked(true);
 
-  hintingModeComboBoxx->setCurrentIndex(HintingMode_TrueType_v35);
   antiAliasingComboBoxx->setCurrentIndex(AntiAliasing_LCD);
   lcdFilterComboBox->setCurrentIndex(LCDFilter_Light);
 
diff --git a/src/ftinspect.h b/src/ftinspect.h
index 4b0711c..ac4a12e 100644
--- a/src/ftinspect.h
+++ b/src/ftinspect.h
@@ -12,6 +12,10 @@
 #include FT_OUTLINE_H
 #include FT_TRUETYPE_DRIVER_H
 
+// internal FreeType header files; only available in the source code bundle
+#include FT_INTERNAL_DRIVER_H
+#include FT_INTERNAL_OBJECTS_H
+
 #include <QAction>
 #include <QApplication>
 #include <QButtonGroup>
@@ -110,10 +114,20 @@ public:
   int loadFont(int, int, int); // returns number of glyphs
   FT_Outline* loadOutline(int);
   void removeFont(int, int, int);
+  void setCFFHintingMode(int);
+  void setTTInterpreterVersion(int);
   void update();
 
   friend class MainGUI;
 
+  // XXX cover all available modules
+  enum FontType
+  {
+    FontType_CFF,
+    FontType_TrueType,
+    FontType_Other
+  };
+
 private:
   MainGUI* gui;
 
@@ -132,6 +146,8 @@ private:
   int ttInterpreterVersionOther;
   int ttInterpreterVersionOther1;
 
+  int fontType;
+
   int haveWarping;
 
   double pointSize;
@@ -312,6 +328,9 @@ private:
   int faceCounter; // a running number used to initialize `faceIDHash'
   QHash<FaceID, int> faceIDHash;
 
+  int currentCFFHintingMode;
+  int currentTTInterpreterVersion;
+
   // layout related stuff
   GlyphOutline *currentGlyphOutlineItem;
   GlyphPoints *currentGlyphPointsItem;
@@ -437,7 +456,7 @@ private:
     AntiAliasing_LCD_Vertical,
     AntiAliasing_LCD_Vertical_BGR
   };
-  enum HintingModes
+  enum HintingMode
   {
     HintingMode_TrueType_v35,
     HintingMode_TrueType_v38,
diff --git a/src/ftinspect.pro b/src/ftinspect.pro
index 3ff8310..42dad6e 100644
--- a/src/ftinspect.pro
+++ b/src/ftinspect.pro
@@ -17,6 +17,9 @@ win32 {
 
 CONFIG += qt debug
 
+# we need access to internal FreeType header files
+DEFINES += FT2_BUILD_LIBRARY
+
 SOURCES += ftinspect.cpp
 HEADERS += ftinspect.h
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]