1/***************************************************************************/ 2/* */ 3/* ftpfr.c */ 4/* */ 5/* FreeType API for accessing PFR-specific data (body). */ 6/* */ 7/* Copyright 2002-2004, 2008, 2010, 2013, 2014 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 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 ) 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 ) 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 ) 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