[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())
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [freetype2-demos] ftinspect-ni 282fbed 2/2: [ftinspect] Fix default named instance handling.,
Werner Lemberg <=