1 | /* |
2 | * Copyright © 2019-2020 Ebrahim Byagowi |
3 | * |
4 | * This is part of HarfBuzz, a text shaping library. |
5 | * |
6 | * Permission is hereby granted, without written agreement and without |
7 | * license or royalty fees, to use, copy, modify, and distribute this |
8 | * software and its documentation for any purpose, provided that the |
9 | * above copyright notice and the following two paragraphs appear in |
10 | * all copies of this software. |
11 | * |
12 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
13 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
14 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
15 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
16 | * DAMAGE. |
17 | * |
18 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
19 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
20 | * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
21 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
22 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
23 | */ |
24 | |
25 | #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR) |
26 | #error "Include <hb.h> instead." |
27 | #endif |
28 | |
29 | #ifndef HB_DRAW_H |
30 | #define HB_DRAW_H |
31 | |
32 | #include "hb.h" |
33 | |
34 | HB_BEGIN_DECLS |
35 | |
36 | |
37 | /** |
38 | * hb_draw_state_t |
39 | * @path_open: Whether there is an open path |
40 | * @path_start_x: X component of the start of current path |
41 | * @path_start_y: Y component of the start of current path |
42 | * @current_x: X component of current point |
43 | * @current_y: Y component of current point |
44 | * |
45 | * Current drawing state. |
46 | * |
47 | * Since: 4.0.0 |
48 | **/ |
49 | typedef struct hb_draw_state_t { |
50 | hb_bool_t path_open; |
51 | |
52 | float path_start_x; |
53 | float path_start_y; |
54 | |
55 | float current_x; |
56 | float current_y; |
57 | |
58 | /*< private >*/ |
59 | hb_var_num_t reserved1; |
60 | hb_var_num_t reserved2; |
61 | hb_var_num_t reserved3; |
62 | hb_var_num_t reserved4; |
63 | hb_var_num_t reserved5; |
64 | hb_var_num_t reserved6; |
65 | hb_var_num_t reserved7; |
66 | } hb_draw_state_t; |
67 | |
68 | /** |
69 | * HB_DRAW_STATE_DEFAULT: |
70 | * |
71 | * The default #hb_draw_state_t at the start of glyph drawing. |
72 | */ |
73 | #define HB_DRAW_STATE_DEFAULT {0, 0.f, 0.f, 0.f, 0.f, {0.}, {0.}, {0.}} |
74 | |
75 | |
76 | /** |
77 | * hb_draw_funcs_t: |
78 | * |
79 | * Glyph draw callbacks. |
80 | * |
81 | * #hb_draw_move_to_func_t, #hb_draw_line_to_func_t and |
82 | * #hb_draw_cubic_to_func_t calls are necessary to be defined but we translate |
83 | * #hb_draw_quadratic_to_func_t calls to #hb_draw_cubic_to_func_t if the |
84 | * callback isn't defined. |
85 | * |
86 | * Since: 4.0.0 |
87 | **/ |
88 | |
89 | typedef struct hb_draw_funcs_t hb_draw_funcs_t; |
90 | |
91 | |
92 | /** |
93 | * hb_draw_move_to_func_t: |
94 | * @dfuncs: draw functions object |
95 | * @draw_data: The data accompanying the draw functions in hb_font_draw_glyph() |
96 | * @st: current draw state |
97 | * @to_x: X component of target point |
98 | * @to_y: Y component of target point |
99 | * @user_data: User data pointer passed to hb_draw_funcs_set_move_to_func() |
100 | * |
101 | * A virtual method for the #hb_draw_funcs_t to perform a "move-to" draw |
102 | * operation. |
103 | * |
104 | * Since: 4.0.0 |
105 | * |
106 | **/ |
107 | typedef void (*hb_draw_move_to_func_t) (hb_draw_funcs_t *dfuncs, void *draw_data, |
108 | hb_draw_state_t *st, |
109 | float to_x, float to_y, |
110 | void *user_data); |
111 | |
112 | /** |
113 | * hb_draw_line_to_func_t: |
114 | * @dfuncs: draw functions object |
115 | * @draw_data: The data accompanying the draw functions in hb_font_draw_glyph() |
116 | * @st: current draw state |
117 | * @to_x: X component of target point |
118 | * @to_y: Y component of target point |
119 | * @user_data: User data pointer passed to hb_draw_funcs_set_line_to_func() |
120 | * |
121 | * A virtual method for the #hb_draw_funcs_t to perform a "line-to" draw |
122 | * operation. |
123 | * |
124 | * Since: 4.0.0 |
125 | * |
126 | **/ |
127 | typedef void (*hb_draw_line_to_func_t) (hb_draw_funcs_t *dfuncs, void *draw_data, |
128 | hb_draw_state_t *st, |
129 | float to_x, float to_y, |
130 | void *user_data); |
131 | |
132 | /** |
133 | * hb_draw_quadratic_to_func_t: |
134 | * @dfuncs: draw functions object |
135 | * @draw_data: The data accompanying the draw functions in hb_font_draw_glyph() |
136 | * @st: current draw state |
137 | * @control_x: X component of control point |
138 | * @control_y: Y component of control point |
139 | * @to_x: X component of target point |
140 | * @to_y: Y component of target point |
141 | * @user_data: User data pointer passed to hb_draw_funcs_set_quadratic_to_func() |
142 | * |
143 | * A virtual method for the #hb_draw_funcs_t to perform a "quadratic-to" draw |
144 | * operation. |
145 | * |
146 | * Since: 4.0.0 |
147 | * |
148 | **/ |
149 | typedef void (*hb_draw_quadratic_to_func_t) (hb_draw_funcs_t *dfuncs, void *draw_data, |
150 | hb_draw_state_t *st, |
151 | float control_x, float control_y, |
152 | float to_x, float to_y, |
153 | void *user_data); |
154 | |
155 | /** |
156 | * hb_draw_cubic_to_func_t: |
157 | * @dfuncs: draw functions object |
158 | * @draw_data: The data accompanying the draw functions in hb_font_draw_glyph() |
159 | * @st: current draw state |
160 | * @control1_x: X component of first control point |
161 | * @control1_y: Y component of first control point |
162 | * @control2_x: X component of second control point |
163 | * @control2_y: Y component of second control point |
164 | * @to_x: X component of target point |
165 | * @to_y: Y component of target point |
166 | * @user_data: User data pointer passed to hb_draw_funcs_set_cubic_to_func() |
167 | * |
168 | * A virtual method for the #hb_draw_funcs_t to perform a "cubic-to" draw |
169 | * operation. |
170 | * |
171 | * Since: 4.0.0 |
172 | * |
173 | **/ |
174 | typedef void (*hb_draw_cubic_to_func_t) (hb_draw_funcs_t *dfuncs, void *draw_data, |
175 | hb_draw_state_t *st, |
176 | float control1_x, float control1_y, |
177 | float control2_x, float control2_y, |
178 | float to_x, float to_y, |
179 | void *user_data); |
180 | |
181 | /** |
182 | * hb_draw_close_path_func_t: |
183 | * @dfuncs: draw functions object |
184 | * @draw_data: The data accompanying the draw functions in hb_font_draw_glyph() |
185 | * @st: current draw state |
186 | * @user_data: User data pointer passed to hb_draw_funcs_set_close_path_func() |
187 | * |
188 | * A virtual method for the #hb_draw_funcs_t to perform a "close-path" draw |
189 | * operation. |
190 | * |
191 | * Since: 4.0.0 |
192 | * |
193 | **/ |
194 | typedef void (*hb_draw_close_path_func_t) (hb_draw_funcs_t *dfuncs, void *draw_data, |
195 | hb_draw_state_t *st, |
196 | void *user_data); |
197 | |
198 | /** |
199 | * hb_draw_funcs_set_move_to_func: |
200 | * @dfuncs: draw functions object |
201 | * @func: (closure user_data) (destroy destroy) (scope notified): move-to callback |
202 | * @user_data: Data to pass to @func |
203 | * @destroy: (nullable): The function to call when @user_data is not needed anymore |
204 | * |
205 | * Sets move-to callback to the draw functions object. |
206 | * |
207 | * Since: 4.0.0 |
208 | **/ |
209 | HB_EXTERN void |
210 | hb_draw_funcs_set_move_to_func (hb_draw_funcs_t *dfuncs, |
211 | hb_draw_move_to_func_t func, |
212 | void *user_data, hb_destroy_func_t destroy); |
213 | |
214 | /** |
215 | * hb_draw_funcs_set_line_to_func: |
216 | * @dfuncs: draw functions object |
217 | * @func: (closure user_data) (destroy destroy) (scope notified): line-to callback |
218 | * @user_data: Data to pass to @func |
219 | * @destroy: (nullable): The function to call when @user_data is not needed anymore |
220 | * |
221 | * Sets line-to callback to the draw functions object. |
222 | * |
223 | * Since: 4.0.0 |
224 | **/ |
225 | HB_EXTERN void |
226 | hb_draw_funcs_set_line_to_func (hb_draw_funcs_t *dfuncs, |
227 | hb_draw_line_to_func_t func, |
228 | void *user_data, hb_destroy_func_t destroy); |
229 | |
230 | /** |
231 | * hb_draw_funcs_set_quadratic_to_func: |
232 | * @dfuncs: draw functions object |
233 | * @func: (closure user_data) (destroy destroy) (scope notified): quadratic-to callback |
234 | * @user_data: Data to pass to @func |
235 | * @destroy: (nullable): The function to call when @user_data is not needed anymore |
236 | * |
237 | * Sets quadratic-to callback to the draw functions object. |
238 | * |
239 | * Since: 4.0.0 |
240 | **/ |
241 | HB_EXTERN void |
242 | hb_draw_funcs_set_quadratic_to_func (hb_draw_funcs_t *dfuncs, |
243 | hb_draw_quadratic_to_func_t func, |
244 | void *user_data, hb_destroy_func_t destroy); |
245 | |
246 | /** |
247 | * hb_draw_funcs_set_cubic_to_func: |
248 | * @dfuncs: draw functions |
249 | * @func: (closure user_data) (destroy destroy) (scope notified): cubic-to callback |
250 | * @user_data: Data to pass to @func |
251 | * @destroy: (nullable): The function to call when @user_data is not needed anymore |
252 | * |
253 | * Sets cubic-to callback to the draw functions object. |
254 | * |
255 | * Since: 4.0.0 |
256 | **/ |
257 | HB_EXTERN void |
258 | hb_draw_funcs_set_cubic_to_func (hb_draw_funcs_t *dfuncs, |
259 | hb_draw_cubic_to_func_t func, |
260 | void *user_data, hb_destroy_func_t destroy); |
261 | |
262 | /** |
263 | * hb_draw_funcs_set_close_path_func: |
264 | * @dfuncs: draw functions object |
265 | * @func: (closure user_data) (destroy destroy) (scope notified): close-path callback |
266 | * @user_data: Data to pass to @func |
267 | * @destroy: (nullable): The function to call when @user_data is not needed anymore |
268 | * |
269 | * Sets close-path callback to the draw functions object. |
270 | * |
271 | * Since: 4.0.0 |
272 | **/ |
273 | HB_EXTERN void |
274 | hb_draw_funcs_set_close_path_func (hb_draw_funcs_t *dfuncs, |
275 | hb_draw_close_path_func_t func, |
276 | void *user_data, hb_destroy_func_t destroy); |
277 | |
278 | |
279 | HB_EXTERN hb_draw_funcs_t * |
280 | hb_draw_funcs_create (void); |
281 | |
282 | HB_EXTERN hb_draw_funcs_t * |
283 | hb_draw_funcs_get_empty (void); |
284 | |
285 | HB_EXTERN hb_draw_funcs_t * |
286 | hb_draw_funcs_reference (hb_draw_funcs_t *dfuncs); |
287 | |
288 | HB_EXTERN void |
289 | hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs); |
290 | |
291 | HB_EXTERN hb_bool_t |
292 | hb_draw_funcs_set_user_data (hb_draw_funcs_t *dfuncs, |
293 | hb_user_data_key_t *key, |
294 | void * data, |
295 | hb_destroy_func_t destroy, |
296 | hb_bool_t replace); |
297 | |
298 | |
299 | HB_EXTERN void * |
300 | hb_draw_funcs_get_user_data (const hb_draw_funcs_t *dfuncs, |
301 | hb_user_data_key_t *key); |
302 | |
303 | HB_EXTERN void |
304 | hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs); |
305 | |
306 | HB_EXTERN hb_bool_t |
307 | hb_draw_funcs_is_immutable (hb_draw_funcs_t *dfuncs); |
308 | |
309 | |
310 | HB_EXTERN void |
311 | hb_draw_move_to (hb_draw_funcs_t *dfuncs, void *draw_data, |
312 | hb_draw_state_t *st, |
313 | float to_x, float to_y); |
314 | |
315 | HB_EXTERN void |
316 | hb_draw_line_to (hb_draw_funcs_t *dfuncs, void *draw_data, |
317 | hb_draw_state_t *st, |
318 | float to_x, float to_y); |
319 | |
320 | HB_EXTERN void |
321 | hb_draw_quadratic_to (hb_draw_funcs_t *dfuncs, void *draw_data, |
322 | hb_draw_state_t *st, |
323 | float control_x, float control_y, |
324 | float to_x, float to_y); |
325 | |
326 | HB_EXTERN void |
327 | hb_draw_cubic_to (hb_draw_funcs_t *dfuncs, void *draw_data, |
328 | hb_draw_state_t *st, |
329 | float control1_x, float control1_y, |
330 | float control2_x, float control2_y, |
331 | float to_x, float to_y); |
332 | |
333 | HB_EXTERN void |
334 | hb_draw_close_path (hb_draw_funcs_t *dfuncs, void *draw_data, |
335 | hb_draw_state_t *st); |
336 | |
337 | |
338 | HB_END_DECLS |
339 | |
340 | #endif /* HB_DRAW_H */ |
341 | |