ReactOS 0.4.16-dev-2354-g16de117
cffparse.h File Reference
Include dependency graph for cffparse.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  CFF_ParserRec_
 
struct  CFF_Field_Handler_
 

Macros

#define CFF_MAX_STACK_DEPTH   96
 
#define CFF2_MAX_STACK   513
 
#define CFF2_DEFAULT_STACK   513
 
#define CFF_CODE_TOPDICT   0x1000
 
#define CFF_CODE_PRIVATE   0x2000
 
#define CFF2_CODE_TOPDICT   0x3000
 
#define CFF2_CODE_FONTDICT   0x4000
 
#define CFF2_CODE_PRIVATE   0x5000
 

Typedefs

typedef struct CFF_ParserRec_ CFF_ParserRec
 
typedef struct CFF_ParserRec_CFF_Parser
 
typedef FT_Error(* CFF_Field_Reader) (CFF_Parser parser)
 
typedef struct CFF_Field_Handler_ CFF_Field_Handler
 

Enumerations

enum  {
  cff_kind_none = 0 , cff_kind_num , cff_kind_fixed , cff_kind_fixed_thousand ,
  cff_kind_string , cff_kind_bool , cff_kind_delta , cff_kind_callback ,
  cff_kind_blend , cff_kind_max
}
 

Functions

 cff_parse_num (CFF_Parser parser, FT_Byte **d)
 
 cff_parser_init (CFF_Parser parser, FT_UInt code, void *object, FT_Library library, FT_UInt stackSize, FT_UShort num_designs, FT_UShort num_axes)
 
 cff_parser_done (CFF_Parser parser)
 
 cff_parser_run (CFF_Parser parser, FT_Byte *start, FT_Byte *limit)
 

Macro Definition Documentation

◆ CFF2_CODE_FONTDICT

#define CFF2_CODE_FONTDICT   0x4000

Definition at line 47 of file cffparse.h.

◆ CFF2_CODE_PRIVATE

#define CFF2_CODE_PRIVATE   0x5000

Definition at line 48 of file cffparse.h.

◆ CFF2_CODE_TOPDICT

#define CFF2_CODE_TOPDICT   0x3000

Definition at line 46 of file cffparse.h.

◆ CFF2_DEFAULT_STACK

#define CFF2_DEFAULT_STACK   513

Definition at line 42 of file cffparse.h.

◆ CFF2_MAX_STACK

#define CFF2_MAX_STACK   513

Definition at line 41 of file cffparse.h.

◆ CFF_CODE_PRIVATE

#define CFF_CODE_PRIVATE   0x2000

Definition at line 45 of file cffparse.h.

◆ CFF_CODE_TOPDICT

#define CFF_CODE_TOPDICT   0x1000

Definition at line 44 of file cffparse.h.

◆ CFF_MAX_STACK_DEPTH

#define CFF_MAX_STACK_DEPTH   96

Definition at line 32 of file cffparse.h.

Typedef Documentation

◆ CFF_Field_Handler

◆ CFF_Field_Reader

typedef FT_Error(* CFF_Field_Reader) (CFF_Parser parser)

Definition at line 114 of file cffparse.h.

◆ CFF_Parser

◆ CFF_ParserRec

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
cff_kind_none 
cff_kind_num 
cff_kind_fixed 
cff_kind_fixed_thousand 
cff_kind_string 
cff_kind_bool 
cff_kind_delta 
cff_kind_callback 
cff_kind_blend 
cff_kind_max 

Definition at line 97 of file cffparse.h.

98 {
99 cff_kind_none = 0,
108
109 cff_kind_max /* do not remove */
110 };
@ cff_kind_callback
Definition: cffparse.h:106
@ cff_kind_bool
Definition: cffparse.h:104
@ cff_kind_fixed_thousand
Definition: cffparse.h:102
@ cff_kind_fixed
Definition: cffparse.h:101
@ cff_kind_max
Definition: cffparse.h:109
@ cff_kind_delta
Definition: cffparse.h:105
@ cff_kind_blend
Definition: cffparse.h:107
@ cff_kind_none
Definition: cffparse.h:99
@ cff_kind_string
Definition: cffparse.h:103
@ cff_kind_num
Definition: cffparse.h:100

