... |
... |
@@ -143,6 +143,30 @@ |
143
|
143
|
#endif /* TT_USE_BYTECODE_INTERPRETER */
|
144
|
144
|
|
145
|
145
|
|
|
146
|
+ /* The fonts embedded in PDF changes their family names
|
|
147
|
+ * by the randomization tag. PDF Reference 5.5.3 "Font
|
|
148
|
+ * Subsets" defines its format as 6 uppercase letters and
|
|
149
|
+ * '+' sign. For safety, we do not skip the tag violating
|
|
150
|
+ * this rule.
|
|
151
|
+ */
|
|
152
|
+
|
|
153
|
+ static const FT_String*
|
|
154
|
+ tt_skip_pdffont_random_tag( const FT_String* name )
|
|
155
|
+ {
|
|
156
|
+ unsigned int i;
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+ if ( name[6] != '+' )
|
|
160
|
+ return name;
|
|
161
|
+
|
|
162
|
+ for ( i = 0; i < 6; i++ )
|
|
163
|
+ if ( !ft_isupper( name[i] ) )
|
|
164
|
+ return name;
|
|
165
|
+
|
|
166
|
+ FT_TRACE7(( "name without randomization tag: %s\n", name + 7 ));
|
|
167
|
+ return name + 7;
|
|
168
|
+ }
|
|
169
|
+
|
146
|
170
|
/* Compare the face with a list of well-known `tricky' fonts. */
|
147
|
171
|
/* This list shall be expanded as we find more of them. */
|
148
|
172
|
|
... |
... |
@@ -151,7 +175,7 @@ |
151
|
175
|
{
|
152
|
176
|
|
153
|
177
|
#define TRICK_NAMES_MAX_CHARACTERS 19
|
154
|
|
-#define TRICK_NAMES_COUNT 26
|
|
178
|
+#define TRICK_NAMES_COUNT 20
|
155
|
179
|
|
156
|
180
|
static const char trick_names[TRICK_NAMES_COUNT]
|
157
|
181
|
[TRICK_NAMES_MAX_CHARACTERS + 1] =
|
... |
... |
@@ -171,22 +195,28 @@ |
171
|
195
|
"DFGirl-W6-WIN-BF", /* dftt-h6.ttf; version 1.00, 1993 */
|
172
|
196
|
"DFGothic-EB", /* DynaLab Inc. 1992-1995 */
|
173
|
197
|
"DFGyoSho-Lt", /* DynaLab Inc. 1992-1995 */
|
174
|
|
- "DFHei-Md-HK-BF", /* maybe DynaLab Inc. */
|
|
198
|
+ "DFHei", /* DynaLab Inc. 1992-1995 [DFHei-Bd-WIN-HK-BF] */
|
|
199
|
+ /* covers "DFHei-Md-HK-BF" maybe DynaLab Inc. */
|
|
200
|
+
|
175
|
201
|
"DFHSGothic-W5", /* DynaLab Inc. 1992-1995 */
|
176
|
202
|
"DFHSMincho-W3", /* DynaLab Inc. 1992-1995 */
|
177
|
203
|
"DFHSMincho-W7", /* DynaLab Inc. 1992-1995 */
|
178
|
204
|
"DFKaiSho-SB", /* dfkaisb.ttf */
|
179
|
|
- "DFKaiShu",
|
180
|
|
- "DFKaiShu-Md-HK-BF", /* maybe DynaLab Inc. */
|
|
205
|
+ "DFKaiShu", /* covers "DFKaiShu-Md-HK-BF", maybe DynaLab Inc. */
|
181
|
206
|
"DFKai-SB", /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */
|
182
|
|
- "DFMing-Bd-HK-BF", /* maybe DynaLab Inc. */
|
|
207
|
+
|
|
208
|
+ "DFMing", /* DynaLab Inc. 1992-1995 [DFMing-Md-WIN-HK-BF] */
|
|
209
|
+ /* covers "DFMing-Bd-HK-BF", maybe DynaLab Inc. */
|
|
210
|
+
|
183
|
211
|
"DLC", /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */
|
184
|
212
|
/* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */
|
185
|
|
- "DLCHayMedium", /* dftt-b5.ttf; version 1.00, 1993 */
|
186
|
|
- "DLCHayBold", /* dftt-b7.ttf; version 1.00, 1993 */
|
187
|
|
- "DLCKaiMedium", /* dftt-k5.ttf; version 1.00, 1992 */
|
188
|
|
- "DLCLiShu", /* dftt-l5.ttf; version 1.00, 1992 */
|
189
|
|
- "DLCRoundBold", /* dftt-r7.ttf; version 1.00, 1993 */
|
|
213
|
+ /* covers following */
|
|
214
|
+ /* "DLCHayMedium", dftt-b5.ttf; version 1.00, 1993 */
|
|
215
|
+ /* "DLCHayBold", dftt-b7.ttf; version 1.00, 1993 */
|
|
216
|
+ /* "DLCKaiMedium", dftt-k5.ttf; version 1.00, 1992 */
|
|
217
|
+ /* "DLCLiShu", dftt-l5.ttf; version 1.00, 1992 */
|
|
218
|
+ /* "DLCRoundBold", dftt-r7.ttf; version 1.00, 1993 */
|
|
219
|
+
|
190
|
220
|
"HuaTianKaiTi?", /* htkt2.ttf */
|
191
|
221
|
"HuaTianSongTi?", /* htst3.ttf */
|
192
|
222
|
"Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */
|
... |
... |
@@ -199,10 +229,12 @@ |
199
|
229
|
};
|
200
|
230
|
|
201
|
231
|
int nn;
|
|
232
|
+ const FT_String* name_without_tag;
|
202
|
233
|
|
203
|
234
|
|
|
235
|
+ name_without_tag = tt_skip_pdffont_random_tag( name );
|
204
|
236
|
for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
|
205
|
|
- if ( ft_strstr( name, trick_names[nn] ) )
|
|
237
|
+ if ( ft_strstr( name_without_tag, trick_names[nn] ) )
|
206
|
238
|
return TRUE;
|
207
|
239
|
|
208
|
240
|
return FALSE;
|
... |
... |
@@ -277,7 +309,7 @@ |
277
|
309
|
tt_check_trickyness_sfnt_ids( TT_Face face )
|
278
|
310
|
{
|
279
|
311
|
#define TRICK_SFNT_IDS_PER_FACE 3
|
280
|
|
-#define TRICK_SFNT_IDS_NUM_FACES 29
|
|
312
|
+#define TRICK_SFNT_IDS_NUM_FACES 31
|
281
|
313
|
|
282
|
314
|
static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
|
283
|
315
|
[TRICK_SFNT_IDS_PER_FACE] = {
|
... |
... |
@@ -430,6 +462,16 @@ |
430
|
462
|
{ 0x00170003UL, 0x00000060UL }, /* cvt */
|
431
|
463
|
{ 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */
|
432
|
464
|
{ 0xD643482AUL, 0x00000035UL } /* prep */
|
|
465
|
+ },
|
|
466
|
+ { /* DFHei-Bd-WIN-HK-BF, issue #1087 */
|
|
467
|
+ { 0x1269EB58UL, 0x00000350UL }, /* cvt */
|
|
468
|
+ { 0x5CD5957AUL, 0x00006A4EUL }, /* fpgm */
|
|
469
|
+ { 0xF758323AUL, 0x00000380UL } /* prep */
|
|
470
|
+ },
|
|
471
|
+ { /* DFMing-Md-WIN-HK-BF, issue #1087 */
|
|
472
|
+ { 0x122FEB0BUL, 0x00000350UL }, /* cvt */
|
|
473
|
+ { 0x7F10919AUL, 0x000070A9UL }, /* fpgm */
|
|
474
|
+ { 0x7CD7E7B7UL, 0x0000025CUL } /* prep */
|
433
|
475
|
}
|
434
|
476
|
};
|
435
|
477
|
|
... |
... |
@@ -510,13 +552,21 @@ |
510
|
552
|
/* For first, check the face name for quick check. */
|
511
|
553
|
if ( face->family_name &&
|
512
|
554
|
tt_check_trickyness_family( face->family_name ) )
|
|
555
|
+ {
|
|
556
|
+ FT_TRACE3(( "found as a tricky font by "
|
|
557
|
+ "its family name: %s\n", face->family_name ));
|
513
|
558
|
return TRUE;
|
|
559
|
+ }
|
514
|
560
|
|
515
|
561
|
/* Type42 fonts may lack `name' tables, we thus try to identify */
|
516
|
562
|
/* tricky fonts by checking the checksums of Type42-persistent */
|
517
|
563
|
/* sfnt tables (`cvt', `fpgm', and `prep'). */
|
518
|
564
|
if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) )
|
|
565
|
+ {
|
|
566
|
+ FT_TRACE3(( "found as a tricky font by "
|
|
567
|
+ "its cvt/fpgm/prep table checksum\n" ));
|
519
|
568
|
return TRUE;
|
|
569
|
+ }
|
520
|
570
|
|
521
|
571
|
return FALSE;
|
522
|
572
|
}
|