1ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 2ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 3ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* ftmm.c */ 4ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 5ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* Multiple Master font support (body). */ 6ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 7ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4Philip P. Moltmann/* Copyright 1996-2015 by */ 8ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 10ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* This file is part of the FreeType project, and may only be used, */ 11ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* modified, and distributed under the terms of the FreeType project */ 12ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* this file you indicate that you have read the license and */ 14ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* understand and accept it fully. */ 15ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* */ 16ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/***************************************************************************/ 17ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 18e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 19e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include <ft2build.h> 20e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_DEBUG_H 21e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 22e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_MULTIPLE_MASTERS_H 23e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_INTERNAL_OBJECTS_H 24e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov#include FT_SERVICE_MULTIPLE_MASTERS_H 25ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 26ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 27ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /*************************************************************************/ 28ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 29ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 30ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 31ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* messages during execution. */ 32ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* */ 33ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#undef FT_COMPONENT 34ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov#define FT_COMPONENT trace_mm 35ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 36ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 37ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov static FT_Error 38ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov ft_face_get_mm_service( FT_Face face, 39ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters *aservice ) 40ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 41ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 42ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 43ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 44ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *aservice = NULL; 45ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 46ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !face ) 47ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return FT_THROW( Invalid_Face_Handle ); 48ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 49ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 50ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 51ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( FT_HAS_MULTIPLE_MASTERS( face ) ) 52ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 53ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_FACE_LOOKUP_SERVICE( face, 54ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov *aservice, 55ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov MULTI_MASTERS ); 56ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 57ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( *aservice ) 58ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_Err_Ok; 59ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 60ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 61ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 62ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 63ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 64ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 65ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 66ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 67ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 68ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Get_Multi_Master( FT_Face face, 69ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Multi_Master *amaster ) 70ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 71ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 72ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 73ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 74ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 75e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 76e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 77e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !amaster ) 78e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 79e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 80ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 81ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 82ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 83ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 84ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->get_mm ) 85ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_mm( face, amaster ); 86ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 87ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 88ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 89ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 90ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 91ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 92ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 93ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 94ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 95ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Get_MM_Var( FT_Face face, 96ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_MM_Var* *amaster ) 97ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 98ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 99ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 100ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 101ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 102e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 103e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 104e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !amaster ) 105e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 106e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 107ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 108ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 109ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 110ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 111ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->get_mm_var ) 112ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->get_mm_var( face, amaster ); 113ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 114ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 115ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 116ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 117ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 118ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 119ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 120ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 121ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 122ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Set_MM_Design_Coordinates( FT_Face face, 123ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt num_coords, 124ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Long* coords ) 125ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 126ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 127ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 128ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 129ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 130e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 131e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 132e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !coords ) 133e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 134e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 135ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 136ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 137ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 138ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 139ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->set_mm_design ) 140ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->set_mm_design( face, num_coords, coords ); 141ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 142ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 143ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 144ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 145ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 146ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 147ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 148ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 149ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 150ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Set_Var_Design_Coordinates( FT_Face face, 151ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt num_coords, 152ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed* coords ) 153ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 154ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 155ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 156ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 157ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 158e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 159e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 160e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !coords ) 161e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 162e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 163ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 164ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 165ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 166ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 167ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->set_var_design ) 168ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->set_var_design( face, num_coords, coords ); 169ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 170ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 171ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 172ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 173ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 174ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 175ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 176ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 177ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 178ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Set_MM_Blend_Coordinates( FT_Face face, 179ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt num_coords, 180ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed* coords ) 181ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 182ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 183ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 184ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 185ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 186e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 187e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 188e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !coords ) 189e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 190e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 191ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 192ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 193ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 194ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 195ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->set_mm_blend ) 196ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->set_mm_blend( face, num_coords, coords ); 197ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 198ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 199ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 200ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 201ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 202ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 203ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* documentation is in ftmm.h */ 204ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 205ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* This is exactly the same as the previous function. It exists for */ 206ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov /* orthogonality. */ 207ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 208ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_EXPORT_DEF( FT_Error ) 209ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Set_Var_Blend_Coordinates( FT_Face face, 210ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_UInt num_coords, 211ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Fixed* coords ) 212ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 213ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Error error; 214ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov FT_Service_MultiMasters service; 215ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 216ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 217e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov /* check of `face' delayed to `ft_face_get_mm_service' */ 218e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 219e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov if ( !coords ) 220e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov return FT_THROW( Invalid_Argument ); 221e6986e1e8d4a57987f47c215490cb080a65ee29aSvet Ganov 222ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = ft_face_get_mm_service( face, &service ); 223ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( !error ) 224ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov { 225ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = FT_ERR( Invalid_Argument ); 226ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov if ( service->set_mm_blend ) 227ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov error = service->set_mm_blend( face, num_coords, coords ); 228ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 229ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 230ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov return error; 231ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov } 232ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 233ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov 234ee451cb395940862dad63c85adfe8f2fd55e864cSvet Ganov/* END */ 235