Function Documentation

◆ cff_parse_num()

cff_parse_num ( CFF_Parser  parser,
FT_Byte **  d 
)

Definition at line 522 of file cffparse.c.

524 {
525 if ( **d == 30 )
526 {
527 /* binary-coded decimal is truncated to integer */
528 return cff_parse_real( parser, *d, 0, NULL ) >> 16;
529 }
530
531 else if ( **d == 255 )
532 {
533 /* 16.16 fixed point is used internally for CFF2 blend results. */
534 /* Since these are trusted values, a limit check is not needed. */
535
536 /* After the 255, 4 bytes give the number. */
537 /* The blend value is converted to integer, with rounding; */
538 /* due to the right-shift we don't need the lowest byte. */
539#if 0
540 return (FT_Short)(
541 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) |
542 ( (FT_UInt32)*( d[0] + 2 ) << 16 ) |
543 ( (FT_UInt32)*( d[0] + 3 ) << 8 ) |
544 (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 );
545#else
546 return (FT_Short)(
547 ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) |
548 ( (FT_UInt32)*( d[0] + 2 ) << 8 ) |
549 (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 );
550#endif
551 }
552
553 else
554 return cff_parse_integer( parser, *d );
555 }
static FT_Fixed cff_parse_real(CFF_Parser parser, FT_Byte *start, FT_Long power_ten, FT_Long *scaling)
Definition: cffparse.c:247
static FT_Long cff_parse_integer(CFF_Parser parser, FT_Byte *start)
Definition: cffparse.c:160
#define NULL
Definition: types.h:112
signed short FT_Short
Definition: fttypes.h:198
#define d
Definition: ke_i.h:81
Definition: import.c:81

Referenced by cff_blend_doBlend(), cff_parse_blend(), cff_parse_cid_ros(), cff_parse_maxstack(), cff_parse_multiple_master(), cff_parse_private_dict(), cff_parse_vsindex(), and cff_parser_run().

◆ cff_parser_done()

cff_parser_done ( CFF_Parser  parser)

Definition at line 97 of file cffparse.c.

98 {
99 FT_Memory memory = parser->library->memory; /* for FT_FREE */
100
101
102 FT_FREE( parser->stack );
103
104#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
105 FT_List_Finalize( &parser->t2_strings,
106 finalize_t2_strings,
107 memory,
108 NULL );
109#endif
110 }
FT_List_Finalize(FT_List list, FT_List_Destructor destroy, FT_Memory memory, void *user)
Definition: ftutil.c:412
#define FT_FREE(ptr)
Definition: ftmemory.h:337
typedefFT_BEGIN_HEADER struct FT_MemoryRec_ * FT_Memory
Definition: ftsystem.h:64
static char memory[1024 *256]
Definition: process.c:122
enum parser_state stack[4]
Definition: inffile.c:91

Referenced by cff_load_private_dict(), and cff_subfont_load().

◆ cff_parser_init()

cff_parser_init ( CFF_Parser  parser,
FT_UInt  code,
void object,
FT_Library  library,
FT_UInt  stackSize,
FT_UShort  num_designs,
FT_UShort  num_axes 
)

Definition at line 41 of file cffparse.c.

