0307729811fbee522ea4008845149c712320fab7
[framework/graphics/freetype.git] / src / base / ftmm.c
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
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 )
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 )
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 )
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 )
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 )
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 )
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 */