ReactOS 0.4.15-dev-8109-gd7be748
ttobjs.c File Reference
#include <ft2build.h>
#include "ttgload.h"
#include "ttpload.h"
#include "tterrors.h"
Include dependency graph for ttobjs.c:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  tt_sfnt_id_rec_
 

Macros

#define FT_COMPONENT   trace_ttobjs
 
#define TRICK_NAMES_MAX_CHARACTERS   19
 
#define TRICK_NAMES_COUNT   23
 
#define TRICK_SFNT_IDS_PER_FACE   3
 
#define TRICK_SFNT_IDS_NUM_FACES   26
 
#define TRICK_SFNT_ID_cvt   0
 
#define TRICK_SFNT_ID_fpgm   1
 
#define TRICK_SFNT_ID_prep   2
 

Typedefs

typedef struct tt_sfnt_id_rec_ tt_sfnt_id_rec
 

Functions

static FT_Bool tt_check_trickyness_family (FT_String *name)
 
static FT_UInt32 tt_synth_sfnt_checksum (FT_Stream stream, FT_ULong length)
 
static FT_ULong tt_get_sfnt_checksum (TT_Face face, FT_UShort i)
 
static FT_Bool tt_check_trickyness_sfnt_ids (TT_Face face)
 
static FT_Bool tt_check_trickyness (FT_Face face)
 
static FT_Bool tt_check_single_notdef (FT_Face ttface)
 
 tt_face_init (FT_Stream stream, FT_Face ttface, FT_Int face_index, FT_Int num_params, FT_Parameter *params)
 
 tt_face_done (FT_Face ttface)
 
 tt_size_init (FT_Size ttsize)
 
 tt_size_done (FT_Size ttsize)
 
 tt_size_reset (TT_Size size, FT_Bool only_height)
 
 tt_driver_init (FT_Module ttdriver)
 
 tt_driver_done (FT_Module ttdriver)
 
 tt_slot_init (FT_GlyphSlot slot)
 

Macro Definition Documentation

◆ FT_COMPONENT

#define FT_COMPONENT   trace_ttobjs

Definition at line 46 of file ttobjs.c.

◆ TRICK_NAMES_COUNT

#define TRICK_NAMES_COUNT   23

◆ TRICK_NAMES_MAX_CHARACTERS

#define TRICK_NAMES_MAX_CHARACTERS   19

◆ TRICK_SFNT_ID_cvt

#define TRICK_SFNT_ID_cvt   0

◆ TRICK_SFNT_ID_fpgm

#define TRICK_SFNT_ID_fpgm   1

◆ TRICK_SFNT_ID_prep

#define TRICK_SFNT_ID_prep   2

◆ TRICK_SFNT_IDS_NUM_FACES

#define TRICK_SFNT_IDS_NUM_FACES   26

◆ TRICK_SFNT_IDS_PER_FACE

#define TRICK_SFNT_IDS_PER_FACE   3

Typedef Documentation

◆ tt_sfnt_id_rec

Function Documentation

◆ tt_check_single_notdef()

static FT_Bool tt_check_single_notdef ( FT_Face  ttface)
static

Definition at line 505 of file ttobjs.c.

506 {
508
509 TT_Face face = (TT_Face)ttface;
510 FT_UInt asize;
511 FT_ULong i;
512 FT_ULong glyph_index = 0;
513 FT_UInt count = 0;
514
515
516 for( i = 0; i < face->num_locations; i++ )
517 {
518 tt_face_get_location( face, i, &asize );
519 if ( asize > 0 )
520 {
521 count += 1;
522 if ( count > 1 )
523 break;
524 glyph_index = i;
525 }
526 }
527
528 /* Only have a single outline. */
529 if ( count == 1 )
530 {
531 if ( glyph_index == 0 )
532 result = TRUE;
533 else
534 {
535 /* FIXME: Need to test glyphname == .notdef ? */
537 char buf[8];
538
539
540 error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 );
541 if ( !error &&
542 buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) )
543 result = TRUE;
544 }
545 }
546
547 return result;
548 }
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
FT_Get_Glyph_Name(FT_Face face, FT_UInt glyph_index, FT_Pointer buffer, FT_UInt buffer_max)
Definition: ftobjs.c:4047
#define ft_strncmp
Definition: ftstdlib.h:89
FT_BEGIN_HEADER typedef unsigned char FT_Bool
Definition: fttypes.h:108
unsigned long FT_ULong
Definition: fttypes.h:253
int FT_Error
Definition: fttypes.h:300
unsigned int FT_UInt
Definition: fttypes.h:231
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLenum GLuint GLint GLenum face
Definition: glext.h:7025
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLuint64EXT * result
Definition: glext.h:11304
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define error(str)
Definition: mkdosfs.c:1605
tt_face_get_location(TT_Face face, FT_UInt gindex, FT_UInt *asize)
Definition: ttpload.c:195
struct TT_FaceRec_ * TT_Face
Definition: tttypes.h:973