48 {
49 FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */
50 FT_Error error; /* for FT_NEW_ARRAY */
51
52
53 FT_ZERO( parser );
54
55#if 0
56 parser->top = parser->stack;
57#endif
58 parser->object_code = code;
59 parser->object = object;
60 parser->library = library;
61 parser->num_designs = num_designs;
62 parser->num_axes = num_axes;
63
64 /* allocate the stack buffer */
65 if ( FT_NEW_ARRAY( parser->stack, stackSize ) )
66 {
68 goto Exit;
69 }
70
71 parser->stackSize = stackSize;
72 parser->top = parser->stack; /* empty stack */
73
74 Exit:
75 return error;
76 }
FT_Library library
Definition: cffdrivr.c:660
#define FT_NEW_ARRAY(ptr, count)
Definition: ftmemory.h:341
#define FT_ZERO(p)
Definition: ftmemory.h:246
int FT_Error
Definition: fttypes.h:299
#define error(str)
Definition: mkdosfs.c:1605
static void Exit(void)
Definition: sock.c:1330
FT_Memory memory
Definition: ftobjs.h:895
Definition: inflate.c:139

Referenced by cff_load_private_dict(), and cff_subfont_load().

◆ cff_parser_run()

cff_parser_run ( CFF_Parser  parser,
FT_Byte start,
FT_Byte limit 
)

Definition at line 1194 of file cffparse.c.

