misc/libfreetype/src/pfr/pfrdrivr.c
changeset 5172 88f2e05288ba
equal deleted inserted replaced
5171:f9283dc4860d 5172:88f2e05288ba
       
     1 /***************************************************************************/
       
     2 /*                                                                         */
       
     3 /*  pfrdrivr.c                                                             */
       
     4 /*                                                                         */
       
     5 /*    FreeType PFR driver interface (body).                                */
       
     6 /*                                                                         */
       
     7 /*  Copyright 2002, 2003, 2004, 2006, 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 
       
    19 #include <ft2build.h>
       
    20 #include FT_INTERNAL_DEBUG_H
       
    21 #include FT_INTERNAL_STREAM_H
       
    22 #include FT_SERVICE_PFR_H
       
    23 #include FT_SERVICE_XFREE86_NAME_H
       
    24 #include "pfrdrivr.h"
       
    25 #include "pfrobjs.h"
       
    26 
       
    27 #include "pfrerror.h"
       
    28 
       
    29 
       
    30   FT_CALLBACK_DEF( FT_Error )
       
    31   pfr_get_kerning( FT_Face     pfrface,     /* PFR_Face */
       
    32                    FT_UInt     left,
       
    33                    FT_UInt     right,
       
    34                    FT_Vector  *avector )
       
    35   {
       
    36     PFR_Face     face = (PFR_Face)pfrface;
       
    37     PFR_PhyFont  phys = &face->phy_font;
       
    38 
       
    39 
       
    40     pfr_face_get_kerning( pfrface, left, right, avector );
       
    41 
       
    42     /* convert from metrics to outline units when necessary */
       
    43     if ( phys->outline_resolution != phys->metrics_resolution )
       
    44     {
       
    45       if ( avector->x != 0 )
       
    46         avector->x = FT_MulDiv( avector->x, phys->outline_resolution,
       
    47                                             phys->metrics_resolution );
       
    48 
       
    49       if ( avector->y != 0 )
       
    50         avector->y = FT_MulDiv( avector->x, phys->outline_resolution,
       
    51                                             phys->metrics_resolution );
       
    52     }
       
    53 
       
    54     return PFR_Err_Ok;
       
    55   }
       
    56 
       
    57 
       
    58  /*
       
    59   *  PFR METRICS SERVICE
       
    60   *
       
    61   */
       
    62 
       
    63   FT_CALLBACK_DEF( FT_Error )
       
    64   pfr_get_advance( FT_Face   pfrface,       /* PFR_Face */
       
    65                    FT_UInt   gindex,
       
    66                    FT_Pos   *anadvance )
       
    67   {
       
    68     PFR_Face  face  = (PFR_Face)pfrface;
       
    69     FT_Error  error = PFR_Err_Invalid_Argument;
       
    70 
       
    71 
       
    72     *anadvance = 0;
       
    73 
       
    74     if ( !gindex )
       
    75       goto Exit;
       
    76 
       
    77     gindex--;
       
    78 
       
    79     if ( face )
       
    80     {
       
    81       PFR_PhyFont  phys = &face->phy_font;
       
    82 
       
    83 
       
    84       if ( gindex < phys->num_chars )
       
    85       {
       
    86         *anadvance = phys->chars[gindex].advance;
       
    87         error = PFR_Err_Ok;
       
    88       }
       
    89     }
       
    90 
       
    91   Exit:
       
    92     return error;
       
    93   }
       
    94 
       
    95 
       
    96   FT_CALLBACK_DEF( FT_Error )
       
    97   pfr_get_metrics( FT_Face    pfrface,      /* PFR_Face */
       
    98                    FT_UInt   *anoutline_resolution,
       
    99                    FT_UInt   *ametrics_resolution,
       
   100                    FT_Fixed  *ametrics_x_scale,
       
   101                    FT_Fixed  *ametrics_y_scale )
       
   102   {
       
   103     PFR_Face     face = (PFR_Face)pfrface;
       
   104     PFR_PhyFont  phys = &face->phy_font;
       
   105     FT_Fixed     x_scale, y_scale;
       
   106     FT_Size      size = face->root.size;
       
   107 
       
   108 
       
   109     if ( anoutline_resolution )
       
   110       *anoutline_resolution = phys->outline_resolution;
       
   111 
       
   112     if ( ametrics_resolution )
       
   113       *ametrics_resolution = phys->metrics_resolution;
       
   114 
       
   115     x_scale = 0x10000L;
       
   116     y_scale = 0x10000L;
       
   117 
       
   118     if ( size )
       
   119     {
       
   120       x_scale = FT_DivFix( size->metrics.x_ppem << 6,
       
   121                            phys->metrics_resolution );
       
   122 
       
   123       y_scale = FT_DivFix( size->metrics.y_ppem << 6,
       
   124                            phys->metrics_resolution );
       
   125     }
       
   126 
       
   127     if ( ametrics_x_scale )
       
   128       *ametrics_x_scale = x_scale;
       
   129 
       
   130     if ( ametrics_y_scale )
       
   131       *ametrics_y_scale = y_scale;
       
   132 
       
   133     return PFR_Err_Ok;
       
   134   }
       
   135 
       
   136 
       
   137   FT_CALLBACK_TABLE_DEF
       
   138   const FT_Service_PfrMetricsRec  pfr_metrics_service_rec =
       
   139   {
       
   140     pfr_get_metrics,
       
   141     pfr_face_get_kerning,
       
   142     pfr_get_advance
       
   143   };
       
   144 
       
   145 
       
   146  /*
       
   147   *  SERVICE LIST
       
   148   *
       
   149   */
       
   150 
       
   151   static const FT_ServiceDescRec  pfr_services[] =
       
   152   {
       
   153     { FT_SERVICE_ID_PFR_METRICS, &pfr_metrics_service_rec },
       
   154     { FT_SERVICE_ID_XF86_NAME,   FT_XF86_FORMAT_PFR },
       
   155     { NULL, NULL }
       
   156   };
       
   157 
       
   158 
       
   159   FT_CALLBACK_DEF( FT_Module_Interface )
       
   160   pfr_get_service( FT_Module         module,
       
   161                    const FT_String*  service_id )
       
   162   {
       
   163     FT_UNUSED( module );
       
   164 
       
   165     return ft_service_list_lookup( pfr_services, service_id );
       
   166   }
       
   167 
       
   168 
       
   169   FT_CALLBACK_TABLE_DEF
       
   170   const FT_Driver_ClassRec  pfr_driver_class =
       
   171   {
       
   172     {
       
   173       FT_MODULE_FONT_DRIVER     |
       
   174       FT_MODULE_DRIVER_SCALABLE,
       
   175 
       
   176       sizeof( FT_DriverRec ),
       
   177 
       
   178       "pfr",
       
   179       0x10000L,
       
   180       0x20000L,
       
   181 
       
   182       NULL,
       
   183 
       
   184       0,
       
   185       0,
       
   186       pfr_get_service
       
   187     },
       
   188 
       
   189     sizeof( PFR_FaceRec ),
       
   190     sizeof( PFR_SizeRec ),
       
   191     sizeof( PFR_SlotRec ),
       
   192 
       
   193     pfr_face_init,
       
   194     pfr_face_done,
       
   195     0,                  /* FT_Size_InitFunc */
       
   196     0,                  /* FT_Size_DoneFunc */
       
   197     pfr_slot_init,
       
   198     pfr_slot_done,
       
   199 
       
   200 #ifdef FT_CONFIG_OPTION_OLD_INTERNALS
       
   201     ft_stub_set_char_sizes,
       
   202     ft_stub_set_pixel_sizes,
       
   203 #endif
       
   204     pfr_slot_load,
       
   205 
       
   206     pfr_get_kerning,
       
   207     0,                  /* FT_Face_AttachFunc      */
       
   208     0,                   /* FT_Face_GetAdvancesFunc */
       
   209     0,                  /* FT_Size_RequestFunc */
       
   210     0,                  /* FT_Size_SelectFunc  */
       
   211   };
       
   212 
       
   213 
       
   214 /* END */