tizen 2.3.1 release
[framework/graphics/freetype.git] / src / tools / test_afm.c
1 /*
2  * gcc -DFT2_BUILD_LIBRARY -I../../include -o test_afm test_afm.c \
3  *     -L../../objs/.libs -lfreetype -lz -static
4  */
5 #include <ft2build.h>
6 #include FT_FREETYPE_H
7 #include FT_INTERNAL_STREAM_H
8 #include FT_INTERNAL_POSTSCRIPT_AUX_H
9
10   void dump_fontinfo( AFM_FontInfo  fi )
11   {
12     FT_Int  i;
13
14
15     printf( "This AFM is for %sCID font.\n\n",
16             ( fi->IsCIDFont ) ? "" : "non-" );
17
18     printf( "FontBBox: %.2f %.2f %.2f %.2f\n", fi->FontBBox.xMin / 65536.,
19                                                fi->FontBBox.yMin / 65536.,
20                                                fi->FontBBox.xMax / 65536.,
21                                                fi->FontBBox.yMax / 65536. );
22     printf( "Ascender: %.2f\n", fi->Ascender / 65536. );
23     printf( "Descender: %.2f\n\n", fi->Descender / 65536. );
24
25     if ( fi->NumTrackKern )
26       printf( "There are %d sets of track kernings:\n",
27               fi->NumTrackKern );
28     else
29       printf( "There is no track kerning.\n" );
30
31     for ( i = 0; i < fi->NumTrackKern; i++ )
32     {
33       AFM_TrackKern  tk = fi->TrackKerns + i;
34
35
36       printf( "\t%2d: %5.2f %5.2f %5.2f %5.2f\n", tk->degree,
37                                                   tk->min_ptsize / 65536.,
38                                                   tk->min_kern / 65536.,
39                                                   tk->max_ptsize / 65536.,
40                                                   tk->max_kern / 65536. );
41     }
42
43     printf( "\n" );
44
45     if ( fi->NumKernPair )
46       printf( "There are %d kerning pairs:\n",
47               fi->NumKernPair );
48     else
49       printf( "There is no kerning pair.\n" );
50
51     for ( i = 0; i < fi->NumKernPair; i++ )
52     {
53       AFM_KernPair  kp = fi->KernPairs + i;
54
55
56       printf( "\t%3d + %3d => (%4d, %4d)\n", kp->index1,
57                                              kp->index2,
58                                              kp->x,
59                                              kp->y );
60     }
61
62   }
63
64   int
65   dummy_get_index( const char*  name,
66                    FT_Offset    len,
67                    void*        user_data )
68   {
69     if ( len )
70       return name[0];
71     else
72       return 0;
73   }
74
75   FT_Error
76   parse_afm( FT_Library    library,
77              FT_Stream     stream,
78              AFM_FontInfo  fi )
79   {
80     PSAux_Service  psaux;
81     AFM_ParserRec  parser;
82     FT_Error       error = FT_Err_Ok;
83
84
85     psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" );
86     if ( !psaux || !psaux->afm_parser_funcs )
87       return -1;
88
89     error = FT_Stream_EnterFrame( stream, stream->size );
90     if ( error )
91       return error;
92
93     error = psaux->afm_parser_funcs->init( &parser,
94                                            library->memory,
95                                            stream->cursor,
96                                            stream->limit );
97     if ( error )
98       return error;
99
100     parser.FontInfo = fi;
101     parser.get_index = dummy_get_index;
102
103     error = psaux->afm_parser_funcs->parse( &parser );
104
105     psaux->afm_parser_funcs->done( &parser );
106
107     return error;
108   }
109
110
111   int main( int    argc,
112             char** argv )
113   {
114     FT_Library       library;
115     FT_StreamRec     stream;
116     FT_Error         error = FT_Err_Ok;
117     AFM_FontInfoRec  fi;
118
119
120     if ( argc < 2 )
121       return FT_ERR( Invalid_Argument );
122
123     error = FT_Init_FreeType( &library );
124     if ( error )
125       return error;
126
127     FT_ZERO( &stream );
128     error = FT_Stream_Open( &stream, argv[1] );
129     if ( error )
130       goto Exit;
131     stream.memory = library->memory;
132
133     FT_ZERO( &fi );
134     error = parse_afm( library, &stream, &fi );
135
136     if ( !error )
137     {
138       FT_Memory  memory = library->memory;
139
140
141       dump_fontinfo( &fi );
142
143       if ( fi.KernPairs )
144         FT_FREE( fi.KernPairs );
145       if ( fi.TrackKerns )
146         FT_FREE( fi.TrackKerns );
147     }
148     else
149       printf( "parse error\n" );
150
151     FT_Stream_Close( &stream );
152
153   Exit:
154     FT_Done_FreeType( library );
155
156     return error;
157   }