freetype-commit
[Top][All Lists]
Advanced

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

[freetype2-demos] ftinspect-ni 282fbed 2/2: [ftinspect] Fix default name


From: Werner Lemberg
Subject: [freetype2-demos] ftinspect-ni 282fbed 2/2: [ftinspect] Fix default named instance handling.
Date: Wed, 19 Jul 2023 13:40:08 -0400 (EDT)

branch: ftinspect-ni
commit 282fbeda6d8a6dea48e0dd4ebb8b2a850b39cef5
Author: Charlie Jiang <w@chariri.moe>
Commit: Charlie Jiang <w@chariri.moe>

    [ftinspect] Fix default named instance handling.
    
    Now the named instance selector no longer doubles the default named 
instance.
    `FT_Get_Default_Named_Instance` is used to get the default NI index.
    The default one is labeled as " (default)".
    
    * src/ftinspect/widgets/tripletselector.cpp: Properly handle the new 1-based
      named instance indices. Label the default NI correctly.
    
    * src/ftinspect/engine/engine.cpp, src/ftinspect/engine/engine.hpp:
      Add `Engine::defualtNamedInstanceIndex`.
    
    * src/ftinspect/engine/mmgx.cpp: Change comments.
---
 src/ftinspect/engine/engine.cpp           | 29 ++++++++++++++++++++++++-----
 src/ftinspect/engine/engine.hpp           |  3 +++
 src/ftinspect/engine/mmgx.cpp             |  4 +++-
 src/ftinspect/widgets/tripletselector.cpp | 22 ++++++++++++----------
 4 files changed, 42 insertions(+), 16 deletions(-)

diff --git a/src/ftinspect/engine/engine.cpp b/src/ftinspect/engine/engine.cpp
index e72e120..61d05d5 100644
--- a/src/ftinspect/engine/engine.cpp
+++ b/src/ftinspect/engine/engine.cpp
@@ -71,6 +71,7 @@ FaceID::operator<(const FaceID& other) const
 // font, face, and named instance indices.  Getting a key from a value is
 // slow, but this must be done only once, since `faceRequester` is only
 // called if the font is not yet in the cache.
