misc/libfreetype/src/tools/test_afm.c
changeset 9372 915436ff64ab
parent 9371 f3840de881bd
child 9373 b769a8e38cbd
equal deleted inserted replaced
9371:f3840de881bd 9372:915436ff64ab
     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   }