/src/freetype/src/base/ftpfr.c
C | 144 lines | 86 code | 35 blank | 23 comment | 11 complexity | be7060b6a162a94f85a75784746f73fe MD5 | raw file
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 */