+// Note: Instance indices start from 1, and 0 is used to indicate no MM/GX 
handling.
 
 FT_Error
 faceRequester(FTC_FaceID ftcFaceID,
@@ -101,8 +102,7 @@ faceRequester(FTC_FaceID ftcFaceID,
   QString font = engine->fontFileManager_[faceID.fontIndex].filePath();
   long faceIndex = faceID.faceIndex;
 
-  if (faceID.namedInstanceIndex > 0)
-    faceIndex += faceID.namedInstanceIndex << 16;
+  faceIndex += (faceID.namedInstanceIndex) << 16;
 
   *faceP = NULL;
   return FT_New_Face(library,
@@ -227,8 +227,8 @@ int
 Engine::numberOfNamedInstances(int fontIndex,
                                long faceIndex)
 {
-  // We return `n` named instances plus one;
-  // instance index 0 represents a face without a named instance selected.
+  // With the new `FT_Get_Default_Named_Instance` func, we no longer to return
+  // one more entries.
   int numNamedInstances = -1;
   if (fontIndex < 0)
     return -1;
@@ -237,7 +237,7 @@ Engine::numberOfNamedInstances(int fontIndex,
            [&](FT_Face face)
            {
              numNamedInstances
-               = static_cast<int>((face->style_flags >> 16) + 1);
+               = static_cast<int>((face->style_flags >> 16));
            });
 
   return numNamedInstances;
@@ -264,6 +264,25 @@ Engine::namedInstanceName(int fontIndex,
 }
 
 
+unsigned
+Engine::defaultNamedInstanceIndex(int fontIndex,
+                                  int faceIndex)
+{
+  if (fontIndex < 0)
+    return 0;
+  unsigned ret = 0;
+  withFace(FaceID(fontIndex, faceIndex, 0),
+           [&](FT_Face face)
+           {
+             if (FT_Get_Default_Named_Instance(face, &ret) != 0)
+             {
+               // XXX error handling?
+             }
+           });
+  return ret;
+}
+
+
 bool
 Engine::currentFontTricky()
 {
diff --git a/src/ftinspect/engine/engine.hpp b/src/ftinspect/engine/engine.hpp
index 27a4238..dfa8751 100644
--- a/src/ftinspect/engine/engine.hpp
+++ b/src/ftinspect/engine/engine.hpp
@@ -21,6 +21,7 @@
 #include <QMap>
 
 #include <ft2build.h>
+#include <qcombobox.h>
 #include <freetype/freetype.h>
 #include <freetype/ftcache.h>
 #include <freetype/ftcolor.h>
@@ -145,6 +146,8 @@ public:
   QString namedInstanceName(int fontIndex,
                             long faceIndex,
                             int index);
+  unsigned defaultNamedInstanceIndex(int fontIndex,
+                                int faceIndex);
 
   bool currentFontTricky();
   bool currentFontBitmapOnly();
diff --git a/src/ftinspect/engine/mmgx.cpp b/src/ftinspect/engine/mmgx.cpp
index 63bd22b..600aca3 100644
--- a/src/ftinspect/engine/mmgx.cpp
+++ b/src/ftinspect/engine/mmgx.cpp
@@ -39,8 +39,10 @@ MMGXAxisInfo::get(Engine* engine,
   }
 
   FT_Var_Named_Style* namedInstance = nullptr;
+  // named instance index starts from 1, but we need to reference using a
+  // 0-based index.
   if (namedInstanceIndex > 0 && namedInstanceIndex <= mm->num_namedstyles)
-    namedInstance = &mm->namedstyle[namedInstanceIndex - 1]; // 0 means default
+    namedInstance = &mm->namedstyle[namedInstanceIndex - 1];
 
   infos.resize(mm->num_axis);
 
diff --git a/src/ftinspect/widgets/tripletselector.cpp 
b/src/ftinspect/widgets/tripletselector.cpp
index 751667a..bfb19b4 100644
--- a/src/ftinspect/widgets/tripletselector.cpp
+++ b/src/ftinspect/widgets/tripletselector.cpp
@@ -162,7 +162,7 @@ TripletSelector::repopulateNamedInstances(bool fontSwitched)
   newFaces.reserve(newSize);
   for (long i = 0; i < newSize; i++)
   {
-    newFaces.emplace_back(engine_->namedInstanceName(fontIndex, faceIndex, i));
+    newFaces.emplace_back(engine_->namedInstanceName(fontIndex, faceIndex, i + 
1));
     if (!needToRecreate && newFaces[i] != niComboBox_->itemData(i))
       needToRecreate = true;
   }
@@ -181,16 +181,19 @@ TripletSelector::repopulateNamedInstances(bool 
fontSwitched)
     QSignalBlocker blk3(niComboBox_);
     niComboBox_->clear();
 
-    for (long i = 0; i < newSize; i++)
+    // Returned index starts from 1, therefore minus 1.
+    auto defaultId = engine_->defaultNamedInstanceIndex(fontIndex, faceIndex) 
- 1;
+    for (unsigned i = 0; i < static_cast<unsigned>(newSize); i++)
     {
       auto& name = newFaces[i];
-      auto displayName = QString("%1: %2").arg(i).arg(name);
-      if (i == 0)
-        displayName = "* " + displayName;
+      auto displayName = QString("%1: %2").arg(i + 1).arg(name);
+      if (i == defaultId)
+        displayName = displayName + " (default)";
       niComboBox_->addItem(displayName, name);
     }
 
-    niComboBox_->setCurrentIndex(0);
+    if (defaultId >= 0 && newSize > 0)
+      niComboBox_->setCurrentIndex(static_cast<int>(defaultId));
     // Note: no signal is emitted from any combobox until this block ends.
   }
 
@@ -460,10 +463,9 @@ TripletSelector::loadTriplet()
 
   if (faceIndex < 0)
     faceIndex = 0;
-  if (instanceIndex < 0)
-    instanceIndex = 0;
-
-  engine_->loadFont(fontIndex, faceIndex, instanceIndex);
+  if (instanceIndex < 0 || niComboBox_->count() == 0)
+    instanceIndex = -1; // No instance available.
+  engine_->loadFont(fontIndex, faceIndex, instanceIndex + 1);
 
   // TODO: This may mess up with bitmap-only fonts.
   if (!engine_->fontValid())



reply via email to

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