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
34HB_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 **/
49typedef 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
89typedef 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 **/
107typedef 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 **/
127typedef 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 **/
149typedef 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 **/
174typedef 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 **/
194typedef 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 **/
209HB_EXTERN void
210hb_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 **/
225HB_EXTERN void
226hb_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 **/
241HB_EXTERN void
242hb_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 **/
257HB_EXTERN void
258hb_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 **/
273HB_EXTERN void
274hb_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
279HB_EXTERN hb_draw_funcs_t *
280hb_draw_funcs_create (void);
281
282HB_EXTERN hb_draw_funcs_t *
283hb_draw_funcs_get_empty (void);
284
285HB_EXTERN hb_draw_funcs_t *
286hb_draw_funcs_reference (hb_draw_funcs_t *dfuncs);
287
288HB_EXTERN void
289hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs);
290
291HB_EXTERN hb_bool_t
292hb_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
299HB_EXTERN void *
300hb_draw_funcs_get_user_data (const hb_draw_funcs_t *dfuncs,
301 hb_user_data_key_t *key);
302
303HB_EXTERN void
304hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs);
305
306HB_EXTERN hb_bool_t
307hb_draw_funcs_is_immutable (hb_draw_funcs_t *dfuncs);
308
309
310HB_EXTERN void
311hb_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
315HB_EXTERN void
316hb_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
320HB_EXTERN void
321hb_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
326HB_EXTERN void
327hb_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
333HB_EXTERN void
334hb_draw_close_path (hb_draw_funcs_t *dfuncs, void *draw_data,
335 hb_draw_state_t *st);
336
337
338HB_END_DECLS
339
340#endif /* HB_DRAW_H */
341