[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] master 00d5ce5: [ftinspect] Make hinting mode selection work.,
Werner LEMBERG <=