OLD | NEW |
1 /***************************************************************************/ | 1 /***************************************************************************/ |
2 /* */ | 2 /* */ |
3 /* cffdrivr.c */ | 3 /* cffdrivr.c */ |
4 /* */ | 4 /* */ |
5 /* OpenType font driver implementation (body). */ | 5 /* OpenType font driver implementation (body). */ |
6 /* */ | 6 /* */ |
7 /* Copyright 1996-2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, */ | 7 /* Copyright 1996-2012 by */ |
8 /* 2010 by */ | |
9 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ | 8 /* David Turner, Robert Wilhelm, and Werner Lemberg. */ |
10 /* */ | 9 /* */ |
11 /* This file is part of the FreeType project, and may only be used, */ | 10 /* This file is part of the FreeType project, and may only be used, */ |
12 /* modified, and distributed under the terms of the FreeType project */ | 11 /* modified, and distributed under the terms of the FreeType project */ |
13 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ | 12 /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ |
14 /* this file you indicate that you have read the license and */ | 13 /* this file you indicate that you have read the license and */ |
15 /* understand and accept it fully. */ | 14 /* understand and accept it fully. */ |
16 /* */ | 15 /* */ |
17 /***************************************************************************/ | 16 /***************************************************************************/ |
18 | 17 |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
119 return CFF_Err_Ok; | 118 return CFF_Err_Ok; |
120 } | 119 } |
121 | 120 |
122 | 121 |
123 #undef PAIR_TAG | 122 #undef PAIR_TAG |
124 | 123 |
125 | 124 |
126 /*************************************************************************/ | 125 /*************************************************************************/ |
127 /* */ | 126 /* */ |
128 /* <Function> */ | 127 /* <Function> */ |
129 /* Load_Glyph */ | 128 /* cff_glyph_load */ |
130 /* */ | 129 /* */ |
131 /* <Description> */ | 130 /* <Description> */ |
132 /* A driver method used to load a glyph within a given glyph slot. */ | 131 /* A driver method used to load a glyph within a given glyph slot. */ |
133 /* */ | 132 /* */ |
134 /* <Input> */ | 133 /* <Input> */ |
135 /* slot :: A handle to the target slot object where the glyph */ | 134 /* slot :: A handle to the target slot object where the glyph */ |
136 /* will be loaded. */ | 135 /* will be loaded. */ |
137 /* */ | 136 /* */ |
138 /* size :: A handle to the source face size at which the glyph */ | 137 /* size :: A handle to the source face size at which the glyph */ |
139 /* must be scaled, loaded, etc. */ | 138 /* must be scaled, loaded, etc. */ |
140 /* */ | 139 /* */ |
141 /* glyph_index :: The index of the glyph in the font file. */ | 140 /* glyph_index :: The index of the glyph in the font file. */ |
142 /* */ | 141 /* */ |
143 /* load_flags :: A flag indicating what to load for this glyph. The */ | 142 /* load_flags :: A flag indicating what to load for this glyph. The */ |
144 /* FT_LOAD_??? constants can be used to control the */ | 143 /* FT_LOAD_??? constants can be used to control the */ |
145 /* glyph loading process (e.g., whether the outline */ | 144 /* glyph loading process (e.g., whether the outline */ |
146 /* should be scaled, whether to load bitmaps or not, */ | 145 /* should be scaled, whether to load bitmaps or not, */ |
147 /* whether to hint the outline, etc). */ | 146 /* whether to hint the outline, etc). */ |
148 /* */ | 147 /* */ |
149 /* <Return> */ | 148 /* <Return> */ |
150 /* FreeType error code. 0 means success. */ | 149 /* FreeType error code. 0 means success. */ |
151 /* */ | 150 /* */ |
152 FT_CALLBACK_DEF( FT_Error ) | 151 FT_CALLBACK_DEF( FT_Error ) |
153 Load_Glyph( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ | 152 cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ |
154 FT_Size cffsize, /* CFF_Size */ | 153 FT_Size cffsize, /* CFF_Size */ |
155 FT_UInt glyph_index, | 154 FT_UInt glyph_index, |
156 FT_Int32 load_flags ) | 155 FT_Int32 load_flags ) |
157 { | 156 { |
158 FT_Error error; | 157 FT_Error error; |
159 CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; | 158 CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; |
160 CFF_Size size = (CFF_Size)cffsize; | 159 CFF_Size size = (CFF_Size)cffsize; |
161 | 160 |
162 | 161 |
163 if ( !slot ) | 162 if ( !slot ) |
164 return CFF_Err_Invalid_Slot_Handle; | 163 return CFF_Err_Invalid_Slot_Handle; |
165 | 164 |
166 /* check whether we want a scaled outline or bitmap */ | 165 /* check whether we want a scaled outline or bitmap */ |
(...skipping 30 matching lines...) Expand all Loading... |
197 { | 196 { |
198 FT_UInt nn; | 197 FT_UInt nn; |
199 FT_Error error = CFF_Err_Ok; | 198 FT_Error error = CFF_Err_Ok; |
200 FT_GlyphSlot slot = face->glyph; | 199 FT_GlyphSlot slot = face->glyph; |
201 | 200 |
202 | 201 |
203 flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; | 202 flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; |
204 | 203 |
205 for ( nn = 0; nn < count; nn++ ) | 204 for ( nn = 0; nn < count; nn++ ) |
206 { | 205 { |
207 error = Load_Glyph( slot, face->size, start + nn, flags ); | 206 error = cff_glyph_load( slot, face->size, start + nn, flags ); |
208 if ( error ) | 207 if ( error ) |
209 break; | 208 break; |
210 | 209 |
211 advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) | 210 advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) |
212 ? slot->linearVertAdvance | 211 ? slot->linearVertAdvance |
213 : slot->linearHoriAdvance; | 212 : slot->linearHoriAdvance; |
214 } | 213 } |
215 | 214 |
216 return error; | 215 return error; |
217 } | 216 } |
(...skipping 15 matching lines...) Expand all Loading... |
233 FT_UShort sid; | 232 FT_UShort sid; |
234 FT_Error error; | 233 FT_Error error; |
235 | 234 |
236 | 235 |
237 if ( !font->psnames ) | 236 if ( !font->psnames ) |
238 { | 237 { |
239 FT_ERROR(( "cff_get_glyph_name:" | 238 FT_ERROR(( "cff_get_glyph_name:" |
240 " cannot get glyph name from CFF & CEF fonts\n" | 239 " cannot get glyph name from CFF & CEF fonts\n" |
241 " " | 240 " " |
242 " without the `PSNames' module\n" )); | 241 " without the `PSNames' module\n" )); |
243 error = CFF_Err_Unknown_File_Format; | 242 error = CFF_Err_Missing_Module; |
244 goto Exit; | 243 goto Exit; |
245 } | 244 } |
246 | 245 |
247 /* first, locate the sid in the charset table */ | 246 /* first, locate the sid in the charset table */ |
248 sid = font->charset.sids[glyph_index]; | 247 sid = font->charset.sids[glyph_index]; |
249 | 248 |
250 /* now, lookup the name itself */ | 249 /* now, lookup the name itself */ |
251 gname = cff_index_get_sid_string( font, sid ); | 250 gname = cff_index_get_sid_string( font, sid ); |
252 | 251 |
253 if ( gname ) | 252 if ( gname ) |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 357 |
359 Fail: | 358 Fail: |
360 return error; | 359 return error; |
361 } | 360 } |
362 | 361 |
363 | 362 |
364 FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, | 363 FT_DEFINE_SERVICE_PSINFOREC(cff_service_ps_info, |
365 (PS_GetFontInfoFunc) cff_ps_get_font_info, | 364 (PS_GetFontInfoFunc) cff_ps_get_font_info, |
366 (PS_GetFontExtraFunc) NULL, | 365 (PS_GetFontExtraFunc) NULL, |
367 (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, | 366 (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, |
368 (PS_GetFontPrivateFunc)NULL /* unsupported with CFF fonts */ | 367 (PS_GetFontPrivateFunc)NULL, /* unsupported with CFF fonts */ |
| 368 (PS_GetFontValueFunc) NULL /* not implemented */ |
369 ) | 369 ) |
370 | 370 |
371 | 371 |
372 /* | 372 /* |
373 * POSTSCRIPT NAME SERVICE | 373 * POSTSCRIPT NAME SERVICE |
374 * | 374 * |
375 */ | 375 */ |
376 | 376 |
377 static const char* | 377 static const char* |
378 cff_get_ps_name( CFF_Face face ) | 378 cff_get_ps_name( CFF_Face face ) |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
459 goto Fail; | 459 goto Fail; |
460 } | 460 } |
461 | 461 |
462 if ( registry ) | 462 if ( registry ) |
463 { | 463 { |
464 if ( cff->registry == NULL ) | 464 if ( cff->registry == NULL ) |
465 cff->registry = cff_index_get_sid_string( cff, | 465 cff->registry = cff_index_get_sid_string( cff, |
466 dict->cid_registry ); | 466 dict->cid_registry ); |
467 *registry = cff->registry; | 467 *registry = cff->registry; |
468 } | 468 } |
469 | 469 |
470 if ( ordering ) | 470 if ( ordering ) |
471 { | 471 { |
472 if ( cff->ordering == NULL ) | 472 if ( cff->ordering == NULL ) |
473 cff->ordering = cff_index_get_sid_string( cff, | 473 cff->ordering = cff_index_get_sid_string( cff, |
474 dict->cid_ordering ); | 474 dict->cid_ordering ); |
475 *ordering = cff->ordering; | 475 *ordering = cff->ordering; |
476 } | 476 } |
477 | 477 |
478 /* | 478 /* |
479 * XXX: According to Adobe TechNote #5176, the supplement in CFF | 479 * XXX: According to Adobe TechNote #5176, the supplement in CFF |
480 * can be a real number. We truncate it to fit public API | 480 * can be a real number. We truncate it to fit public API |
481 * since freetype-2.3.6. | 481 * since freetype-2.3.6. |
482 */ | 482 */ |
483 if ( supplement ) | 483 if ( supplement ) |
484 { | 484 { |
485 if ( dict->cid_supplement < FT_INT_MIN || | 485 if ( dict->cid_supplement < FT_INT_MIN || |
486 dict->cid_supplement > FT_INT_MAX ) | 486 dict->cid_supplement > FT_INT_MAX ) |
487 FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", | 487 FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", |
488 dict->cid_supplement )); | 488 dict->cid_supplement )); |
489 *supplement = (FT_Int)dict->cid_supplement; | 489 *supplement = (FT_Int)dict->cid_supplement; |
490 } | 490 } |
491 } | 491 } |
492 | 492 |
493 Fail: | 493 Fail: |
494 return error; | 494 return error; |
495 } | 495 } |
496 | 496 |
497 | 497 |
498 static FT_Error | 498 static FT_Error |
499 cff_get_is_cid( CFF_Face face, | 499 cff_get_is_cid( CFF_Face face, |
500 FT_Bool *is_cid ) | 500 FT_Bool *is_cid ) |
501 { | 501 { |
502 FT_Error error = CFF_Err_Ok; | 502 FT_Error error = CFF_Err_Ok; |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, | 592 FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &FT_CFF_SERVICE_PS_NAME_GET, |
593 FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, | 593 FT_SERVICE_ID_TT_CMAP, &FT_CFF_SERVICE_GET_CMAP_INFO_GET, |
594 FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET | 594 FT_SERVICE_ID_CID, &FT_CFF_SERVICE_CID_INFO_GET |
595 ) | 595 ) |
596 #endif | 596 #endif |
597 | 597 |
598 FT_CALLBACK_DEF( FT_Module_Interface ) | 598 FT_CALLBACK_DEF( FT_Module_Interface ) |
599 cff_get_interface( FT_Module driver, /* CFF_Driver */ | 599 cff_get_interface( FT_Module driver, /* CFF_Driver */ |
600 const char* module_interface ) | 600 const char* module_interface ) |
601 { | 601 { |
| 602 FT_Library library; |
602 FT_Module sfnt; | 603 FT_Module sfnt; |
603 FT_Module_Interface result; | 604 FT_Module_Interface result; |
604 | 605 |
605 | 606 |
| 607 /* FT_CFF_SERVICES_GET derefers `library' in PIC mode */ |
| 608 #ifdef FT_CONFIG_OPTION_PIC |
| 609 if ( !driver ) |
| 610 return NULL; |
| 611 library = driver->library; |
| 612 if ( !library ) |
| 613 return NULL; |
| 614 #endif |
| 615 |
606 result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); | 616 result = ft_service_list_lookup( FT_CFF_SERVICES_GET, module_interface ); |
607 if ( result != NULL ) | 617 if ( result != NULL ) |
608 return result; | 618 return result; |
609 | 619 |
| 620 /* `driver' is not yet evaluated in non-PIC mode */ |
| 621 #ifndef FT_CONFIG_OPTION_PIC |
610 if ( !driver ) | 622 if ( !driver ) |
611 return NULL; | 623 return NULL; |
| 624 library = driver->library; |
| 625 if ( !library ) |
| 626 return NULL; |
| 627 #endif |
612 | 628 |
613 /* we pass our request to the `sfnt' module */ | 629 /* we pass our request to the `sfnt' module */ |
614 sfnt = FT_Get_Module( driver->library, "sfnt" ); | 630 sfnt = FT_Get_Module( library, "sfnt" ); |
615 | 631 |
616 return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; | 632 return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; |
617 } | 633 } |
618 | 634 |
619 | 635 |
620 /* The FT_DriverInterface structure is defined in ftdriver.h. */ | 636 /* The FT_DriverInterface structure is defined in ftdriver.h. */ |
621 | 637 |
622 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS | 638 #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS |
623 #define CFF_SIZE_SELECT cff_size_select | 639 #define CFF_SIZE_SELECT cff_size_select |
624 #else | 640 #else |
625 #define CFF_SIZE_SELECT 0 | 641 #define CFF_SIZE_SELECT 0 |
626 #endif | 642 #endif |
627 | 643 |
628 FT_DEFINE_DRIVER(cff_driver_class, | 644 FT_DEFINE_DRIVER( cff_driver_class, |
| 645 |
629 FT_MODULE_FONT_DRIVER | | 646 FT_MODULE_FONT_DRIVER | |
630 FT_MODULE_DRIVER_SCALABLE | | 647 FT_MODULE_DRIVER_SCALABLE | |
631 FT_MODULE_DRIVER_HAS_HINTER, | 648 FT_MODULE_DRIVER_HAS_HINTER, |
632 | 649 |
633 sizeof( CFF_DriverRec ), | 650 sizeof ( CFF_DriverRec ), |
634 "cff", | 651 "cff", |
635 0x10000L, | 652 0x10000L, |
636 0x20000L, | 653 0x20000L, |
637 | 654 |
638 0, /* module-specific interface */ | 655 0, /* module-specific interface */ |
639 | 656 |
640 cff_driver_init, | 657 cff_driver_init, |
641 cff_driver_done, | 658 cff_driver_done, |
642 cff_get_interface, | 659 cff_get_interface, |
643 | 660 |
644 /* now the specific driver fields */ | 661 /* now the specific driver fields */ |
645 sizeof( TT_FaceRec ), | 662 sizeof ( TT_FaceRec ), |
646 sizeof( CFF_SizeRec ), | 663 sizeof ( CFF_SizeRec ), |
647 sizeof( CFF_GlyphSlotRec ), | 664 sizeof ( CFF_GlyphSlotRec ), |
648 | 665 |
649 cff_face_init, | 666 cff_face_init, |
650 cff_face_done, | 667 cff_face_done, |
651 cff_size_init, | 668 cff_size_init, |
652 cff_size_done, | 669 cff_size_done, |
653 cff_slot_init, | 670 cff_slot_init, |
654 cff_slot_done, | 671 cff_slot_done, |
655 | 672 |
656 ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ | 673 ft_stub_set_char_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ |
657 ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ | 674 ft_stub_set_pixel_sizes, /* FT_CONFIG_OPTION_OLD_INTERNALS */ |
658 | 675 |
659 Load_Glyph, | 676 cff_glyph_load, |
660 | 677 |
661 cff_get_kerning, | 678 cff_get_kerning, |
662 0, /* FT_Face_AttachFunc */ | 679 0, /* FT_Face_AttachFunc */ |
663 cff_get_advances, /* FT_Face_GetAdvancesFunc */ | 680 cff_get_advances, |
664 | 681 |
665 cff_size_request, | 682 cff_size_request, |
666 | 683 |
667 CFF_SIZE_SELECT | 684 CFF_SIZE_SELECT |
668 ) | 685 ) |
669 | 686 |
670 | 687 |
671 /* END */ | 688 /* END */ |
OLD | NEW |