1197 {
1198 FT_Byte* p = start;
1200
1201#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1202 PSAux_Service psaux;
1203
1204 FT_Library library = parser->library;
1206#endif
1207
1208 parser->top = parser->stack;
1209 parser->start = start;
1210 parser->limit = limit;
1211 parser->cursor = start;
1212
1213 while ( p < limit )
1214 {
1215 FT_UInt v = *p;
1216
1217
1218 /* Opcode 31 is legacy MM T2 operator, not a number. */
1219 /* Opcode 255 is reserved and should not appear in fonts; */
1220 /* it is used internally for CFF2 blends. */
1221 if ( v >= 27 && v != 31 && v != 255 )
1222 {
1223 /* it's a number; we will push its position on the stack */
1224 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1225 goto Stack_Overflow;
1226
1227 *parser->top++ = p;
1228
1229 /* now, skip it */
1230 if ( v == 30 )
1231 {
1232 /* skip real number */
1233 p++;
1234 for (;;)
1235 {
1236 /* An unterminated floating point number at the */
1237 /* end of a dictionary is invalid but harmless. */
1238 if ( p >= limit )
1239 goto Exit;
1240 v = p[0] >> 4;
1241 if ( v == 15 )
1242 break;
1243 v = p[0] & 0xF;
1244 if ( v == 15 )
1245 break;
1246 p++;
1247 }
1248 }
1249 else if ( v == 28 )
1250 p += 2;
1251 else if ( v == 29 )
1252 p += 4;
1253 else if ( v > 246 )
1254 p += 1;
1255 }
1256#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1257 else if ( v == 31 )
1258 {
1259 /* a Type 2 charstring */
1260
1262 CFF_FontRec cff_rec;
1263 FT_Byte* charstring_base;
1264 FT_ULong charstring_len;
1265
1266 FT_Fixed* stack;
1268 CFF_T2_String t2;
1269 FT_Fixed t2_size;
1270 FT_Byte* q;
1271
1272
1273 charstring_base = ++p;
1274
1275 /* search `endchar' operator */
1276 for (;;)
1277 {
1278 if ( p >= limit )
1279 goto Exit;
1280 if ( *p == 14 )
1281 break;
1282 p++;
1283 }
1284
1285 charstring_len = (FT_ULong)( p - charstring_base ) + 1;
1286
1287 /* construct CFF_Decoder object */
1288 FT_ZERO( &decoder );
1289 FT_ZERO( &cff_rec );
1290
1291 cff_rec.top_font.font_dict.num_designs = parser->num_designs;
1292 cff_rec.top_font.font_dict.num_axes = parser->num_axes;
1293 decoder.cff = &cff_rec;
1294
1295 psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" );
1296 if ( !psaux )
1297 {
1298 FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" ));
1299 error = FT_THROW( Missing_Module );
1300 goto Exit;
1301 }
1302
1303 error = psaux->cff_decoder_funcs->parse_charstrings_old(
1304 &decoder, charstring_base, charstring_len, 1 );
1305 if ( error )
1306 goto Exit;
1307
1308 /* Now copy the stack data in the temporary decoder object, */
1309 /* converting it back to charstring number representations */
1310 /* (this is ugly, I know). */
1311
1312 node = (FT_ListNode)memory->alloc( memory,
1313 sizeof ( FT_ListNodeRec ) );
1314 if ( !node )
1315 goto Out_Of_Memory_Error;
1316
1317 FT_List_Add( &parser->t2_strings, node );
1318
1319 t2 = (CFF_T2_String)memory->alloc( memory,
1320 sizeof ( CFF_T2_StringRec ) );
1321 if ( !t2 )
1322 goto Out_Of_Memory_Error;
1323
1324 node->data = t2;
1325
1326 /* `5' is the conservative upper bound of required bytes per stack */
1327 /* element. */
1328
1329 t2_size = 5 * ( decoder.top - decoder.stack );
1330
1331 q = (FT_Byte*)memory->alloc( memory, t2_size );
1332 if ( !q )
1333 goto Out_Of_Memory_Error;
1334
1335 t2->start = q;
1336 t2->limit = q + t2_size;
1337
1338 stack = decoder.stack;
1339
1340 while ( stack < decoder.top )
1341 {
1342 FT_ULong num;
1343 FT_Bool neg;
1344
1345
1346 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1347 goto Stack_Overflow;
1348
1349 *parser->top++ = q;
1350
1351 if ( *stack < 0 )
1352 {
1353 num = (FT_ULong)NEG_LONG( *stack );
1354 neg = 1;
1355 }
1356 else
1357 {
1358 num = (FT_ULong)*stack;
1359 neg = 0;
1360 }
1361
1362 if ( num & 0xFFFFU )
1363 {
1364 if ( neg )
1365 num = (FT_ULong)-num;
1366
1367 *q++ = 255;
1368 *q++ = ( num & 0xFF000000U ) >> 24;
1369 *q++ = ( num & 0x00FF0000U ) >> 16;
1370 *q++ = ( num & 0x0000FF00U ) >> 8;
1371 *q++ = num & 0x000000FFU;
1372 }
1373 else
1374 {
1375 num >>= 16;
1376
1377 if ( neg )
1378 {
1379 if ( num <= 107 )
1380 *q++ = (FT_Byte)( 139 - num );
1381 else if ( num <= 1131 )
1382 {
1383 *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 );
1384 *q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
1385 }
1386 else
1387 {
1388 num = (FT_ULong)-num;
1389
1390 *q++ = 28;
1391 *q++ = (FT_Byte)( num >> 8 );
1392 *q++ = (FT_Byte)( num & 0xFF );
1393 }
1394 }
1395 else
1396 {
1397 if ( num <= 107 )
1398 *q++ = (FT_Byte)( num + 139 );
1399 else if ( num <= 1131 )
1400 {
1401 *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 );
1402 *q++ = (FT_Byte)( ( num - 108 ) & 0xFF );
1403 }
1404 else
1405 {
1406 *q++ = 28;
1407 *q++ = (FT_Byte)( num >> 8 );
1408 *q++ = (FT_Byte)( num & 0xFF );
1409 }
1410 }
1411 }
1412
1413 stack++;
1414 }
1415 }
1416#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */
1417 else
1418 {
1419 /* This is not a number, hence it's an operator. Compute its code */
1420 /* and look for it in our current list. */
1421
1422 FT_UInt code;
1423 FT_UInt num_args;
1424 const CFF_Field_Handler* field;
1425
1426
1427 if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize )
1428 goto Stack_Overflow;
1429
1430 num_args = (FT_UInt)( parser->top - parser->stack );
1431 *parser->top = p;
1432 code = v;
1433
1434 if ( v == 12 )
1435 {
1436 /* two byte operator */
1437 p++;
1438 if ( p >= limit )
1439 goto Syntax_Error;
1440
1441 code = 0x100 | p[0];
1442 }
1443 code = code | parser->object_code;
1444
1445 for ( field = cff_field_handlers; field->kind; field++ )
1446 {
1447 if ( field->code == (FT_Int)code )
1448 {
1449 /* we found our field's handler; read it */
1450 FT_Long val;
1451 FT_Byte* q = (FT_Byte*)parser->object + field->offset;
1452
1453
1454#ifdef FT_DEBUG_LEVEL_TRACE
1455 FT_TRACE4(( " %s", field->id ));
1456#endif
1457
1458 /* check that we have enough arguments -- except for */
1459 /* delta encoded arrays, which can be empty */
1460 if ( field->kind != cff_kind_delta && num_args < 1 )
1461 goto Stack_Underflow;
1462
1463 switch ( field->kind )
1464 {
1465 case cff_kind_bool:
1466 case cff_kind_string:
1467 case cff_kind_num:
1469 goto Store_Number;
1470
1471 case cff_kind_fixed:
1473 goto Store_Number;
1474
1477
1478 Store_Number:
1479 switch ( field->size )
1480 {
1481 case (8 / FT_CHAR_BIT):
1482 *(FT_Byte*)q = (FT_Byte)val;
1483 break;
1484
1485 case (16 / FT_CHAR_BIT):
1486 *(FT_Short*)q = (FT_Short)val;
1487 break;
1488
1489 case (32 / FT_CHAR_BIT):
1490 *(FT_Int32*)q = (FT_Int)val;
1491 break;
1492
1493 default: /* for 64-bit systems */
1494 *(FT_Long*)q = val;
1495 }
1496
1497#ifdef FT_DEBUG_LEVEL_TRACE
1498 switch ( field->kind )
1499 {
1500 case cff_kind_bool:
1501 FT_TRACE4(( " %s\n", val ? "true" : "false" ));
1502 break;
1503
1504 case cff_kind_string:
1505 FT_TRACE4(( " %ld (SID)\n", val ));
1506 break;
1507
1508 case cff_kind_num:
1509 FT_TRACE4(( " %ld\n", val ));
1510 break;
1511
1512 case cff_kind_fixed:
1513 FT_TRACE4(( " %f\n", (double)val / 65536 ));
1514 break;
1515
1517 FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 ));
1518
1519 default:
1520 ; /* never reached */
1521 }
1522#endif
1523
1524 break;
1525
1526 case cff_kind_delta:
1527 {
1528 FT_Byte* qcount = (FT_Byte*)parser->object +
1529 field->count_offset;
1530
1531 FT_Byte** data = parser->stack;
1532
1533
1534 if ( num_args > field->array_max )
1535 num_args = field->array_max;
1536
1537 FT_TRACE4(( " [" ));
1538
1539 /* store count */
1540 *qcount = (FT_Byte)num_args;
1541
1542 val = 0;
1543 while ( num_args > 0 )
1544 {
1546 switch ( field->size )
1547 {
1548 case (8 / FT_CHAR_BIT):
1549 *(FT_Byte*)q = (FT_Byte)val;
1550 break;
1551
1552 case (16 / FT_CHAR_BIT):
1553 *(FT_Short*)q = (FT_Short)val;
1554 break;
1555
1556 case (32 / FT_CHAR_BIT):
1557 *(FT_Int32*)q = (FT_Int)val;
1558 break;
1559
1560 default: /* for 64-bit systems */
1561 *(FT_Long*)q = val;
1562 }
1563
1564 FT_TRACE4(( " %ld", val ));
1565
1566 q += field->size;
1567 num_args--;
1568 }
1569
1570 FT_TRACE4(( "]\n" ));
1571 }
1572 break;
1573
1574 default: /* callback or blend */
1575 error = field->reader( parser );
1576 if ( error )
1577 goto Exit;
1578 }
1579 goto Found;
1580 }
1581 }
1582
1583 /* this is an unknown operator, or it is unsupported; */
1584 /* we will ignore it for now. */
1585
1586 Found:
1587 /* clear stack */
1588 /* TODO: could clear blend stack here, */
1589 /* but we don't have access to subFont */
1590 if ( field->kind != cff_kind_blend )
1591 parser->top = parser->stack;
1592 }
1593 p++;
1594 } /* while ( p < limit ) */
1595
1596 Exit:
1597 return error;
1598
1599#ifdef CFF_CONFIG_OPTION_OLD_ENGINE
1600 Out_Of_Memory_Error:
1601 error = FT_THROW( Out_Of_Memory );
1602 goto Exit;
1603#endif
1604
1605 Stack_Overflow:
1606 error = FT_THROW( Invalid_Argument );
1607 goto Exit;
1608
1609 Stack_Underflow:
1610 error = FT_THROW( Invalid_Argument );
1611 goto Exit;
1612
1613 Syntax_Error:
1614 error = FT_THROW( Invalid_Argument );
1615 goto Exit;
1616 }
return Found
Definition: dirsup.c:1270
static FT_Fixed cff_parse_fixed(CFF_Parser parser, FT_Byte **d)
Definition: cffparse.c:604
cff_parse_num(CFF_Parser parser, FT_Byte **d)
Definition: cffparse.c:522
static FT_Fixed cff_parse_fixed_scaled(CFF_Parser parser, FT_Byte **d, FT_Long scaling)
Definition: cffparse.c:614
static const CFF_Field_Handler cff_field_handlers[]
Definition: cffparse.c:1126
return FT_Err_Ok
Definition: ftbbox.c:526
#define NEG_LONG(a)
Definition: ftcalc.h:478
#define ADD_LONG(a, b)
Definition: ftcalc.h:472
#define FT_ERROR(varformat)
Definition: ftdebug.h:211
#define FT_THROW(e)
Definition: ftdebug.h:243
#define FT_TRACE4(varformat)
Definition: ftdebug.h:191
FT_List_Add(FT_List list, FT_ListNode node)
Definition: ftutil.c:268
FT_Get_Module_Interface(FT_Library library, const char *mod_name)
Definition: ftobjs.c:5012
#define FT_CHAR_BIT
Definition: ftstdlib.h:61
struct FT_ListNodeRec_ * FT_ListNode
Definition: fttypes.h:523
FT_BEGIN_HEADER typedef unsigned char FT_Bool
Definition: fttypes.h:108
unsigned long FT_ULong
Definition: fttypes.h:253
unsigned char FT_Byte
Definition: fttypes.h:154
signed long FT_Fixed
Definition: fttypes.h:287
signed long FT_Long
Definition: fttypes.h:242
unsigned int FT_UInt
Definition: fttypes.h:231
signed int FT_Int
Definition: fttypes.h:220
GLuint start
Definition: gl.h:1545
const GLdouble * v
Definition: gl.h:2040
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLdouble GLdouble GLdouble GLdouble q
Definition: gl.h:2063
GLint limit
Definition: glext.h:10326
GLuint GLfloat * val
Definition: glext.h:7180
GLfloat GLfloat p
Definition: glext.h:8902
GLuint GLuint num
Definition: glext.h:9618
if(dx< 0)
Definition: linetemp.h:194
struct PSAux_ServiceRec_ * PSAux_Service
FT_UShort num_designs
Definition: cfftypes.h:230
FT_UShort num_axes
Definition: cfftypes.h:231
CFF_SubFontRec top_font
Definition: cfftypes.h:377
CFF_FontRecDictRec font_dict
Definition: cfftypes.h:304
const CFF_Decoder_FuncsRec * cff_decoder_funcs
Definition: psaux.h:1375
Definition: parser.c:44
const CHAR * start
Definition: inffile.c:87
Definition: format.c:80
Definition: dlist.c:348
GLvoid * data
Definition: dlist.c:359
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList

Referenced by cff_load_private_dict(), and cff_subfont_load().