1 /***************************************************************************/
2 /*                                                                         */
3 /*  svmm.h                                                                 */
4 /*                                                                         */
5 /*    The FreeType Multiple Masters and GX var services (specification).   */
6 /*                                                                         */
7 /*  Copyright 2003-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 
19 #ifndef SVMM_H_
20 #define SVMM_H_
21 
22 #include FT_INTERNAL_SERVICE_H
23 
24 
25 FT_BEGIN_HEADER
26 
27 
28   /*
29    *  A service used to manage multiple-masters data in a given face.
30    *
31    *  See the related APIs in `ftmm.h' (FT_MULTIPLE_MASTERS_H).
32    *
33    */
34 
35 #define FT_SERVICE_ID_MULTI_MASTERS  "multi-masters"
36 
37 
38   typedef FT_Error
39   (*FT_Get_MM_Func)( FT_Face           face,
40                      FT_Multi_Master*  master );
41 
42   typedef FT_Error
43   (*FT_Get_MM_Var_Func)( FT_Face      face,
44                          FT_MM_Var*  *master );
45 
46   typedef FT_Error
47   (*FT_Set_MM_Design_Func)( FT_Face   face,
48                             FT_UInt   num_coords,
49                             FT_Long*  coords );
50 
51   /* use return value -1 to indicate that the new coordinates  */
52   /* are equal to the current ones; no changes are thus needed */
53   typedef FT_Error
54   (*FT_Set_Var_Design_Func)( FT_Face    face,
55                              FT_UInt    num_coords,
56                              FT_Fixed*  coords );
57 
58   /* use return value -1 to indicate that the new coordinates  */
59   /* are equal to the current ones; no changes are thus needed */
60   typedef FT_Error
61   (*FT_Set_MM_Blend_Func)( FT_Face   face,
62                            FT_UInt   num_coords,
63                            FT_Long*  coords );
64 
65   typedef FT_Error
66   (*FT_Get_Var_Design_Func)( FT_Face    face,
67                              FT_UInt    num_coords,
68                              FT_Fixed*  coords );
69 
70   typedef FT_Error
71   (*FT_Set_Instance_Func)( FT_Face  face,
72                            FT_UInt  instance_index );
73 
74   typedef FT_Error
75   (*FT_Get_MM_Blend_Func)( FT_Face   face,
76                            FT_UInt   num_coords,
77                            FT_Long*  coords );
78 
79   typedef FT_Error
80   (*FT_Get_Var_Blend_Func)( FT_Face      face,
81                             FT_UInt     *num_coords,
82                             FT_Fixed*   *coords,
83                             FT_Fixed*   *normalizedcoords,
84                             FT_MM_Var*  *mm_var );
85 
86   typedef void
87   (*FT_Done_Blend_Func)( FT_Face );
88 
89 
FT_DEFINE_SERVICE(MultiMasters)90   FT_DEFINE_SERVICE( MultiMasters )
91   {
92     FT_Get_MM_Func          get_mm;
93     FT_Set_MM_Design_Func   set_mm_design;
94     FT_Set_MM_Blend_Func    set_mm_blend;
95     FT_Get_MM_Blend_Func    get_mm_blend;
96     FT_Get_MM_Var_Func      get_mm_var;
97     FT_Set_Var_Design_Func  set_var_design;
98     FT_Get_Var_Design_Func  get_var_design;
99     FT_Set_Instance_Func    set_instance;
100 
101     /* for internal use; only needed for code sharing between modules */
102     FT_Get_Var_Blend_Func   get_var_blend;
103     FT_Done_Blend_Func      done_blend;
104   };
105 
106 
107 #ifndef FT_CONFIG_OPTION_PIC
108 
109 #define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,          \
110                                            get_mm_,         \
111                                            set_mm_design_,  \
112                                            set_mm_blend_,   \
113                                            get_mm_blend_,   \
114                                            get_mm_var_,     \
115                                            set_var_design_, \
116                                            get_var_design_, \
117                                            set_instance_,   \
118                                            get_var_blend_,  \
119                                            done_blend_ )    \
120   static const FT_Service_MultiMastersRec  class_ =         \
121   {                                                         \
122     get_mm_,                                                \
123     set_mm_design_,                                         \
124     set_mm_blend_,                                          \
125     get_mm_blend_,                                          \
126     get_mm_var_,                                            \
127     set_var_design_,                                        \
128     get_var_design_,                                        \
129     set_instance_,                                          \
130     get_var_blend_,                                         \
131     done_blend_                                             \
132   };
133 
134 #else /* FT_CONFIG_OPTION_PIC */
135 
136 #define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,               \
137                                            get_mm_,              \
138                                            set_mm_design_,       \
139                                            set_mm_blend_,        \
140                                            get_mm_blend_,        \
141                                            get_mm_var_,          \
142                                            set_var_design_,      \
143                                            get_var_design_,      \
144                                            set_instance_,        \
145                                            get_var_blend_,       \
146                                            done_blend_ )         \
147   void                                                           \
148   FT_Init_Class_ ## class_( FT_Service_MultiMastersRec*  clazz ) \
149   {                                                              \
150     clazz->get_mm         = get_mm_;                             \
151     clazz->set_mm_design  = set_mm_design_;                      \
152     clazz->set_mm_blend   = set_mm_blend_;                       \
153     clazz->get_mm_blend   = get_mm_blend_;                       \
154     clazz->get_mm_var     = get_mm_var_;                         \
155     clazz->set_var_design = set_var_design_;                     \
156     clazz->get_var_design = get_var_design_;                     \
157     clazz->set_instance   = set_instance_;                       \
158     clazz->get_var_blend  = get_var_blend_;                      \
159     clazz->done_blend     = done_blend_;                         \
160   }
161 
162 #endif /* FT_CONFIG_OPTION_PIC */
163 
164   /* */
165 
166 
167 FT_END_HEADER
168 
169 #endif /* SVMM_H_ */
170 
171 
172 /* END */
173