misc/libfreetype/src/base/ftpfr.c
branchwebgl
changeset 9521 8054d9d775fd
parent 9282 92af50454cf2
parent 9519 b8b5c82eb61b
child 9950 2759212a27de
equal deleted inserted replaced
9282:92af50454cf2 9521:8054d9d775fd
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  ftpfr.c                                                                */
       
     4 /*                                                                         */
       
     5 /*    FreeType API for accessing PFR-specific data (body).                 */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2002, 2003, 2004, 2008, 2010 by                              */
       
     8 /*  David Turner, Robert Wilhelm, and Werner Lemberg.                      */
       
     9 /*                                                                         */
       
    10 /*  This file is part of the FreeType project, and may only be used,       */
       
    11 /*  modified, and distributed under the terms of the FreeType project      */
       
    12 /*  license, LICENSE.TXT.  By continuing to use, modify, or distribute     */
       
    13 /*  this file you indicate that you have read the license and              */
       
    14 /*  understand and accept it fully.                                        */
       
    15 /*                                                                         */
       
    16 /***************************************************************************/
       
    17 
       
    18 #include <ft2build.h>
       
    19 #include FT_INTERNAL_OBJECTS_H
       
    20 #include FT_SERVICE_PFR_H
       
    21 
       
    22 
       
    23   /* check the format */
       
    24   static FT_Service_PfrMetrics
       
    25   ft_pfr_check( FT_Face  face )
       
    26   {
       
    27     FT_Service_PfrMetrics  service = NULL;
       
    28 
       
    29 
       
    30     if ( face )
       
    31       FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS );
       
    32 
       
    33     return service;
       
    34   }
       
    35 
       
    36 
       
    37   /* documentation is in ftpfr.h */
       
    38 
       
    39   FT_EXPORT_DEF( FT_Error )
       
    40   FT_Get_PFR_Metrics( FT_Face    face,
       
    41                       FT_UInt   *aoutline_resolution,
       
    42                       FT_UInt   *ametrics_resolution,
       
    43                       FT_Fixed  *ametrics_x_scale,
       
    44                       FT_Fixed  *ametrics_y_scale )
       
    45   {
       
    46     FT_Error               error = FT_Err_Ok;
       
    47     FT_Service_PfrMetrics  service;
       
    48 
       
    49 
       
    50     if ( !face )
       
    51       return FT_Err_Invalid_Argument;
       
    52 
       
    53     service = ft_pfr_check( face );
       
    54     if ( service )
       
    55     {
       
    56       error = service->get_metrics( face,
       
    57                                     aoutline_resolution,
       
    58                                     ametrics_resolution,
       
    59                                     ametrics_x_scale,
       
    60                                     ametrics_y_scale );
       
    61     }
       
    62     else
       
    63     {
       
    64       FT_Fixed  x_scale, y_scale;
       
    65 
       
    66 
       
    67       /* this is not a PFR font */
       
    68       if ( aoutline_resolution )
       
    69         *aoutline_resolution = face->units_per_EM;
       
    70 
       
    71       if ( ametrics_resolution )
       
    72         *ametrics_resolution = face->units_per_EM;
       
    73 
       
    74       x_scale = y_scale = 0x10000L;
       
    75       if ( face->size )
       
    76       {
       
    77         x_scale = face->size->metrics.x_scale;
       
    78         y_scale = face->size->metrics.y_scale;
       
    79       }
       
    80 
       
    81       if ( ametrics_x_scale )
       
    82         *ametrics_x_scale = x_scale;
       
    83 
       
    84       if ( ametrics_y_scale )
       
    85         *ametrics_y_scale = y_scale;
       
    86 
       
    87       error = FT_Err_Unknown_File_Format;
       
    88     }
       
    89 
       
    90     return error;
       
    91   }
       
    92 
       
    93 
       
    94   /* documentation is in ftpfr.h */
       
    95 
       
    96   FT_EXPORT_DEF( FT_Error )
       
    97   FT_Get_PFR_Kerning( FT_Face     face,
       
    98                       FT_UInt     left,
       
    99                       FT_UInt     right,
       
   100                       FT_Vector  *avector )
       
   101   {
       
   102     FT_Error               error;
       
   103     FT_Service_PfrMetrics  service;
       
   104 
       
   105 
       
   106     if ( !face )
       
   107       return FT_Err_Invalid_Argument;
       
   108 
       
   109     service = ft_pfr_check( face );
       
   110     if ( service )
       
   111       error = service->get_kerning( face, left, right, avector );
       
   112     else
       
   113       error = FT_Get_Kerning( face, left, right,
       
   114                               FT_KERNING_UNSCALED, avector );
       
   115 
       
   116     return error;
       
   117   }
       
   118 
       
   119 
       
   120   /* documentation is in ftpfr.h */
       
   121 
       
   122   FT_EXPORT_DEF( FT_Error )
       
   123   FT_Get_PFR_Advance( FT_Face   face,
       
   124                       FT_UInt   gindex,
       
   125                       FT_Pos   *aadvance )
       
   126   {
       
   127     FT_Error               error;
       
   128     FT_Service_PfrMetrics  service;
       
   129 
       
   130 
       
   131     service = ft_pfr_check( face );
       
   132     if ( service )
       
   133     {
       
   134       error = service->get_advance( face, gindex, aadvance );
       
   135     }
       
   136     else
       
   137       /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */
       
   138       error = FT_Err_Invalid_Argument;
       
   139 
       
   140     return error;
       
   141   }
       
   142 
       
   143 
       
   144 /* END */