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