1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* pfrdrivr.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* FreeType PFR driver interface (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 2002 by */ 8*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9*37da2899SCharles.Forsyth /* */ 10*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 11*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 12*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 14*37da2899SCharles.Forsyth /* understand and accept it fully. */ 15*37da2899SCharles.Forsyth /* */ 16*37da2899SCharles.Forsyth /***************************************************************************/ 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth #include <ft2build.h> 20*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 21*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H 22*37da2899SCharles.Forsyth #include FT_INTERNAL_PFR_H 23*37da2899SCharles.Forsyth #include "pfrdrivr.h" 24*37da2899SCharles.Forsyth #include "pfrobjs.h" 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth 27*37da2899SCharles.Forsyth static FT_Error pfr_get_kerning(PFR_Face face,FT_UInt left,FT_UInt right,FT_Vector * avector)28*37da2899SCharles.Forsyth pfr_get_kerning( PFR_Face face, 29*37da2899SCharles.Forsyth FT_UInt left, 30*37da2899SCharles.Forsyth FT_UInt right, 31*37da2899SCharles.Forsyth FT_Vector *avector ) 32*37da2899SCharles.Forsyth { 33*37da2899SCharles.Forsyth FT_Error error; 34*37da2899SCharles.Forsyth 35*37da2899SCharles.Forsyth error = pfr_face_get_kerning( face, left, right, avector ); 36*37da2899SCharles.Forsyth if ( !error ) 37*37da2899SCharles.Forsyth { 38*37da2899SCharles.Forsyth PFR_PhyFont phys = &face->phy_font; 39*37da2899SCharles.Forsyth 40*37da2899SCharles.Forsyth /* convert from metrics to outline units when necessary */ 41*37da2899SCharles.Forsyth if ( phys->outline_resolution != phys->metrics_resolution ) 42*37da2899SCharles.Forsyth { 43*37da2899SCharles.Forsyth if ( avector->x != 0 ) 44*37da2899SCharles.Forsyth avector->x = FT_MulDiv( avector->x, phys->outline_resolution, 45*37da2899SCharles.Forsyth phys->metrics_resolution ); 46*37da2899SCharles.Forsyth 47*37da2899SCharles.Forsyth if ( avector->y != 0 ) 48*37da2899SCharles.Forsyth avector->y = FT_MulDiv( avector->x, phys->outline_resolution, 49*37da2899SCharles.Forsyth phys->metrics_resolution ); 50*37da2899SCharles.Forsyth } 51*37da2899SCharles.Forsyth } 52*37da2899SCharles.Forsyth return error; 53*37da2899SCharles.Forsyth } 54*37da2899SCharles.Forsyth 55*37da2899SCharles.Forsyth 56*37da2899SCharles.Forsyth static FT_Error pfr_get_advance(PFR_Face face,FT_UInt gindex,FT_Pos * aadvance)57*37da2899SCharles.Forsyth pfr_get_advance( PFR_Face face, 58*37da2899SCharles.Forsyth FT_UInt gindex, 59*37da2899SCharles.Forsyth FT_Pos *aadvance ) 60*37da2899SCharles.Forsyth { 61*37da2899SCharles.Forsyth FT_Error error = FT_Err_Bad_Argument; 62*37da2899SCharles.Forsyth 63*37da2899SCharles.Forsyth *aadvance = 0; 64*37da2899SCharles.Forsyth if ( face ) 65*37da2899SCharles.Forsyth { 66*37da2899SCharles.Forsyth PFR_PhyFont phys = &face->phy_font; 67*37da2899SCharles.Forsyth 68*37da2899SCharles.Forsyth if ( gindex < phys->num_chars ) 69*37da2899SCharles.Forsyth { 70*37da2899SCharles.Forsyth *aadvance = phys->chars[ gindex ].advance; 71*37da2899SCharles.Forsyth error = 0; 72*37da2899SCharles.Forsyth } 73*37da2899SCharles.Forsyth } 74*37da2899SCharles.Forsyth 75*37da2899SCharles.Forsyth return error; 76*37da2899SCharles.Forsyth } 77*37da2899SCharles.Forsyth 78*37da2899SCharles.Forsyth 79*37da2899SCharles.Forsyth static FT_Error pfr_get_metrics(PFR_Face face,FT_UInt * aoutline_resolution,FT_UInt * ametrics_resolution,FT_Fixed * ametrics_x_scale,FT_Fixed * ametrics_y_scale)80*37da2899SCharles.Forsyth pfr_get_metrics( PFR_Face face, 81*37da2899SCharles.Forsyth FT_UInt *aoutline_resolution, 82*37da2899SCharles.Forsyth FT_UInt *ametrics_resolution, 83*37da2899SCharles.Forsyth FT_Fixed *ametrics_x_scale, 84*37da2899SCharles.Forsyth FT_Fixed *ametrics_y_scale ) 85*37da2899SCharles.Forsyth { 86*37da2899SCharles.Forsyth PFR_PhyFont phys = &face->phy_font; 87*37da2899SCharles.Forsyth FT_Fixed x_scale, y_scale; 88*37da2899SCharles.Forsyth FT_Size size = face->root.size; 89*37da2899SCharles.Forsyth 90*37da2899SCharles.Forsyth if ( aoutline_resolution ) 91*37da2899SCharles.Forsyth *aoutline_resolution = phys->outline_resolution; 92*37da2899SCharles.Forsyth 93*37da2899SCharles.Forsyth if ( ametrics_resolution ) 94*37da2899SCharles.Forsyth *ametrics_resolution = phys->metrics_resolution; 95*37da2899SCharles.Forsyth 96*37da2899SCharles.Forsyth x_scale = 0x10000L; 97*37da2899SCharles.Forsyth y_scale = 0x10000L; 98*37da2899SCharles.Forsyth 99*37da2899SCharles.Forsyth if ( size ) 100*37da2899SCharles.Forsyth { 101*37da2899SCharles.Forsyth x_scale = FT_DivFix( size->metrics.x_ppem << 6, 102*37da2899SCharles.Forsyth phys->metrics_resolution ); 103*37da2899SCharles.Forsyth 104*37da2899SCharles.Forsyth y_scale = FT_DivFix( size->metrics.y_ppem << 6, 105*37da2899SCharles.Forsyth phys->metrics_resolution ); 106*37da2899SCharles.Forsyth } 107*37da2899SCharles.Forsyth 108*37da2899SCharles.Forsyth if ( ametrics_x_scale ) 109*37da2899SCharles.Forsyth *ametrics_x_scale = x_scale; 110*37da2899SCharles.Forsyth 111*37da2899SCharles.Forsyth if ( ametrics_y_scale ) 112*37da2899SCharles.Forsyth *ametrics_y_scale = y_scale; 113*37da2899SCharles.Forsyth 114*37da2899SCharles.Forsyth return 0; 115*37da2899SCharles.Forsyth } 116*37da2899SCharles.Forsyth 117*37da2899SCharles.Forsyth 118*37da2899SCharles.Forsyth FT_CALLBACK_TABLE_DEF 119*37da2899SCharles.Forsyth const FT_PFR_ServiceRec pfr_service_rec = 120*37da2899SCharles.Forsyth { 121*37da2899SCharles.Forsyth (FT_PFR_GetMetricsFunc) pfr_get_metrics, 122*37da2899SCharles.Forsyth (FT_PFR_GetKerningFunc) pfr_get_kerning, 123*37da2899SCharles.Forsyth (FT_PFR_GetAdvanceFunc) pfr_get_advance 124*37da2899SCharles.Forsyth }; 125*37da2899SCharles.Forsyth 126*37da2899SCharles.Forsyth 127*37da2899SCharles.Forsyth FT_CALLBACK_TABLE_DEF 128*37da2899SCharles.Forsyth const FT_Driver_ClassRec pfr_driver_class = 129*37da2899SCharles.Forsyth { 130*37da2899SCharles.Forsyth { 131*37da2899SCharles.Forsyth ft_module_font_driver | 132*37da2899SCharles.Forsyth ft_module_driver_scalable, 133*37da2899SCharles.Forsyth 134*37da2899SCharles.Forsyth sizeof( FT_DriverRec ), 135*37da2899SCharles.Forsyth 136*37da2899SCharles.Forsyth "pfr", 137*37da2899SCharles.Forsyth 0x10000L, 138*37da2899SCharles.Forsyth 0x20000L, 139*37da2899SCharles.Forsyth 140*37da2899SCharles.Forsyth (FT_PFR_Service) &pfr_service_rec, /* format interface */ 141*37da2899SCharles.Forsyth 142*37da2899SCharles.Forsyth (FT_Module_Constructor)NULL, 143*37da2899SCharles.Forsyth (FT_Module_Destructor) NULL, 144*37da2899SCharles.Forsyth (FT_Module_Requester) NULL 145*37da2899SCharles.Forsyth }, 146*37da2899SCharles.Forsyth 147*37da2899SCharles.Forsyth sizeof( PFR_FaceRec ), 148*37da2899SCharles.Forsyth sizeof( PFR_SizeRec ), 149*37da2899SCharles.Forsyth sizeof( PFR_SlotRec ), 150*37da2899SCharles.Forsyth 151*37da2899SCharles.Forsyth (FT_Face_InitFunc) pfr_face_init, 152*37da2899SCharles.Forsyth (FT_Face_DoneFunc) pfr_face_done, 153*37da2899SCharles.Forsyth (FT_Size_InitFunc) NULL, 154*37da2899SCharles.Forsyth (FT_Size_DoneFunc) NULL, 155*37da2899SCharles.Forsyth (FT_Slot_InitFunc) pfr_slot_init, 156*37da2899SCharles.Forsyth (FT_Slot_DoneFunc) pfr_slot_done, 157*37da2899SCharles.Forsyth 158*37da2899SCharles.Forsyth (FT_Size_ResetPointsFunc) NULL, 159*37da2899SCharles.Forsyth (FT_Size_ResetPixelsFunc) NULL, 160*37da2899SCharles.Forsyth (FT_Slot_LoadFunc) pfr_slot_load, 161*37da2899SCharles.Forsyth 162*37da2899SCharles.Forsyth (FT_Face_GetKerningFunc) pfr_get_kerning, 163*37da2899SCharles.Forsyth (FT_Face_AttachFunc) 0, 164*37da2899SCharles.Forsyth (FT_Face_GetAdvancesFunc) 0 165*37da2899SCharles.Forsyth }; 166*37da2899SCharles.Forsyth 167*37da2899SCharles.Forsyth 168*37da2899SCharles.Forsyth /* END */ 169