1 /***************************************************************************/ 2 /* */ 3 /* ftmm.c */ 4 /* */ 5 /* Multiple Master font support (body). */ 6 /* */ 7 /* Copyright 1996-2001, 2003, 2004, 2009, 2013 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 22 #include FT_MULTIPLE_MASTERS_H 23 #include FT_INTERNAL_OBJECTS_H 24 #include FT_SERVICE_MULTIPLE_MASTERS_H 25 26 27 /*************************************************************************/ 28 /* */ 29 /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 30 /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 31 /* messages during execution. */ 32 /* */ 33 #undef FT_COMPONENT 34 #define FT_COMPONENT trace_mm 35 36 37 static FT_Error 38 ft_face_get_mm_service( FT_Face face, 39 FT_Service_MultiMasters *aservice ) 40 { 41 FT_Error error; 42 43 44 *aservice = NULL; 45 46 if ( !face ) 47 return FT_THROW( Invalid_Face_Handle ); 48 49 error = FT_ERR( Invalid_Argument ); 50 51 if ( FT_HAS_MULTIPLE_MASTERS( face ) ) 52 { 53 FT_FACE_LOOKUP_SERVICE( face, 54 *aservice, 55 MULTI_MASTERS ); 56 57 if ( *aservice ) 58 error = FT_Err_Ok; 59 } 60 61 return error; 62 } 63 64 65 /* documentation is in ftmm.h */ 66 67 FT_EXPORT_DEF( FT_Error ) 68 FT_Get_Multi_Master( FT_Face face, 69 FT_Multi_Master *amaster ) 70 { 71 FT_Error error; 72 FT_Service_MultiMasters service; 73 74 75 error = ft_face_get_mm_service( face, &service ); 76 if ( !error ) 77 { 78 error = FT_ERR( Invalid_Argument ); 79 if ( service->get_mm ) 80 error = service->get_mm( face, amaster ); 81 } 82 83 return error; 84 } 85 86 87 /* documentation is in ftmm.h */ 88 89 FT_EXPORT_DEF( FT_Error ) 90 FT_Get_MM_Var( FT_Face face, 91 FT_MM_Var* *amaster ) 92 { 93 FT_Error error; 94 FT_Service_MultiMasters service; 95 96 97 error = ft_face_get_mm_service( face, &service ); 98 if ( !error ) 99 { 100 error = FT_ERR( Invalid_Argument ); 101 if ( service->get_mm_var ) 102 error = service->get_mm_var( face, amaster ); 103 } 104 105 return error; 106 } 107 108 109 /* documentation is in ftmm.h */ 110 111 FT_EXPORT_DEF( FT_Error ) 112 FT_Set_MM_Design_Coordinates( FT_Face face, 113 FT_UInt num_coords, 114 FT_Long* coords ) 115 { 116 FT_Error error; 117 FT_Service_MultiMasters service; 118 119 120 error = ft_face_get_mm_service( face, &service ); 121 if ( !error ) 122 { 123 error = FT_ERR( Invalid_Argument ); 124 if ( service->set_mm_design ) 125 error = service->set_mm_design( face, num_coords, coords ); 126 } 127 128 return error; 129 } 130 131 132 /* documentation is in ftmm.h */ 133 134 FT_EXPORT_DEF( FT_Error ) 135 FT_Set_Var_Design_Coordinates( FT_Face face, 136 FT_UInt num_coords, 137 FT_Fixed* coords ) 138 { 139 FT_Error error; 140 FT_Service_MultiMasters service; 141 142 143 error = ft_face_get_mm_service( face, &service ); 144 if ( !error ) 145 { 146 error = FT_ERR( Invalid_Argument ); 147 if ( service->set_var_design ) 148 error = service->set_var_design( face, num_coords, coords ); 149 } 150 151 return error; 152 } 153 154 155 /* documentation is in ftmm.h */ 156 157 FT_EXPORT_DEF( FT_Error ) 158 FT_Set_MM_Blend_Coordinates( FT_Face face, 159 FT_UInt num_coords, 160 FT_Fixed* coords ) 161 { 162 FT_Error error; 163 FT_Service_MultiMasters service; 164 165 166 error = ft_face_get_mm_service( face, &service ); 167 if ( !error ) 168 { 169 error = FT_ERR( Invalid_Argument ); 170 if ( service->set_mm_blend ) 171 error = service->set_mm_blend( face, num_coords, coords ); 172 } 173 174 return error; 175 } 176 177 178 /* documentation is in ftmm.h */ 179 180 /* This is exactly the same as the previous function. It exists for */ 181 /* orthogonality. */ 182 183 FT_EXPORT_DEF( FT_Error ) 184 FT_Set_Var_Blend_Coordinates( FT_Face face, 185 FT_UInt num_coords, 186 FT_Fixed* coords ) 187 { 188 FT_Error error; 189 FT_Service_MultiMasters service; 190 191 192 error = ft_face_get_mm_service( face, &service ); 193 if ( !error ) 194 { 195 error = FT_ERR( Invalid_Argument ); 196 if ( service->set_mm_blend ) 197 error = service->set_mm_blend( face, num_coords, coords ); 198 } 199 200 return error; 201 } 202 203 204 /* END */ 205