3 FreeType font driver for bdf files
5 Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by
6 Francesco Zappa Nardelli
8 Permission is hereby granted, free of charge, to any person obtaining a copy
9 of this software and associated documentation files (the "Software"), to deal
10 in the Software without restriction, including without limitation the rights
11 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 copies of the Software, and to permit persons to whom the Software is
13 furnished to do so, subject to the following conditions:
15 The above copyright notice and this permission notice shall be included in
16 all copies or substantial portions of the Software.
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 #include FT_INTERNAL_DEBUG_H
30 #include FT_INTERNAL_STREAM_H
31 #include FT_INTERNAL_OBJECTS_H
33 #include FT_TRUETYPE_IDS_H
35 #include FT_SERVICE_BDF_H
36 #include FT_SERVICE_XFREE86_NAME_H
44 /*************************************************************************/
46 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
47 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
48 /* messages during execution. */
51 #define FT_COMPONENT trace_bdfdriver
54 typedef struct BDF_CMapRec_
57 FT_ULong num_encodings
; /* ftobjs.h: FT_CMap->clazz->size */
58 BDF_encoding_el
* encodings
;
60 } BDF_CMapRec
, *BDF_CMap
;
63 FT_CALLBACK_DEF( FT_Error
)
64 bdf_cmap_init( FT_CMap bdfcmap
,
65 FT_Pointer init_data
)
67 BDF_CMap cmap
= (BDF_CMap
)bdfcmap
;
68 BDF_Face face
= (BDF_Face
)FT_CMAP_FACE( cmap
);
69 FT_UNUSED( init_data
);
72 cmap
->num_encodings
= face
->bdffont
->glyphs_used
;
73 cmap
->encodings
= face
->en_table
;
79 FT_CALLBACK_DEF( void )
80 bdf_cmap_done( FT_CMap bdfcmap
)
82 BDF_CMap cmap
= (BDF_CMap
)bdfcmap
;
85 cmap
->encodings
= NULL
;
86 cmap
->num_encodings
= 0;
90 FT_CALLBACK_DEF( FT_UInt
)
91 bdf_cmap_char_index( FT_CMap bdfcmap
,
94 BDF_CMap cmap
= (BDF_CMap
)bdfcmap
;
95 BDF_encoding_el
* encodings
= cmap
->encodings
;
96 FT_ULong min
, max
, mid
; /* num_encodings */
97 FT_UShort result
= 0; /* encodings->glyph */
101 max
= cmap
->num_encodings
;
108 mid
= ( min
+ max
) >> 1;
109 code
= encodings
[mid
].enc
;
111 if ( charcode
== code
)
113 /* increase glyph index by 1 -- */
114 /* we reserve slot 0 for the undefined glyph */
115 result
= encodings
[mid
].glyph
+ 1;
119 if ( charcode
< code
)
129 FT_CALLBACK_DEF( FT_UInt
)
130 bdf_cmap_char_next( FT_CMap bdfcmap
,
131 FT_UInt32
*acharcode
)
133 BDF_CMap cmap
= (BDF_CMap
)bdfcmap
;
134 BDF_encoding_el
* encodings
= cmap
->encodings
;
135 FT_ULong min
, max
, mid
; /* num_encodings */
136 FT_UShort result
= 0; /* encodings->glyph */
137 FT_ULong charcode
= *acharcode
+ 1;
141 max
= cmap
->num_encodings
;
145 FT_ULong code
; /* same as BDF_encoding_el.enc */
148 mid
= ( min
+ max
) >> 1;
149 code
= encodings
[mid
].enc
;
151 if ( charcode
== code
)
153 /* increase glyph index by 1 -- */
154 /* we reserve slot 0 for the undefined glyph */
155 result
= encodings
[mid
].glyph
+ 1;
159 if ( charcode
< code
)
166 if ( min
< cmap
->num_encodings
)
168 charcode
= encodings
[min
].enc
;
169 result
= encodings
[min
].glyph
+ 1;
173 if ( charcode
> 0xFFFFFFFFUL
)
175 FT_TRACE1(( "bdf_cmap_char_next: charcode 0x%x > 32bit API" ));
177 /* XXX: result should be changed to indicate an overflow error */
180 *acharcode
= (FT_UInt32
)charcode
;
185 FT_CALLBACK_TABLE_DEF
186 const FT_CMap_ClassRec bdf_cmap_class
=
188 sizeof ( BDF_CMapRec
),
194 NULL
, NULL
, NULL
, NULL
, NULL
199 bdf_interpret_style( BDF_Face bdf
)
201 FT_Error error
= BDF_Err_Ok
;
202 FT_Face face
= FT_FACE( bdf
);
203 FT_Memory memory
= face
->memory
;
204 bdf_font_t
* font
= bdf
->bdffont
;
205 bdf_property_t
* prop
;
207 char* strings
[4] = { NULL
, NULL
, NULL
, NULL
};
208 size_t nn
, len
, lengths
[4];
211 face
->style_flags
= 0;
213 prop
= bdf_get_font_property( font
, (char *)"SLANT" );
214 if ( prop
&& prop
->format
== BDF_ATOM
&&
216 ( *(prop
->value
.atom
) == 'O' || *(prop
->value
.atom
) == 'o' ||
217 *(prop
->value
.atom
) == 'I' || *(prop
->value
.atom
) == 'i' ) )
219 face
->style_flags
|= FT_STYLE_FLAG_ITALIC
;
220 strings
[2] = ( *(prop
->value
.atom
) == 'O' || *(prop
->value
.atom
) == 'o' )
225 prop
= bdf_get_font_property( font
, (char *)"WEIGHT_NAME" );
226 if ( prop
&& prop
->format
== BDF_ATOM
&&
228 ( *(prop
->value
.atom
) == 'B' || *(prop
->value
.atom
) == 'b' ) )
230 face
->style_flags
|= FT_STYLE_FLAG_BOLD
;
231 strings
[1] = (char *)"Bold";
234 prop
= bdf_get_font_property( font
, (char *)"SETWIDTH_NAME" );
235 if ( prop
&& prop
->format
== BDF_ATOM
&&
236 prop
->value
.atom
&& *(prop
->value
.atom
) &&
237 !( *(prop
->value
.atom
) == 'N' || *(prop
->value
.atom
) == 'n' ) )
238 strings
[3] = (char *)(prop
->value
.atom
);
240 prop
= bdf_get_font_property( font
, (char *)"ADD_STYLE_NAME" );
241 if ( prop
&& prop
->format
== BDF_ATOM
&&
242 prop
->value
.atom
&& *(prop
->value
.atom
) &&
243 !( *(prop
->value
.atom
) == 'N' || *(prop
->value
.atom
) == 'n' ) )
244 strings
[0] = (char *)(prop
->value
.atom
);
248 for ( len
= 0, nn
= 0; nn
< 4; nn
++ )
253 lengths
[nn
] = ft_strlen( strings
[nn
] );
254 len
+= lengths
[nn
] + 1;
260 strings
[0] = (char *)"Regular";
261 lengths
[0] = ft_strlen( strings
[0] );
262 len
= lengths
[0] + 1;
269 if ( FT_ALLOC( face
->style_name
, len
) )
272 s
= face
->style_name
;
274 for ( nn
= 0; nn
< 4; nn
++ )
276 char* src
= strings
[nn
];
284 /* separate elements with a space */
285 if ( s
!= face
->style_name
)
288 ft_memcpy( s
, src
, len
);
290 /* need to convert spaces to dashes for */
291 /* add_style_name and setwidth_name */
292 if ( nn
== 0 || nn
== 3 )
297 for ( mm
= 0; mm
< len
; mm
++ )
311 FT_CALLBACK_DEF( void )
312 BDF_Face_Done( FT_Face bdfface
) /* BDF_Face */
314 BDF_Face face
= (BDF_Face
)bdfface
;
321 memory
= FT_FACE_MEMORY( face
);
323 bdf_free_font( face
->bdffont
);
325 FT_FREE( face
->en_table
);
327 FT_FREE( face
->charset_encoding
);
328 FT_FREE( face
->charset_registry
);
329 FT_FREE( bdfface
->family_name
);
330 FT_FREE( bdfface
->style_name
);
332 FT_FREE( bdfface
->available_sizes
);
334 FT_FREE( face
->bdffont
);
336 FT_TRACE4(( "BDF_Face_Done: done face\n" ));
340 FT_CALLBACK_DEF( FT_Error
)
341 BDF_Face_Init( FT_Stream stream
,
342 FT_Face bdfface
, /* BDF_Face */
345 FT_Parameter
* params
)
347 FT_Error error
= BDF_Err_Ok
;
348 BDF_Face face
= (BDF_Face
)bdfface
;
349 FT_Memory memory
= FT_FACE_MEMORY( face
);
351 bdf_font_t
* font
= NULL
;
352 bdf_options_t options
;
354 FT_UNUSED( num_params
);
356 FT_UNUSED( face_index
);
359 if ( FT_STREAM_SEEK( 0 ) )
362 options
.correct_metrics
= 1; /* FZ XXX: options semantics */
363 options
.keep_unencoded
= 1;
364 options
.keep_comments
= 0;
365 options
.font_spacing
= BDF_PROPORTIONAL
;
367 error
= bdf_load_font( stream
, memory
, &options
, &font
);
368 if ( error
== BDF_Err_Missing_Startfont_Field
)
370 FT_TRACE2(( "[not a valid BDF file]\n" ));
376 /* we have a bdf font: let's construct the face object */
377 face
->bdffont
= font
;
379 bdf_property_t
* prop
= NULL
;
382 FT_TRACE4(( "number of glyphs: %d (%d)\n",
384 font
->glyphs_used
));
385 FT_TRACE4(( "number of unencoded glyphs: %d (%d)\n",
386 font
->unencoded_size
,
387 font
->unencoded_used
));
389 bdfface
->num_faces
= 1;
390 bdfface
->face_index
= 0;
391 bdfface
->face_flags
= FT_FACE_FLAG_FIXED_SIZES
|
392 FT_FACE_FLAG_HORIZONTAL
|
393 FT_FACE_FLAG_FAST_GLYPHS
;
395 prop
= bdf_get_font_property( font
, "SPACING" );
396 if ( prop
&& prop
->format
== BDF_ATOM
&&
398 ( *(prop
->value
.atom
) == 'M' || *(prop
->value
.atom
) == 'm' ||
399 *(prop
->value
.atom
) == 'C' || *(prop
->value
.atom
) == 'c' ) )
400 bdfface
->face_flags
|= FT_FACE_FLAG_FIXED_WIDTH
;
402 /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */
403 /* FZ XXX: I need a font to implement this */
405 prop
= bdf_get_font_property( font
, "FAMILY_NAME" );
406 if ( prop
&& prop
->value
.atom
)
408 if ( FT_STRDUP( bdfface
->family_name
, prop
->value
.atom
) )
412 bdfface
->family_name
= 0;
414 if ( ( error
= bdf_interpret_style( face
) ) != 0 )
417 /* the number of glyphs (with one slot for the undefined glyph */
418 /* at position 0 and all unencoded glyphs) */
419 bdfface
->num_glyphs
= font
->glyphs_size
+ 1;
421 bdfface
->num_fixed_sizes
= 1;
422 if ( FT_NEW_ARRAY( bdfface
->available_sizes
, 1 ) )
426 FT_Bitmap_Size
* bsize
= bdfface
->available_sizes
;
427 FT_Short resolution_x
= 0, resolution_y
= 0;
430 FT_MEM_ZERO( bsize
, sizeof ( FT_Bitmap_Size
) );
432 bsize
->height
= (FT_Short
)( font
->font_ascent
+ font
->font_descent
);
434 prop
= bdf_get_font_property( font
, "AVERAGE_WIDTH" );
436 bsize
->width
= (FT_Short
)( ( prop
->value
.l
+ 5 ) / 10 );
438 bsize
->width
= (FT_Short
)( bsize
->height
* 2/3 );
440 prop
= bdf_get_font_property( font
, "POINT_SIZE" );
442 /* convert from 722.7 decipoints to 72 points per inch */
444 (FT_Pos
)( ( prop
->value
.l
* 64 * 7200 + 36135L ) / 72270L );
446 bsize
->size
= bsize
->width
<< 6;
448 prop
= bdf_get_font_property( font
, "PIXEL_SIZE" );
450 bsize
->y_ppem
= (FT_Short
)prop
->value
.l
<< 6;
452 prop
= bdf_get_font_property( font
, "RESOLUTION_X" );
454 resolution_x
= (FT_Short
)prop
->value
.l
;
456 prop
= bdf_get_font_property( font
, "RESOLUTION_Y" );
458 resolution_y
= (FT_Short
)prop
->value
.l
;
460 if ( bsize
->y_ppem
== 0 )
462 bsize
->y_ppem
= bsize
->size
;
464 bsize
->y_ppem
= bsize
->y_ppem
* resolution_y
/ 72;
466 if ( resolution_x
&& resolution_y
)
467 bsize
->x_ppem
= bsize
->y_ppem
* resolution_x
/ resolution_y
;
469 bsize
->x_ppem
= bsize
->y_ppem
;
474 bdf_glyph_t
* cur
= font
->glyphs
;
478 if ( FT_NEW_ARRAY( face
->en_table
, font
->glyphs_size
) )
481 face
->default_glyph
= 0;
482 for ( n
= 0; n
< font
->glyphs_size
; n
++ )
484 (face
->en_table
[n
]).enc
= cur
[n
].encoding
;
485 FT_TRACE4(( "idx %d, val 0x%lX\n", n
, cur
[n
].encoding
));
486 (face
->en_table
[n
]).glyph
= (FT_Short
)n
;
488 if ( cur
[n
].encoding
== font
->default_char
)
490 if ( n
< FT_UINT_MAX
)
491 face
->default_glyph
= (FT_UInt
)n
;
493 FT_TRACE1(( "idx %d is too large for this system\n", n
));
500 bdf_property_t
*charset_registry
= 0, *charset_encoding
= 0;
501 FT_Bool unicode_charmap
= 0;
505 bdf_get_font_property( font
, "CHARSET_REGISTRY" );
507 bdf_get_font_property( font
, "CHARSET_ENCODING" );
508 if ( charset_registry
&& charset_encoding
)
510 if ( charset_registry
->format
== BDF_ATOM
&&
511 charset_encoding
->format
== BDF_ATOM
&&
512 charset_registry
->value
.atom
&&
513 charset_encoding
->value
.atom
)
518 if ( FT_STRDUP( face
->charset_encoding
,
519 charset_encoding
->value
.atom
) ||
520 FT_STRDUP( face
->charset_registry
,
521 charset_registry
->value
.atom
) )
524 /* Uh, oh, compare first letters manually to avoid dependency */
526 s
= face
->charset_registry
;
527 if ( ( s
[0] == 'i' || s
[0] == 'I' ) &&
528 ( s
[1] == 's' || s
[1] == 'S' ) &&
529 ( s
[2] == 'o' || s
[2] == 'O' ) )
532 if ( !ft_strcmp( s
, "10646" ) ||
533 ( !ft_strcmp( s
, "8859" ) &&
534 !ft_strcmp( face
->charset_encoding
, "1" ) ) )
539 FT_CharMapRec charmap
;
542 charmap
.face
= FT_FACE( face
);
543 charmap
.encoding
= FT_ENCODING_NONE
;
544 /* initial platform/encoding should indicate unset status? */
545 charmap
.platform_id
= TT_PLATFORM_APPLE_UNICODE
;
546 charmap
.encoding_id
= TT_APPLE_ID_DEFAULT
;
548 if ( unicode_charmap
)
550 charmap
.encoding
= FT_ENCODING_UNICODE
;
551 charmap
.platform_id
= TT_PLATFORM_MICROSOFT
;
552 charmap
.encoding_id
= TT_MS_ID_UNICODE_CS
;
555 error
= FT_CMap_New( &bdf_cmap_class
, NULL
, &charmap
, NULL
);
558 /* Select default charmap */
559 if ( bdfface
->num_charmaps
)
560 bdfface
->charmap
= bdfface
->charmaps
[0];
568 /* otherwise assume Adobe standard encoding */
571 FT_CharMapRec charmap
;
574 charmap
.face
= FT_FACE( face
);
575 charmap
.encoding
= FT_ENCODING_ADOBE_STANDARD
;
576 charmap
.platform_id
= TT_PLATFORM_ADOBE
;
577 charmap
.encoding_id
= TT_ADOBE_ID_STANDARD
;
579 error
= FT_CMap_New( &bdf_cmap_class
, NULL
, &charmap
, NULL
);
581 /* Select default charmap */
582 if ( bdfface
->num_charmaps
)
583 bdfface
->charmap
= bdfface
->charmaps
[0];
592 BDF_Face_Done( bdfface
);
593 return BDF_Err_Unknown_File_Format
;
597 FT_CALLBACK_DEF( FT_Error
)
598 BDF_Size_Select( FT_Size size
,
599 FT_ULong strike_index
)
601 bdf_font_t
* bdffont
= ( (BDF_Face
)size
->face
)->bdffont
;
604 FT_Select_Metrics( size
->face
, strike_index
);
606 size
->metrics
.ascender
= bdffont
->font_ascent
<< 6;
607 size
->metrics
.descender
= -bdffont
->font_descent
<< 6;
608 size
->metrics
.max_advance
= bdffont
->bbx
.width
<< 6;
614 FT_CALLBACK_DEF( FT_Error
)
615 BDF_Size_Request( FT_Size size
,
616 FT_Size_Request req
)
618 FT_Face face
= size
->face
;
619 FT_Bitmap_Size
* bsize
= face
->available_sizes
;
620 bdf_font_t
* bdffont
= ( (BDF_Face
)face
)->bdffont
;
621 FT_Error error
= BDF_Err_Invalid_Pixel_Size
;
625 height
= FT_REQUEST_HEIGHT( req
);
626 height
= ( height
+ 32 ) >> 6;
630 case FT_SIZE_REQUEST_TYPE_NOMINAL
:
631 if ( height
== ( ( bsize
->y_ppem
+ 32 ) >> 6 ) )
635 case FT_SIZE_REQUEST_TYPE_REAL_DIM
:
636 if ( height
== ( bdffont
->font_ascent
+
637 bdffont
->font_descent
) )
642 error
= BDF_Err_Unimplemented_Feature
;
649 return BDF_Size_Select( size
, 0 );
654 FT_CALLBACK_DEF( FT_Error
)
655 BDF_Glyph_Load( FT_GlyphSlot slot
,
658 FT_Int32 load_flags
)
660 BDF_Face bdf
= (BDF_Face
)FT_SIZE_FACE( size
);
661 FT_Face face
= FT_FACE( bdf
);
662 FT_Error error
= BDF_Err_Ok
;
663 FT_Bitmap
* bitmap
= &slot
->bitmap
;
665 int bpp
= bdf
->bdffont
->bpp
;
667 FT_UNUSED( load_flags
);
670 if ( !face
|| glyph_index
>= (FT_UInt
)face
->num_glyphs
)
672 error
= BDF_Err_Invalid_Argument
;
676 /* index 0 is the undefined glyph */
677 if ( glyph_index
== 0 )
678 glyph_index
= bdf
->default_glyph
;
682 /* slot, bitmap => freetype, glyph => bdflib */
683 glyph
= bdf
->bdffont
->glyphs
[glyph_index
];
685 bitmap
->rows
= glyph
.bbx
.height
;
686 bitmap
->width
= glyph
.bbx
.width
;
687 if ( glyph
.bpr
> INT_MAX
)
688 FT_TRACE1(( "BDF_Glyph_Load: too large pitch %d is truncated\n",
690 bitmap
->pitch
= (int)glyph
.bpr
; /* same as FT_Bitmap.pitch */
692 /* note: we don't allocate a new array to hold the bitmap; */
693 /* we can simply point to it */
694 ft_glyphslot_set_bitmap( slot
, glyph
.bitmap
);
699 bitmap
->pixel_mode
= FT_PIXEL_MODE_MONO
;
702 bitmap
->pixel_mode
= FT_PIXEL_MODE_GRAY2
;
705 bitmap
->pixel_mode
= FT_PIXEL_MODE_GRAY4
;
708 bitmap
->pixel_mode
= FT_PIXEL_MODE_GRAY
;
709 bitmap
->num_grays
= 256;
713 slot
->format
= FT_GLYPH_FORMAT_BITMAP
;
714 slot
->bitmap_left
= glyph
.bbx
.x_offset
;
715 slot
->bitmap_top
= glyph
.bbx
.ascent
;
717 slot
->metrics
.horiAdvance
= glyph
.dwidth
<< 6;
718 slot
->metrics
.horiBearingX
= glyph
.bbx
.x_offset
<< 6;
719 slot
->metrics
.horiBearingY
= glyph
.bbx
.ascent
<< 6;
720 slot
->metrics
.width
= bitmap
->width
<< 6;
721 slot
->metrics
.height
= bitmap
->rows
<< 6;
724 * XXX DWIDTH1 and VVECTOR should be parsed and
725 * used here, provided such fonts do exist.
727 ft_synthesize_vertical_metrics( &slot
->metrics
,
728 bdf
->bdffont
->bbx
.height
<< 6 );
742 bdf_get_bdf_property( BDF_Face face
,
743 const char* prop_name
,
744 BDF_PropertyRec
*aproperty
)
746 bdf_property_t
* prop
;
749 FT_ASSERT( face
&& face
->bdffont
);
751 prop
= bdf_get_font_property( face
->bdffont
, prop_name
);
754 switch ( prop
->format
)
757 aproperty
->type
= BDF_PROPERTY_TYPE_ATOM
;
758 aproperty
->u
.atom
= prop
->value
.atom
;
762 if ( prop
->value
.l
> 0x7FFFFFFFL
|| prop
->value
.l
< ( -1 - 0x7FFFFFFFL
) )
764 FT_TRACE1(( "bdf_get_bdf_property: " ));
765 FT_TRACE1(( "too large integer 0x%x is truncated\n" ));
767 aproperty
->type
= BDF_PROPERTY_TYPE_INTEGER
;
768 aproperty
->u
.integer
= (FT_Int32
)prop
->value
.l
;
772 if ( prop
->value
.ul
> 0xFFFFFFFFUL
)
774 FT_TRACE1(( "bdf_get_bdf_property: " ));
775 FT_TRACE1(( "too large cardinal 0x%x is truncated\n" ));
777 aproperty
->type
= BDF_PROPERTY_TYPE_CARDINAL
;
778 aproperty
->u
.cardinal
= (FT_UInt32
)prop
->value
.ul
;
788 return BDF_Err_Invalid_Argument
;
793 bdf_get_charset_id( BDF_Face face
,
794 const char* *acharset_encoding
,
795 const char* *acharset_registry
)
797 *acharset_encoding
= face
->charset_encoding
;
798 *acharset_registry
= face
->charset_registry
;
804 static const FT_Service_BDFRec bdf_service_bdf
=
806 (FT_BDF_GetCharsetIdFunc
)bdf_get_charset_id
,
807 (FT_BDF_GetPropertyFunc
) bdf_get_bdf_property
817 static const FT_ServiceDescRec bdf_services
[] =
819 { FT_SERVICE_ID_BDF
, &bdf_service_bdf
},
820 { FT_SERVICE_ID_XF86_NAME
, FT_XF86_FORMAT_BDF
},
825 FT_CALLBACK_DEF( FT_Module_Interface
)
826 bdf_driver_requester( FT_Module module
,
831 return ft_service_list_lookup( bdf_services
, name
);
836 FT_CALLBACK_TABLE_DEF
837 const FT_Driver_ClassRec bdf_driver_class
=
840 FT_MODULE_FONT_DRIVER
|
841 FT_MODULE_DRIVER_NO_OUTLINES
,
842 sizeof ( FT_DriverRec
),
850 (FT_Module_Constructor
)0,
851 (FT_Module_Destructor
) 0,
852 (FT_Module_Requester
) bdf_driver_requester
855 sizeof ( BDF_FaceRec
),
856 sizeof ( FT_SizeRec
),
857 sizeof ( FT_GlyphSlotRec
),
861 0, /* FT_Size_InitFunc */
862 0, /* FT_Size_DoneFunc */
863 0, /* FT_Slot_InitFunc */
864 0, /* FT_Slot_DoneFunc */
866 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
867 ft_stub_set_char_sizes
,
868 ft_stub_set_pixel_sizes
,
872 0, /* FT_Face_GetKerningFunc */
873 0, /* FT_Face_AttachFunc */
874 0, /* FT_Face_GetAdvancesFunc */