1 /****************************************************************************
2  *
3  * svmm.h
4  *
5  *   The FreeType Multiple Masters and GX var services (specification).
6  *
7  * Copyright (C) 2003-2020 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 <freetype/internal/ftserv.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   typedef FT_Error
90   (*FT_Set_MM_WeightVector_Func)( FT_Face    face,
91                                   FT_UInt    len,
92                                   FT_Fixed*  weight_vector );
93 
94   typedef FT_Error
95   (*FT_Get_MM_WeightVector_Func)( FT_Face    face,
96                                   FT_UInt*   len,
97                                   FT_Fixed*  weight_vector );
98 
99 
FT_DEFINE_SERVICE(MultiMasters)100   FT_DEFINE_SERVICE( MultiMasters )
101   {
102     FT_Get_MM_Func               get_mm;
103     FT_Set_MM_Design_Func        set_mm_design;
104     FT_Set_MM_Blend_Func         set_mm_blend;
105     FT_Get_MM_Blend_Func         get_mm_blend;
106     FT_Get_MM_Var_Func           get_mm_var;
107     FT_Set_Var_Design_Func       set_var_design;
108     FT_Get_Var_Design_Func       get_var_design;
109     FT_Set_Instance_Func         set_instance;
110     FT_Set_MM_WeightVector_Func  set_mm_weightvector;
111     FT_Get_MM_WeightVector_Func  get_mm_weightvector;
112 
113     /* for internal use; only needed for code sharing between modules */
114     FT_Get_Var_Blend_Func  get_var_blend;
115     FT_Done_Blend_Func     done_blend;
116   };
117 
118 
119 #define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_,            \
120                                            get_mm_,           \
121                                            set_mm_design_,    \
122                                            set_mm_blend_,     \
123                                            get_mm_blend_,     \
124                                            get_mm_var_,       \
125                                            set_var_design_,   \
126                                            get_var_design_,   \
127                                            set_instance_,     \
128                                            set_weightvector_, \
129                                            get_weightvector_, \
130                                            get_var_blend_,    \
131                                            done_blend_ )      \
132   static const FT_Service_MultiMastersRec  class_ =           \
133   {                                                           \
134     get_mm_,                                                  \
135     set_mm_design_,                                           \
136     set_mm_blend_,                                            \
137     get_mm_blend_,                                            \
138     get_mm_var_,                                              \
139     set_var_design_,                                          \
140     get_var_design_,                                          \
141     set_instance_,                                            \
142     set_weightvector_,                                        \
143     get_weightvector_,                                        \
144     get_var_blend_,                                           \
145     done_blend_                                               \
146   };
147 
148   /* */
149 
150 
151 FT_END_HEADER
152 
153 #endif /* SVMM_H_ */
154 
155 
156 /* END */
157