Referenced by tt_face_init().

◆ tt_check_trickyness()

static FT_Bool tt_check_trickyness ( FT_Face  face)
static

Definition at line 483 of file ttobjs.c.

484 {
485 if ( !face )
486 return FALSE;
487
488 /* For first, check the face name for quick check. */
489 if ( face->family_name &&
490 tt_check_trickyness_family( face->family_name ) )
491 return TRUE;
492
493 /* Type42 fonts may lack `name' tables, we thus try to identify */
494 /* tricky fonts by checking the checksums of Type42-persistent */
495 /* sfnt tables (`cvt', `fpgm', and `prep'). */
497 return TRUE;
498
499 return FALSE;
500 }
static FT_Bool tt_check_trickyness_family(FT_String *name)
Definition: ttobjs.c:146
static FT_Bool tt_check_trickyness_sfnt_ids(TT_Face face)
Definition: ttobjs.c:270

Referenced by tt_face_init().

◆ tt_check_trickyness_family()

static FT_Bool tt_check_trickyness_family ( FT_String name)
static

Definition at line 146 of file ttobjs.c.

147 {
148
149#define TRICK_NAMES_MAX_CHARACTERS 19
150#define TRICK_NAMES_COUNT 23
151
152 static const char trick_names[TRICK_NAMES_COUNT]
154 {
155 /*
156 PostScript names are given in brackets if they differ from the
157 family name. The version numbers, together with the copyright or
158 release year data, are taken from fonts available to the
159 developers.
160
161 Note that later versions of the fonts might be no longer tricky;
162 for example, `MingLiU' version 7.00 (file `mingliu.ttc' from
163 Windows 7) is an ordinary TTC with non-tricky subfonts.
164 */
165
166 "cpop", /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */
167 "DFGirl-W6-WIN-BF", /* dftt-h6.ttf; version 1.00, 1993 */
168 "DFGothic-EB", /* DynaLab Inc. 1992-1995 */
169 "DFGyoSho-Lt", /* DynaLab Inc. 1992-1995 */
170 "DFHSGothic-W5", /* DynaLab Inc. 1992-1995 */
171 "DFHSMincho-W3", /* DynaLab Inc. 1992-1995 */
172 "DFHSMincho-W7", /* DynaLab Inc. 1992-1995 */
173 "DFKaiSho-SB", /* dfkaisb.ttf */
174 "DFKaiShu",
175 "DFKai-SB", /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */
176 "DLC", /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */
177 /* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */
178 "DLCHayMedium", /* dftt-b5.ttf; version 1.00, 1993 */
179 "DLCHayBold", /* dftt-b7.ttf; version 1.00, 1993 */
180 "DLCKaiMedium", /* dftt-k5.ttf; version 1.00, 1992 */
181 "DLCLiShu", /* dftt-l5.ttf; version 1.00, 1992 */
182 "DLCRoundBold", /* dftt-r7.ttf; version 1.00, 1993 */
183 "HuaTianKaiTi?", /* htkt2.ttf */
184 "HuaTianSongTi?", /* htst3.ttf */
185 "Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */
186 /* iicore.ttf; version 0.07, 2007 [Ming] */
187 "MingLiU", /* mingliu.ttf */
188 /* mingliu.ttc; version 3.21, 2001 */
189 "MingMedium", /* dftt-m5.ttf; version 1.00, 1993 [DLCMingMedium] */
190 "PMingLiU", /* mingliu.ttc; version 3.21, 2001 */
191 "MingLi43", /* mingli.ttf; version 1.00, 1992 */
192 };
193
194 int nn;
195
196
197 for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ )
198 if ( ft_strstr( name, trick_names[nn] ) )
199 return TRUE;
200
201 return FALSE;
202 }
#define ft_strstr
Definition: ftstdlib.h:92
Definition: name.c:39
#define TRICK_NAMES_MAX_CHARACTERS
#define TRICK_NAMES_COUNT

Referenced by tt_check_trickyness().

◆ tt_check_trickyness_sfnt_ids()

static FT_Bool tt_check_trickyness_sfnt_ids ( TT_Face  face)
static

Definition at line 270 of file ttobjs.c.

