1 /**************************************************************************** 2 * 3 * ftpfr.c 4 * 5 * FreeType API for accessing PFR-specific data (body). 6 * 7 * Copyright 2002-2018 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_DEBUG_H 20 21 #include FT_INTERNAL_OBJECTS_H 22 #include FT_SERVICE_PFR_H 23 24 25 /* check the format */ 26 static FT_Service_PfrMetrics ft_pfr_check(FT_Face face)27 ft_pfr_check( FT_Face face ) 28 { 29 FT_Service_PfrMetrics service = NULL; 30 31 32 if ( face ) 33 FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); 34 35 return service; 36 } 37 38 39 /* documentation is in ftpfr.h */ 40 41 FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Metrics(FT_Face face,FT_UInt * aoutline_resolution,FT_UInt * ametrics_resolution,FT_Fixed * ametrics_x_scale,FT_Fixed * ametrics_y_scale)42 FT_Get_PFR_Metrics( FT_Face face, 43 FT_UInt *aoutline_resolution, 44 FT_UInt *ametrics_resolution, 45 FT_Fixed *ametrics_x_scale, 46 FT_Fixed *ametrics_y_scale ) 47 { 48 FT_Error error = FT_Err_Ok; 49 FT_Service_PfrMetrics service; 50 51 52 if ( !face ) 53 return FT_THROW( Invalid_Face_Handle ); 54 55 service = ft_pfr_check( face ); 56 if ( service ) 57 { 58 error = service->get_metrics( face, 59 aoutline_resolution, 60 ametrics_resolution, 61 ametrics_x_scale, 62 ametrics_y_scale ); 63 } 64 else 65 { 66 FT_Fixed x_scale, y_scale; 67 68 69 /* this is not a PFR font */ 70 if ( aoutline_resolution ) 71 *aoutline_resolution = face->units_per_EM; 72 73 if ( ametrics_resolution ) 74 *ametrics_resolution = face->units_per_EM; 75 76 x_scale = y_scale = 0x10000L; 77 if ( face->size ) 78 { 79 x_scale = face->size->metrics.x_scale; 80 y_scale = face->size->metrics.y_scale; 81 } 82 83 if ( ametrics_x_scale ) 84 *ametrics_x_scale = x_scale; 85 86 if ( ametrics_y_scale ) 87 *ametrics_y_scale = y_scale; 88 89 error = FT_THROW( Unknown_File_Format ); 90 } 91 92 return error; 93 } 94 95 96 /* documentation is in ftpfr.h */ 97 98 FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Kerning(FT_Face face,FT_UInt left,FT_UInt right,FT_Vector * avector)99 FT_Get_PFR_Kerning( FT_Face face, 100 FT_UInt left, 101 FT_UInt right, 102 FT_Vector *avector ) 103 { 104 FT_Error error; 105 FT_Service_PfrMetrics service; 106 107 108 if ( !face ) 109 return FT_THROW( Invalid_Face_Handle ); 110 111 if ( !avector ) 112 return FT_THROW( Invalid_Argument ); 113 114 service = ft_pfr_check( face ); 115 if ( service ) 116 error = service->get_kerning( face, left, right, avector ); 117 else 118 error = FT_Get_Kerning( face, left, right, 119 FT_KERNING_UNSCALED, avector ); 120 121 return error; 122 } 123 124 125 /* documentation is in ftpfr.h */ 126 127 FT_EXPORT_DEF( FT_Error ) FT_Get_PFR_Advance(FT_Face face,FT_UInt gindex,FT_Pos * aadvance)128 FT_Get_PFR_Advance( FT_Face face, 129 FT_UInt gindex, 130 FT_Pos *aadvance ) 131 { 132 FT_Error error; 133 FT_Service_PfrMetrics service; 134 135 136 if ( !face ) 137 return FT_THROW( Invalid_Face_Handle ); 138 139 if ( !aadvance ) 140 return FT_THROW( Invalid_Argument ); 141 142 service = ft_pfr_check( face ); 143 if ( service ) 144 error = service->get_advance( face, gindex, aadvance ); 145 else 146 /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ 147 error = FT_THROW( Invalid_Argument ); 148 149 return error; 150 } 151 152 153 /* END */ 154