freetype-commit
[Top][All Lists]
Advanced

[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);
 
 



reply via email to

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