271 {
272#define TRICK_SFNT_IDS_PER_FACE 3
273#define TRICK_SFNT_IDS_NUM_FACES 26
274
275 static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES]
277
278#define TRICK_SFNT_ID_cvt 0
279#define TRICK_SFNT_ID_fpgm 1
280#define TRICK_SFNT_ID_prep 2
281
282 { /* MingLiU 1995 */
283 { 0x05BCF058UL, 0x000002E4UL }, /* cvt */
284 { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
285 { 0xA344A1EAUL, 0x000001E1UL } /* prep */
286 },
287 { /* MingLiU 1996- */
288 { 0x05BCF058UL, 0x000002E4UL }, /* cvt */
289 { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */
290 { 0xA344A1EBUL, 0x000001E1UL } /* prep */
291 },
292 { /* DFGothic-EB */
293 { 0x12C3EBB2UL, 0x00000350UL }, /* cvt */
294 { 0xB680EE64UL, 0x000087A7UL }, /* fpgm */
295 { 0xCE939563UL, 0x00000758UL } /* prep */
296 },
297 { /* DFGyoSho-Lt */
298 { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */
299 { 0xCE5956E9UL, 0x0000BC85UL }, /* fpgm */
300 { 0x8272F416UL, 0x00000045UL } /* prep */
301 },
302 { /* DFHSGothic-W5 */
303 { 0x1262EB4EUL, 0x00000350UL }, /* cvt */
304 { 0xE86A5D64UL, 0x00007940UL }, /* fpgm */
305 { 0x7850F729UL, 0x000005FFUL } /* prep */
306 },
307 { /* DFHSMincho-W3 */
308 { 0x122DEB0AUL, 0x00000350UL }, /* cvt */
309 { 0x3D16328AUL, 0x0000859BUL }, /* fpgm */
310 { 0xA93FC33BUL, 0x000002CBUL } /* prep */
311 },
312 { /* DFHSMincho-W7 */
313 { 0x125FEB26UL, 0x00000350UL }, /* cvt */
314 { 0xA5ACC982UL, 0x00007EE1UL }, /* fpgm */
315 { 0x90999196UL, 0x0000041FUL } /* prep */
316 },
317 { /* DFKaiShu */
318 { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */
319 { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */
320 { 0x13A42602UL, 0x0000007EUL } /* prep */
321 },
322 { /* DFKaiShu, variant */
323 { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */
324 { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */
325 { 0x13A42602UL, 0x0000007EUL } /* prep */
326 },
327 { /* DLCLiShu */
328 { 0x07DCF546UL, 0x00000308UL }, /* cvt */
329 { 0x40FE7C90UL, 0x00008E2AUL }, /* fpgm */
330 { 0x608174B5UL, 0x0000007AUL } /* prep */
331 },
332 { /* DLCHayBold */
333 { 0xEB891238UL, 0x00000308UL }, /* cvt */
334 { 0xD2E4DCD4UL, 0x0000676FUL }, /* fpgm */
335 { 0x8EA5F293UL, 0x000003B8UL } /* prep */
336 },
337 { /* HuaTianKaiTi */
338 { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */
339 { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */
340 { 0x70020112UL, 0x00000008UL } /* prep */
341 },
342 { /* HuaTianSongTi */
343 { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */
344 { 0x0A5A0483UL, 0x00017C39UL }, /* fpgm */
345 { 0x70020112UL, 0x00000008UL } /* prep */
346 },
347 { /* NEC fadpop7.ttf */
348 { 0x00000000UL, 0x00000000UL }, /* cvt */
349 { 0x40C92555UL, 0x000000E5UL }, /* fpgm */
350 { 0xA39B58E3UL, 0x0000117CUL } /* prep */
351 },
352 { /* NEC fadrei5.ttf */
353 { 0x00000000UL, 0x00000000UL }, /* cvt */
354 { 0x33C41652UL, 0x000000E5UL }, /* fpgm */
355 { 0x26D6C52AUL, 0x00000F6AUL } /* prep */
356 },
357 { /* NEC fangot7.ttf */
358 { 0x00000000UL, 0x00000000UL }, /* cvt */
359 { 0x6DB1651DUL, 0x0000019DUL }, /* fpgm */
360 { 0x6C6E4B03UL, 0x00002492UL } /* prep */
361 },
362 { /* NEC fangyo5.ttf */
363 { 0x00000000UL, 0x00000000UL }, /* cvt */
364 { 0x40C92555UL, 0x000000E5UL }, /* fpgm */
365 { 0xDE51FAD0UL, 0x0000117CUL } /* prep */
366 },
367 { /* NEC fankyo5.ttf */
368 { 0x00000000UL, 0x00000000UL }, /* cvt */
369 { 0x85E47664UL, 0x000000E5UL }, /* fpgm */
370 { 0xA6C62831UL, 0x00001CAAUL } /* prep */
371 },
372 { /* NEC fanrgo5.ttf */
373 { 0x00000000UL, 0x00000000UL }, /* cvt */
374 { 0x2D891CFDUL, 0x0000019DUL }, /* fpgm */
375 { 0xA0604633UL, 0x00001DE8UL } /* prep */
376 },
377 { /* NEC fangot5.ttc */
378 { 0x00000000UL, 0x00000000UL }, /* cvt */
379 { 0x40AA774CUL, 0x000001CBUL }, /* fpgm */
380 { 0x9B5CAA96UL, 0x00001F9AUL } /* prep */
381 },
382 { /* NEC fanmin3.ttc */
383 { 0x00000000UL, 0x00000000UL }, /* cvt */
384 { 0x0D3DE9CBUL, 0x00000141UL }, /* fpgm */
385 { 0xD4127766UL, 0x00002280UL } /* prep */
386 },
387 { /* NEC FA-Gothic, 1996 */
388 { 0x00000000UL, 0x00000000UL }, /* cvt */
389 { 0x4A692698UL, 0x000001F0UL }, /* fpgm */
390 { 0x340D4346UL, 0x00001FCAUL } /* prep */
391 },
392 { /* NEC FA-Minchou, 1996 */
393 { 0x00000000UL, 0x00000000UL }, /* cvt */
394 { 0xCD34C604UL, 0x00000166UL }, /* fpgm */
395 { 0x6CF31046UL, 0x000022B0UL } /* prep */
396 },
397 { /* NEC FA-RoundGothicB, 1996 */
398 { 0x00000000UL, 0x00000000UL }, /* cvt */
399 { 0x5DA75315UL, 0x0000019DUL }, /* fpgm */
400 { 0x40745A5FUL, 0x000022E0UL } /* prep */
401 },
402 { /* NEC FA-RoundGothicM, 1996 */
403 { 0x00000000UL, 0x00000000UL }, /* cvt */
404 { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */
405 { 0x3900DED3UL, 0x00001E18UL } /* prep */
406 },
407 { /* MINGLI.TTF, 1992 */
408 { 0x00170003UL, 0x00000060UL }, /* cvt */
409 { 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */
410 { 0xD643482AUL, 0x00000035UL } /* prep */
411 }
412 };
413
415 int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES];
416 FT_Bool has_cvt, has_fpgm, has_prep;
417 FT_UShort i;
418 int j, k;
419
420
421 FT_MEM_SET( num_matched_ids, 0,
422 sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES );
423 has_cvt = FALSE;
424 has_fpgm = FALSE;
425 has_prep = FALSE;
426
427 for ( i = 0; i < face->num_tables; i++ )
428 {
429 checksum = 0;
430
431 switch( face->dir_tables[i].Tag )
432 {
433 case TTAG_cvt:
435 has_cvt = TRUE;
436 break;
437
438 case TTAG_fpgm:
440 has_fpgm = TRUE;
441 break;
442
443 case TTAG_prep:
445 has_prep = TRUE;
446 break;
447
448 default:
449 continue;
450 }
451
452 for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
453 if ( face->dir_tables[i].Length == sfnt_id[j][k].Length )
454 {
455 if ( !checksum )
457
458 if ( sfnt_id[j][k].CheckSum == checksum )
459 num_matched_ids[j]++;
460
461 if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
462 return TRUE;
463 }
464 }
465
466 for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ )
467 {
468 if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length )
469 num_matched_ids[j]++;
470 if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length )
471 num_matched_ids[j]++;
472 if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length )
473 num_matched_ids[j]++;
474 if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE )
475 return TRUE;
476 }
477
478 return FALSE;
479 }
static cab_ULONG checksum(const cab_UBYTE *data, cab_UWORD bytes, cab_ULONG csum)
Definition: fdi.c:353
#define FT_MEM_SET(dest, byte, count)
Definition: ftmemory.h:225
unsigned short FT_UShort
Definition: fttypes.h:209
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
int k
Definition: mpi.c:3369
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:102
#define TRICK_SFNT_IDS_PER_FACE
#define TRICK_SFNT_IDS_NUM_FACES
#define TRICK_SFNT_ID_cvt
static FT_ULong tt_get_sfnt_checksum(TT_Face face, FT_UShort i)
Definition: ttobjs.c:239
#define TRICK_SFNT_ID_prep
#define TRICK_SFNT_ID_fpgm
#define TTAG_prep
Definition: tttags.h:92
#define TTAG_cvt
Definition: tttags.h:50
#define TTAG_fpgm
Definition: tttags.h:57

Referenced by tt_check_trickyness().

◆ tt_driver_done()

tt_driver_done ( FT_Module  ttdriver)

Definition at line 1395 of file ttobjs.c.

1396 {
1397 FT_UNUSED( ttdriver );
1398 }
#define FT_UNUSED(arg)
Definition: ftconfig.h:101

◆ tt_driver_init()

tt_driver_init ( FT_Module  ttdriver)

Definition at line 1358 of file ttobjs.c.

1359 {
1360
1361#ifdef TT_USE_BYTECODE_INTERPRETER
1362
1363 TT_Driver driver = (TT_Driver)ttdriver;
1364
1365 driver->interpreter_version = TT_INTERPRETER_VERSION_35;
1366#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY
1367 driver->interpreter_version = TT_INTERPRETER_VERSION_38;
1368#endif
1369#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL
1370 driver->interpreter_version = TT_INTERPRETER_VERSION_40;
1371#endif
1372
1373#else /* !TT_USE_BYTECODE_INTERPRETER */
1374
1375 FT_UNUSED( ttdriver );
1376
1377#endif /* !TT_USE_BYTECODE_INTERPRETER */
1378
1379 return FT_Err_Ok;
1380 }
return FT_Err_Ok
Definition: ftbbox.c:511
#define TT_INTERPRETER_VERSION_38
Definition: ftdriver.h:748
#define TT_INTERPRETER_VERSION_40
Definition: ftdriver.h:749
#define TT_INTERPRETER_VERSION_35
Definition: ftdriver.h:747
struct @1674::@1675 driver
typedefFT_BEGIN_HEADER struct TT_DriverRec_ * TT_Driver
Definition: ttobjs.h:39

◆ tt_face_done()

tt_face_done ( FT_Face  ttface)

Definition at line 740 of file ttobjs.c.

741 {
742 TT_Face face = (TT_Face)ttface;
746
747
748 if ( !face )
749 return;
750
751 memory = ttface->memory;
752 stream = ttface->stream;
753 sfnt = (SFNT_Service)face->sfnt;
754
755 /* for `extended TrueType formats' (i.e. compressed versions) */
756 if ( face->extra.finalizer )
757 face->extra.finalizer( face->extra.data );
758
759 if ( sfnt )
760 sfnt->done_face( face );
761
762 /* freeing the locations table */
764
766
767 /* freeing the CVT */
768 FT_FREE( face->cvt );
769 face->cvt_size = 0;
770
771 /* freeing the programs */
772 FT_FRAME_RELEASE( face->font_program );
773 FT_FRAME_RELEASE( face->cvt_program );
774 face->font_program_size = 0;
775 face->cvt_program_size = 0;
776
777#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
778 tt_done_blend( face );
779 face->blend = NULL;
780#endif
781 }
#define NULL
Definition: types.h:112
#define FT_FREE(ptr)
Definition: ftmemory.h:329
#define FT_FRAME_RELEASE(bytes)
Definition: ftstream.h:526
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:66
if(dx< 0)
Definition: linetemp.h:194
static char memory[1024 *256]
Definition: process.c:116
SFNT_Interface * SFNT_Service
Definition: sfnt.h:628
FT_Stream stream
Definition: freetype.h:1113
FT_Memory memory
Definition: freetype.h:1112
TT_Done_Face_Func done_face
Definition: sfnt.h:568
Definition: parse.h:23
SFNT_Service sfnt
Definition: ttdriver.c:206
tt_face_free_hdmx(TT_Face face)
Definition: ttpload.c:602
tt_face_done_loca(TT_Face face)
Definition: ttpload.c:289

◆ tt_face_init()

tt_face_init ( FT_Stream  stream,
FT_Face  ttface,
FT_Int  face_index,
FT_Int  num_params,
FT_Parameter params 
)

Definition at line 578 of file ttobjs.c.

583 {
587 TT_Face face = (TT_Face)ttface;
588
589
590 FT_TRACE2(( "TTF driver\n" ));
591
592 library = ttface->driver->root.library;
593
595 if ( !sfnt )
596 {
597 FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" ));
598 error = FT_THROW( Missing_Module );
599 goto Exit;
600 }
601
602 /* create input stream from resource */
603 if ( FT_STREAM_SEEK( 0 ) )
604 goto Exit;
605
606 /* check that we have a valid TrueType file */
607 FT_TRACE2(( " " ));
608 error = sfnt->init_face( stream, face, face_index, num_params, params );
609
610 /* Stream may have changed. */
611 stream = face->root.stream;
612
613 if ( error )
614 goto Exit;
615
616 /* We must also be able to accept Mac/GX fonts, as well as OT ones. */
617 /* The 0x00020000 tag is completely undocumented; some fonts from */
618 /* Arphic made for Chinese Windows 3.1 have this. */
619 if ( face->format_tag != 0x00010000L && /* MS fonts */
620 face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */
621 face->format_tag != TTAG_true && /* Mac fonts */
622 face->format_tag != TTAG_0xA5kbd && /* `Keyboard.dfont' (legacy Mac OS X) */
623 face->format_tag != TTAG_0xA5lst ) /* `LastResort.dfont' (legacy Mac OS X) */
624 {
625 FT_TRACE2(( " not a TTF font\n" ));
626 goto Bad_Format;
627 }
628
629#ifdef TT_USE_BYTECODE_INTERPRETER
631#endif
632
633 /* If we are performing a simple font format check, exit immediately. */
634 if ( face_index < 0 )
635 return FT_Err_Ok;
636
637 /* Load font directory */
638 error = sfnt->load_face( stream, face, face_index, num_params, params );
639 if ( error )
640 goto Exit;
641
642 if ( tt_check_trickyness( ttface ) )
644
646 if ( error )
647 goto Exit;
648
649 if ( FT_IS_SCALABLE( ttface ) )
650 {
651#ifdef FT_CONFIG_OPTION_INCREMENTAL
652 if ( !ttface->internal->incremental_interface )
653#endif
654 {
656
657 /* having a (non-zero) `glyf' table without */
658 /* a `loca' table is not valid */
659 if ( face->glyf_len && FT_ERR_EQ( error, Table_Missing ) )
660 goto Exit;
661 if ( error )
662 goto Exit;
663 }
664
665 /* `fpgm', `cvt', and `prep' are optional */
667 if ( error && FT_ERR_NEQ( error, Table_Missing ) )
668 goto Exit;
669
671 if ( error && FT_ERR_NEQ( error, Table_Missing ) )
672 goto Exit;
673
675 if ( error && FT_ERR_NEQ( error, Table_Missing ) )
676 goto Exit;
677
678 /* Check the scalable flag based on `loca'. */
679#ifdef FT_CONFIG_OPTION_INCREMENTAL
680 if ( !ttface->internal->incremental_interface )
681#endif
682 {
683 if ( ttface->num_fixed_sizes &&
684 face->glyph_locations &&
685 tt_check_single_notdef( ttface ) )
686 {
687 FT_TRACE5(( "tt_face_init:"
688 " Only the `.notdef' glyph has an outline.\n"
689 " "
690 " Resetting scalable flag to FALSE.\n" ));
691
692 ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE;
693 }
694 }
695 }
696
697#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT
698
699 {
700 FT_UInt instance_index = (FT_UInt)face_index >> 16;
701
702
703 if ( FT_HAS_MULTIPLE_MASTERS( ttface ) &&
704 instance_index > 0 )
705 {
706 error = TT_Set_Named_Instance( face, instance_index );
707 if ( error )
708 goto Exit;
709
710 tt_apply_mvar( face );
711 }
712 }
713
714#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */
715
716 /* initialize standard glyph loading routines */
718
719 Exit:
720 return error;
721
722 Bad_Format:
723 error = FT_THROW( Unknown_File_Format );
724 goto Exit;
725 }
FT_Library library
Definition: cffdrivr.c:654
#define FT_FACE_FLAG_HINTER
Definition: freetype.h:1249
#define FT_HAS_MULTIPLE_MASTERS(face)
Definition: freetype.h:1402
#define FT_IS_SCALABLE(face)
Definition: freetype.h:1312
#define FT_FACE_FLAG_TRICKY
Definition: freetype.h:1251
#define FT_ERROR(varformat)
Definition: ftdebug.h:181
#define FT_TRACE5(varformat)
Definition: ftdebug.h:162
#define FT_THROW(e)
Definition: ftdebug.h:213
#define FT_TRACE2(varformat)
Definition: ftdebug.h:159
FT_Get_Module_Interface(FT_Library library, const char *mod_name)
Definition: ftobjs.c:4865
#define FT_STREAM_SEEK(position)
Definition: ftstream.h:489
#define FT_ERR_EQ(x, e)
Definition: fttypes.h:591
#define FT_ERR_NEQ(x, e)
Definition: fttypes.h:593
GLenum const GLfloat * params
Definition: glext.h:5645
static void Exit(void)
Definition: sock.c:1330
FT_ModuleRec root
Definition: ftobjs.h:829
FT_Driver driver
Definition: freetype.h:1111
FT_Int num_fixed_sizes
Definition: freetype.h:1081
FT_Face_Internal internal
Definition: freetype.h:1120
FT_Long face_flags
Definition: freetype.h:1073
FT_Library library
Definition: ftobjs.h:536
TT_Init_Face_Func init_face
Definition: sfnt.h:566
TT_Load_Face_Func load_face
Definition: sfnt.h:567
TT_Init_Glyph_Loading(TT_Face face)
Definition: ttgload.c:742
static FT_Bool tt_check_trickyness(FT_Face face)
Definition: ttobjs.c:483
static FT_Bool tt_check_single_notdef(FT_Face ttface)
Definition: ttobjs.c:505
tt_face_load_prep(TT_Face face, FT_Stream stream)
Definition: ttpload.c:461
tt_face_load_cvt(TT_Face face, FT_Stream stream)
Definition: ttpload.c:318
tt_face_load_fpgm(TT_Face face, FT_Stream stream)
Definition: ttpload.c:399
tt_face_load_hdmx(TT_Face face, FT_Stream stream)
Definition: ttpload.c:522
tt_face_load_loca(TT_Face face, FT_Stream stream)
Definition: ttpload.c:62
#define TTAG_true
Definition: tttags.h:98
#define TTAG_0xA5kbd
Definition: tttags.h:110
#define TTAG_0xA5lst
Definition: tttags.h:113

◆ tt_get_sfnt_checksum()

static FT_ULong tt_get_sfnt_checksum ( TT_Face  face,
FT_UShort  i 
)
static

Definition at line 239 of file ttobjs.c.

241 {
242#if 0 /* if we believe the written value, use following part. */
243 if ( face->dir_tables[i].CheckSum )
244 return face->dir_tables[i].CheckSum;
245#endif
246
247 if ( !face->goto_table )
248 return 0;
249
250 if ( face->goto_table( face,
251 face->dir_tables[i].Tag,
252 face->root.stream,
253 NULL ) )
254 return 0;
255
256 return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream,
257 face->dir_tables[i].Length );
258 }
static FT_UInt32 tt_synth_sfnt_checksum(FT_Stream stream, FT_ULong length)
Definition: ttobjs.c:213

Referenced by tt_check_trickyness_sfnt_ids().

◆ tt_size_done()

tt_size_done ( FT_Size  ttsize)

Definition at line 1221 of file ttobjs.c.

1222 {
1223 TT_Size size = (TT_Size)ttsize;
1224
1225
1226#ifdef TT_USE_BYTECODE_INTERPRETER
1227 tt_size_done_bytecode( ttsize );
1228#endif
1229
1230 size->ttmetrics.valid = FALSE;
1231 }
GLsizeiptr size
Definition: glext.h:5919
struct TT_SizeRec_ * TT_Size
Definition: tttypes.h:1631

◆ tt_size_init()

tt_size_init ( FT_Size  ttsize)

Definition at line 1191 of file ttobjs.c.

1192 {
1193 TT_Size size = (TT_Size)ttsize;
1195
1196
1197#ifdef TT_USE_BYTECODE_INTERPRETER
1198 size->bytecode_ready = -1;
1199 size->cvt_ready = -1;
1200#endif
1201
1202 size->ttmetrics.valid = FALSE;
1203 size->strike_index = 0xFFFFFFFFUL;
1204
1205 return error;
1206 }

◆ tt_size_reset()

tt_size_reset ( TT_Size  size,
FT_Bool  only_height 
)

Definition at line 1251 of file ttobjs.c.

1253 {
1254 TT_Face face;
1255 FT_Size_Metrics* size_metrics;
1256
1257
1258 face = (TT_Face)size->root.face;
1259
1260 /* nothing to do for CFF2 */
1261 if ( face->is_cff2 )
1262 return FT_Err_Ok;
1263
1264 size->ttmetrics.valid = FALSE;
1265
1266 size_metrics = &size->hinted_metrics;
1267
1268 /* copy the result from base layer */
1269 *size_metrics = size->root.metrics;
1270
1271 if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 )
1272 return FT_THROW( Invalid_PPem );
1273
1274 /* This bit flag, if set, indicates that the ppems must be */
1275 /* rounded to integers. Nearly all TrueType fonts have this bit */
1276 /* set, as hinting won't work really well otherwise. */
1277 /* */
1278 if ( face->header.Flags & 8 )
1279 {
1280 /* the TT spec always asks for ROUND, not FLOOR or CEIL */
1281 size_metrics->ascender = FT_PIX_ROUND(
1282 FT_MulFix( face->root.ascender,
1283 size_metrics->y_scale ) );
1284 size_metrics->descender = FT_PIX_ROUND(
1285 FT_MulFix( face->root.descender,
1286 size_metrics->y_scale ) );
1287 size_metrics->height = FT_PIX_ROUND(
1288 FT_MulFix( face->root.height,
1289 size_metrics->y_scale ) );
1290 }
1291
1292 size->ttmetrics.valid = TRUE;
1293
1294 if ( only_height )
1295 {
1296 /* we must not recompute the scaling values here since */
1297 /* `tt_size_reset' was already called (with only_height = 0) */
1298 return FT_Err_Ok;
1299 }
1300
1301 if ( face->header.Flags & 8 )
1302 {
1303 /* base scaling values on integer ppem values, */
1304 /* as mandated by the TrueType specification */
1305 size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6,
1306 face->root.units_per_EM );
1307 size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6,
1308 face->root.units_per_EM );
1309
1310 size_metrics->max_advance = FT_PIX_ROUND(
1311 FT_MulFix( face->root.max_advance_width,
1312 size_metrics->x_scale ) );
1313 }
1314
1315 /* compute new transformation */
1316 if ( size_metrics->x_ppem >= size_metrics->y_ppem )
1317 {
1318 size->ttmetrics.scale = size_metrics->x_scale;
1319 size->ttmetrics.ppem = size_metrics->x_ppem;
1320 size->ttmetrics.x_ratio = 0x10000L;
1321 size->ttmetrics.y_ratio = FT_DivFix( size_metrics->y_ppem,
1322 size_metrics->x_ppem );
1323 }
1324 else
1325 {
1326 size->ttmetrics.scale = size_metrics->y_scale;
1327 size->ttmetrics.ppem = size_metrics->y_ppem;
1328 size->ttmetrics.x_ratio = FT_DivFix( size_metrics->x_ppem,
1329 size_metrics->y_ppem );
1330 size->ttmetrics.y_ratio = 0x10000L;
1331 }
1332
1333 size->metrics = size_metrics;
1334
1335#ifdef TT_USE_BYTECODE_INTERPRETER
1336 size->cvt_ready = -1;
1337#endif /* TT_USE_BYTECODE_INTERPRETER */
1338
1339 return FT_Err_Ok;
1340 }
WORD face[3]
Definition: mesh.c:4747
FT_DivFix(FT_Long a, FT_Long b)
Definition: ftcalc.c:608
FT_MulFix(FT_Long a, FT_Long b)
Definition: ftcalc.c:509
#define FT_PIX_ROUND(x)
Definition: ftobjs.h:93
FT_Fixed y_scale
Definition: freetype.h:1644
FT_Fixed x_scale
Definition: freetype.h:1643
FT_Pos descender
Definition: freetype.h:1647
FT_UShort x_ppem
Definition: freetype.h:1640
FT_UShort y_ppem
Definition: freetype.h:1641
FT_Pos max_advance
Definition: freetype.h:1649

