[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[freetype2-demos] ftinspect-ni f1dc438: [ftinspect] Fix named instances
From: |
Werner Lemberg |
Subject: |
[freetype2-demos] ftinspect-ni f1dc438: [ftinspect] Fix named instances switching. |
Date: |
Thu, 27 Apr 2023 00:21:29 -0400 (EDT) |
branch: ftinspect-ni
commit f1dc4381a020e6aff2d957fc0080ad2a922fef6c
Author: Charlie Jiang <w@chariri.moe>
Commit: Charlie Jiang <w@chariri.moe>
[ftinspect] Fix named instances switching.
* src/ftinspect/engine/mmgx.cpp, src/ftinspect/engine/mmgx.hpp:
Load the default values of MMGX axes from the named instance instead of
the global default one.
* src/ftinspect/engine/engine.cpp, src/ftinspect/engine/engine.hpp:
Switch the named instance using `FT_Set_Named_Instance` when loading
fonts.
---
src/ftinspect/engine/engine.cpp | 26 +++++++++++++++++++++++++-
src/ftinspect/engine/engine.hpp | 1 +
src/ftinspect/engine/mmgx.cpp | 10 +++++++++-
src/ftinspect/engine/mmgx.hpp | 1 +
4 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/src/ftinspect/engine/engine.cpp b/src/ftinspect/engine/engine.cpp
index 06ff845..e72e120 100644
--- a/src/ftinspect/engine/engine.cpp
+++ b/src/ftinspect/engine/engine.cpp
@@ -359,6 +359,8 @@ Engine::loadFont(int fontIndex,
else
fontType_ = FontType_Other;
+ switchNamedInstance(namedInstanceIndex);
+
curCharMaps_.clear();
curCharMaps_.reserve(ftFallbackFace_->num_charmaps);
for (int i = 0; i < ftFallbackFace_->num_charmaps; i++)
@@ -366,7 +368,8 @@ Engine::loadFont(int fontIndex,
SFNTName::get(this, curSFNTNames_);
loadPaletteInfos();
- curMMGXState_ = MMGXAxisInfo::get(this, curMMGXAxes_);
+ curMMGXState_ = MMGXAxisInfo::get(
+ this, static_cast<unsigned>(namedInstanceIndex), curMMGXAxes_);
}
curNumGlyphs_ = numGlyphs;
@@ -1035,4 +1038,25 @@ Engine::loadPaletteInfos()
}
+void
+Engine::switchNamedInstance(int index)
+{
+ if (!ftFallbackFace_ || !FT_HAS_MULTIPLE_MASTERS(ftFallbackFace_))
+ return;
+ auto err = FT_Set_Named_Instance(ftFallbackFace_, index);
+ if (err)
+ {
+ // XXX error handling
+ }
+ if (ftSize_)
+ {
+ err = FT_Set_Named_Instance(ftSize_->face, index);
+ if (err)
+ {
+ // XXX error handling
+ }
+ }
+}
+
+
// end of engine.cpp
diff --git a/src/ftinspect/engine/engine.hpp b/src/ftinspect/engine/engine.hpp
index dc1e0a9..27a4238 100644
--- a/src/ftinspect/engine/engine.hpp
+++ b/src/ftinspect/engine/engine.hpp
@@ -286,6 +286,7 @@ private:
void queryEngine();
void loadPaletteInfos();
+ void switchNamedInstance(int index);
// It is safe to put the implementation into the corresponding cpp file.
template <class Func>
diff --git a/src/ftinspect/engine/mmgx.cpp b/src/ftinspect/engine/mmgx.cpp
index 42e0323..63bd22b 100644
--- a/src/ftinspect/engine/mmgx.cpp
+++ b/src/ftinspect/engine/mmgx.cpp
@@ -10,7 +10,8 @@
MMGXState
-MMGXAxisInfo::get(Engine* engine,
+MMGXAxisInfo::get(Engine* engine,
+ unsigned namedInstanceIndex,
std::vector<MMGXAxisInfo>& infos)
{
auto face = engine->currentFallbackFtFace();
@@ -37,6 +38,10 @@ MMGXAxisInfo::get(Engine* engine,
return state;
}
+ FT_Var_Named_Style* namedInstance = nullptr;
+ if (namedInstanceIndex > 0 && namedInstanceIndex <= mm->num_namedstyles)
+ namedInstance = &mm->namedstyle[namedInstanceIndex - 1]; // 0 means default
+
infos.resize(mm->num_axis);
auto& sfnt = engine->currentFontSFNTNames();
@@ -54,6 +59,9 @@ MMGXAxisInfo::get(Engine* engine,
FT_Get_Var_Axis_Flags(mm, i, &flags);
info.hidden = (flags & FT_VAR_AXIS_FLAG_HIDDEN) != 0;
+ if (namedInstance)
+ info.def = namedInstance->coords[i] / 65536.0;
+
auto nameSet = false;
if (state == MMGXState::GX_OVF)
{
diff --git a/src/ftinspect/engine/mmgx.hpp b/src/ftinspect/engine/mmgx.hpp
index 6aad6b6..55012b1 100644
--- a/src/ftinspect/engine/mmgx.hpp
+++ b/src/ftinspect/engine/mmgx.hpp
@@ -33,6 +33,7 @@ struct MMGXAxisInfo
bool isMM;
static MMGXState get(Engine* engine,
+ unsigned namedInstanceIndex,
std::vector<MMGXAxisInfo>& infos);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] ftinspect-ni f1dc438: [ftinspect] Fix named instances switching.,
Werner Lemberg <=