blob: 940f8640a7e4157b58b9a5ef904354d7d38d1666 [file] [log] [blame]
Werner Lemberga3b6c6c2000-05-31 06:55:12 +00001/***************************************************************************/
2/* */
3/* ftmm.c */
4/* */
5/* Multiple Master font support (body). */
6/* */
Werner Lemberg44bb3032004-04-25 20:15:11 +00007/* Copyright 1996-2001, 2003, 2004 by */
Werner Lemberga3b6c6c2000-05-31 06:55:12 +00008/* David Turner, Robert Wilhelm, and Werner Lemberg. */
9/* */
Werner Lemberg4e6dd852000-06-05 05:26:15 +000010/* This file is part of the FreeType project, and may only be used, */
11/* modified, and distributed under the terms of the FreeType project */
Werner Lemberga3b6c6c2000-05-31 06:55:12 +000012/* 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
Werner Lembergcc069be2000-12-08 16:17:16 +000018
19#include <ft2build.h>
20#include FT_MULTIPLE_MASTERS_H
21#include FT_INTERNAL_OBJECTS_H
David Turnerc313c502003-09-11 19:51:54 +000022#include FT_SERVICE_MULTIPLE_MASTERS_H
David Turner11187202000-05-26 17:13:23 +000023
Werner Lembergeb81e372000-06-03 06:03:11 +000024
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
Werner Lemberg013efd12003-09-17 05:26:33 +000034
David Turnerc313c502003-09-11 19:51:54 +000035 static FT_Error
36 ft_face_get_mm_service( FT_Face face,
37 FT_Service_MultiMasters *aservice )
38 {
39 FT_Error error;
David Turnere2d12842003-09-21 17:15:55 +000040
Werner Lemberg013efd12003-09-17 05:26:33 +000041
David Turnerc313c502003-09-11 19:51:54 +000042 *aservice = NULL;
David Turnere2d12842003-09-21 17:15:55 +000043
David Turnerc313c502003-09-11 19:51:54 +000044 if ( !face )
45 return FT_Err_Invalid_Face_Handle;
David Turnere2d12842003-09-21 17:15:55 +000046
David Turnerc313c502003-09-11 19:51:54 +000047 error = FT_Err_Invalid_Argument;
David Turnere2d12842003-09-21 17:15:55 +000048
David Turnerc313c502003-09-11 19:51:54 +000049 if ( FT_HAS_MULTIPLE_MASTERS( face ) )
50 {
Werner Lemberg46333a12003-09-17 19:20:02 +000051 FT_FACE_LOOKUP_SERVICE( face,
David Turnere2d12842003-09-21 17:15:55 +000052 *aservice,
53 MULTI_MASTERS );
Werner Lemberg52f911a2003-10-07 05:49:41 +000054
55 if ( aservice )
56 error = FT_Err_Ok;
David Turnerc313c502003-09-11 19:51:54 +000057 }
Werner Lemberg013efd12003-09-17 05:26:33 +000058
David Turnerc313c502003-09-11 19:51:54 +000059 return error;
60 }
61
Werner Lembergeb81e372000-06-03 06:03:11 +000062
Werner Lemberg90a03302000-11-07 17:21:11 +000063 /* documentation is in ftmm.h */
64
Werner Lembergf814d0f2001-06-27 16:18:10 +000065 FT_EXPORT_DEF( FT_Error )
66 FT_Get_Multi_Master( FT_Face face,
67 FT_Multi_Master *amaster )
David Turner11187202000-05-26 17:13:23 +000068 {
David Turnerc313c502003-09-11 19:51:54 +000069 FT_Error error;
70 FT_Service_MultiMasters service;
Werner Lemberga3b6c6c2000-05-31 06:55:12 +000071
Werner Lemberg013efd12003-09-17 05:26:33 +000072
David Turnerc313c502003-09-11 19:51:54 +000073 error = ft_face_get_mm_service( face, &service );
74 if ( !error )
David Turner11187202000-05-26 17:13:23 +000075 {
David Turnerc313c502003-09-11 19:51:54 +000076 error = FT_Err_Invalid_Argument;
77 if ( service->get_mm )
78 error = service->get_mm( face, amaster );
David Turner11187202000-05-26 17:13:23 +000079 }
David Turnere2d12842003-09-21 17:15:55 +000080
David Turner11187202000-05-26 17:13:23 +000081 return error;
Werner Lembergeb81e372000-06-03 06:03:11 +000082 }
David Turner11187202000-05-26 17:13:23 +000083
84
Werner Lemberg90a03302000-11-07 17:21:11 +000085 /* documentation is in ftmm.h */
86
Werner Lembergf814d0f2001-06-27 16:18:10 +000087 FT_EXPORT_DEF( FT_Error )
Werner Lemberg44bb3032004-04-25 20:15:11 +000088 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 )
Werner Lembergf814d0f2001-06-27 16:18:10 +0000110 FT_Set_MM_Design_Coordinates( FT_Face face,
111 FT_UInt num_coords,
112 FT_Long* coords )
David Turner11187202000-05-26 17:13:23 +0000113 {
David Turnerc313c502003-09-11 19:51:54 +0000114 FT_Error error;
115 FT_Service_MultiMasters service;
Werner Lemberga3b6c6c2000-05-31 06:55:12 +0000116
Werner Lemberg013efd12003-09-17 05:26:33 +0000117
David Turnerc313c502003-09-11 19:51:54 +0000118 error = ft_face_get_mm_service( face, &service );
119 if ( !error )
David Turner11187202000-05-26 17:13:23 +0000120 {
David Turnerc313c502003-09-11 19:51:54 +0000121 error = FT_Err_Invalid_Argument;
122 if ( service->set_mm_design )
123 error = service->set_mm_design( face, num_coords, coords );
David Turner11187202000-05-26 17:13:23 +0000124 }
Werner Lemberg013efd12003-09-17 05:26:33 +0000125
David Turner11187202000-05-26 17:13:23 +0000126 return error;
Werner Lembergeb81e372000-06-03 06:03:11 +0000127 }
David Turner11187202000-05-26 17:13:23 +0000128
Werner Lemberga3b6c6c2000-05-31 06:55:12 +0000129
Werner Lemberg90a03302000-11-07 17:21:11 +0000130 /* documentation is in ftmm.h */
131
Werner Lembergf814d0f2001-06-27 16:18:10 +0000132 FT_EXPORT_DEF( FT_Error )
Werner Lemberg44bb3032004-04-25 20:15:11 +0000133 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 )
Werner Lembergf814d0f2001-06-27 16:18:10 +0000156 FT_Set_MM_Blend_Coordinates( FT_Face face,
Werner Lembergdc72aff2000-11-04 08:33:38 +0000157 FT_UInt num_coords,
158 FT_Fixed* coords )
Werner Lembergeb81e372000-06-03 06:03:11 +0000159 {
David Turnerc313c502003-09-11 19:51:54 +0000160 FT_Error error;
161 FT_Service_MultiMasters service;
Werner Lemberga3b6c6c2000-05-31 06:55:12 +0000162
Werner Lemberg013efd12003-09-17 05:26:33 +0000163
David Turnerc313c502003-09-11 19:51:54 +0000164 error = ft_face_get_mm_service( face, &service );
165 if ( !error )
David Turner11187202000-05-26 17:13:23 +0000166 {
David Turnerc313c502003-09-11 19:51:54 +0000167 error = FT_Err_Invalid_Argument;
168 if ( service->set_mm_blend )
169 error = service->set_mm_blend( face, num_coords, coords );
David Turner11187202000-05-26 17:13:23 +0000170 }
Werner Lemberg013efd12003-09-17 05:26:33 +0000171
David Turner11187202000-05-26 17:13:23 +0000172 return error;
173 }
174
Werner Lemberg013efd12003-09-17 05:26:33 +0000175
Werner Lemberg44bb3032004-04-25 20:15:11 +0000176 /* 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
Werner Lemberga3b6c6c2000-05-31 06:55:12 +0000202/* END */