Referenced by tt_size_request().

◆ tt_slot_init()

tt_slot_init ( FT_GlyphSlot  slot)

Definition at line 1416 of file ttobjs.c.

1417 {
1418 return FT_GlyphLoader_CreateExtra( slot->internal->loader );
1419 }
FT_GlyphLoader_CreateExtra(FT_GlyphLoader loader)
Definition: ftgloadr.c:166
Definition: vfat.h:185

◆ tt_synth_sfnt_checksum()

static FT_UInt32 tt_synth_sfnt_checksum ( FT_Stream  stream,
FT_ULong  length 
)
static

Definition at line 213 of file ttobjs.c.

215 {
217 FT_UInt32 checksum = 0;
218 FT_UInt i;
219
220
221 if ( FT_FRAME_ENTER( length ) )
222 return 0;
223
224 for ( ; length > 3; length -= 4 )
225 checksum += (FT_UInt32)FT_GET_ULONG();
226
227 for ( i = 3; length > 0; length--, i-- )
228 checksum += (FT_UInt32)FT_GET_BYTE() << ( i * 8 );
229
231
232 return checksum;
233 }
#define FT_FRAME_ENTER(size)
Definition: ftstream.h:512
#define FT_GET_ULONG()
Definition: ftstream.h:293
#define FT_GET_BYTE()
Definition: ftstream.h:287
#define FT_FRAME_EXIT()
Definition: ftstream.h:517
GLuint GLsizei GLsizei * length
Definition: glext.h:6040

Referenced by tt_get_sfnt_checksum().