Commits:
-
52ced910
by Charlie Jiang
at 2022-08-17T00:10:39+08:00
[ftinspect] Fix palette name retrieving.
`FT_Palette_Data::palette_name_ids` contains **name** ids, not sfnt name
indices.
* src/ftinspect/engine/paletteinfo.cpp, src/ftinspect/engine/paletteinfo.hpp:
As described.
* src/ftinspect/engine/engine.cpp: Pass active SFNT names table to the
palette constructor.
-
26c36cb7
by Charlie Jiang
at 2022-08-17T08:31:41+08:00
[ftinspect] Fix palette name retrieving again.
* src/ftinspect/engine/paletteinfo.cpp: Fix.
* src/ftinspect/engine/fontinfo.cpp, src/ftinspect/engine/fontinfo.hpp:
Add a field to indicate the string is valid or not.
5 changed files:
Changes:
src/ftinspect/engine/engine.cpp
... |
... |
@@ -905,7 +905,8 @@ Engine::loadPaletteInfos() |
905
|
905
|
// size never exceeds max val of ushort.
|
906
|
906
|
curPaletteInfos_.reserve(paletteData_.num_palettes);
|
907
|
907
|
for (int i = 0; i < paletteData_.num_palettes; ++i)
|
908
|
|
- curPaletteInfos_.emplace_back(ftSize_->face, paletteData_, i);
|
|
908
|
+ curPaletteInfos_.emplace_back(ftSize_->face, paletteData_, i,
|
|
909
|
+ &curSFNTNames_);
|
909
|
910
|
}
|
910
|
911
|
|
911
|
912
|
|
src/ftinspect/engine/fontinfo.cpp
... |
... |
@@ -44,10 +44,13 @@ SFNTName::get(Engine* engine, |
44
|
44
|
obj.encodingID = sfntName.encoding_id;
|
45
|
45
|
obj.languageID = sfntName.language_id;
|
46
|
46
|
obj.nameID = sfntName.name_id;
|
47
|
|
-
|
48
|
|
- obj.strBuf = QByteArray(reinterpret_cast<const char*>(sfntName.string),
|
49
|
|
- sfntName.string_len);
|
50
|
|
- obj.str = sfntNameToQString(sfntName);
|
|
47
|
+
|
|
48
|
+ auto len = sfntName.string_len >= INT_MAX
|
|
49
|
+ ? INT_MAX - 1
|
|
50
|
+ : sfntName.string_len;
|
|
51
|
+ obj.strBuf = QByteArray(reinterpret_cast<const char*>(sfntName.string),
|
|
52
|
+ len);
|
|
53
|
+ obj.str = sfntNameToQString(sfntName, &obj.strValid);
|
51
|
54
|
|
52
|
55
|
if (obj.languageID >= 0x8000)
|
53
|
56
|
{
|
... |
... |
@@ -61,19 +64,22 @@ SFNTName::get(Engine* engine, |
61
|
64
|
|
62
|
65
|
|
63
|
66
|
QString
|
64
|
|
-SFNTName::sfntNameToQString(FT_SfntName const& sfntName)
|
|
67
|
+SFNTName::sfntNameToQString(FT_SfntName const& sfntName,
|
|
68
|
+ bool* outSuccess)
|
65
|
69
|
{
|
66
|
70
|
return sfntNameToQString(sfntName.platform_id, sfntName.encoding_id,
|
67
|
71
|
reinterpret_cast<char const*>(sfntName.string),
|
68
|
|
- sfntName.string_len);
|
|
72
|
+ sfntName.string_len,
|
|
73
|
+ outSuccess);
|
69
|
74
|
}
|
70
|
75
|
|
71
|
76
|
|
72
|
77
|
QString
|
73
|
|
-SFNTName::sfntNameToQString(SFNTName const& sfntName)
|
|
78
|
+SFNTName::sfntNameToQString(SFNTName const& sfntName, bool* outSuccess)
|
74
|
79
|
{
|
75
|
80
|
return sfntNameToQString(sfntName.platformID, sfntName.encodingID,
|
76
|
|
- sfntName.strBuf.data(), sfntName.strBuf.size());
|
|
81
|
+ sfntName.strBuf.data(), sfntName.strBuf.size(),
|
|
82
|
+ outSuccess);
|
77
|
83
|
}
|
78
|
84
|
|
79
|
85
|
|
... |
... |
@@ -81,11 +87,16 @@ QString |
81
|
87
|
SFNTName::sfntNameToQString(unsigned short platformID,
|
82
|
88
|
unsigned short encodingID,
|
83
|
89
|
char const* str,
|
84
|
|
- size_t size)
|
|
90
|
+ size_t size,
|
|
91
|
+ bool* outSuccess)
|
85
|
92
|
{
|
86
|
93
|
// TODO not complete.
|
87
|
94
|
if (size >= INT_MAX - 1)
|
88
|
95
|
return "";
|
|
96
|
+
|
|
97
|
+ if (outSuccess)
|
|
98
|
+ *outSuccess = true;
|
|
99
|
+
|
89
|
100
|
switch (platformID)
|
90
|
101
|
{
|
91
|
102
|
case TT_PLATFORM_APPLE_UNICODE:
|
... |
... |
@@ -94,6 +105,9 @@ SFNTName::sfntNameToQString(unsigned short platformID, |
94
|
105
|
case TT_PLATFORM_MACINTOSH:
|
95
|
106
|
if (platformID == TT_MAC_ID_ROMAN)
|
96
|
107
|
return QString::fromLatin1(str, static_cast<int>(size));
|
|
108
|
+
|
|
109
|
+ if (outSuccess)
|
|
110
|
+ *outSuccess = false;
|
97
|
111
|
return "<encoding unsupported>";
|
98
|
112
|
case TT_PLATFORM_ISO:
|
99
|
113
|
switch (encodingID)
|
... |
... |
@@ -104,6 +118,8 @@ SFNTName::sfntNameToQString(unsigned short platformID, |
104
|
118
|
case TT_ISO_ID_10646:
|
105
|
119
|
return utf16BEToQString(str, size);
|
106
|
120
|
default:
|
|
121
|
+ if (outSuccess)
|
|
122
|
+ *outSuccess = false;
|
107
|
123
|
return "<encoding unsupported>";
|
108
|
124
|
}
|
109
|
125
|
case TT_PLATFORM_MICROSOFT:
|
... |
... |
@@ -116,9 +132,14 @@ SFNTName::sfntNameToQString(unsigned short platformID, |
116
|
132
|
return utf16BEToQString(str, size);
|
117
|
133
|
|
118
|
134
|
default:
|
|
135
|
+ if (outSuccess)
|
|
136
|
+ *outSuccess = false;
|
119
|
137
|
return "<encoding unsupported>";
|
120
|
138
|
}
|
121
|
139
|
}
|
|
140
|
+
|
|
141
|
+ if (outSuccess)
|
|
142
|
+ *outSuccess = false;
|
122
|
143
|
return "<platform unsupported>";
|
123
|
144
|
}
|
124
|
145
|
|
src/ftinspect/engine/fontinfo.hpp
... |
... |
@@ -21,14 +21,18 @@ struct SFNTName |
21
|
21
|
QByteArray strBuf;
|
22
|
22
|
QString str;
|
23
|
23
|
QString langTag;
|
|
24
|
+ bool strValid = false;
|
24
|
25
|
|
25
|
26
|
static void get(Engine* engine,
|
26
|
27
|
std::vector<SFNTName>& list);
|
27
|
|
- static QString sfntNameToQString(FT_SfntName const& sfntName);
|
28
|
|
- static QString sfntNameToQString(SFNTName const& sfntName);
|
|
28
|
+ static QString sfntNameToQString(FT_SfntName const& sfntName,
|
|
29
|
+ bool* outSuccess = NULL);
|
|
30
|
+ static QString sfntNameToQString(SFNTName const& sfntName,
|
|
31
|
+ bool* outSuccess = NULL);
|
29
|
32
|
static QString sfntNameToQString(unsigned short platformID,
|
30
|
33
|
unsigned short encodingID,
|
31
|
|
- char const* str, size_t size);
|
|
34
|
+ char const* str, size_t size,
|
|
35
|
+ bool* outSuccess = NULL);
|
32
|
36
|
static QString utf16BEToQString(char const* str, size_t size);
|
33
|
37
|
|
34
|
38
|
|
src/ftinspect/engine/paletteinfo.cpp
... |
... |
@@ -8,15 +8,22 @@ |
8
|
8
|
|
9
|
9
|
PaletteInfo::PaletteInfo(FT_Face face,
|
10
|
10
|
FT_Palette_Data& data,
|
11
|
|
- int index)
|
|
11
|
+ int index,
|
|
12
|
+ std::vector<SFNTName> const* sfntNames)
|
12
|
13
|
: index(index)
|
13
|
14
|
{
|
14
|
|
- if (data.palette_name_ids)
|
|
15
|
+ if (sfntNames && data.palette_name_ids)
|
15
|
16
|
{
|
16
|
17
|
auto id = data.palette_name_ids[index];
|
17
|
|
- FT_SfntName sname;
|
18
|
|
- FT_Get_Sfnt_Name(face, id, &sname);
|
19
|
|
- name = SFNTName::sfntNameToQString(sname);
|
|
18
|
+ name = "(invalid)";
|
|
19
|
+ for (auto& obj : *sfntNames)
|
|
20
|
+ {
|
|
21
|
+ if (obj.nameID == id && obj.strValid)
|
|
22
|
+ {
|
|
23
|
+ name = obj.str;
|
|
24
|
+ break;
|
|
25
|
+ }
|
|
26
|
+ }
|
20
|
27
|
}
|
21
|
28
|
else
|
22
|
29
|
name = "(unnamed)";
|
src/ftinspect/engine/paletteinfo.hpp
... |
... |
@@ -4,18 +4,21 @@ |
4
|
4
|
|
5
|
5
|
#pragma once
|
6
|
6
|
|
|
7
|
+#include <vector>
|
7
|
8
|
#include <QString>
|
8
|
9
|
|
9
|
10
|
#include <freetype/freetype.h>
|
10
|
11
|
#include <freetype/ftcolor.h>
|
11
|
12
|
#include <freetype/ftsnames.h>
|
12
|
13
|
|
|
14
|
+struct SFNTName;
|
13
|
15
|
struct PaletteInfo
|
14
|
16
|
{
|
15
|
17
|
int index;
|
16
|
18
|
QString name;
|
17
|
19
|
|
18
|
|
- PaletteInfo(FT_Face face, FT_Palette_Data& data, int index);
|
|
20
|
+ PaletteInfo(FT_Face face, FT_Palette_Data& data, int index,
|
|
21
|
+ std::vector<SFNTName> const* sfntNames);
|
19
|
22
|
};
|
20
|
23
|
|
21
|
24
|
|
|