[FREETYPE]
[reactos.git] / reactos / lib / 3rdparty / freetype / src / base / ftmm.c
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 */