• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
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 by the caller
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
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 by the caller
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
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 by the caller
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
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 by the caller
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
185  * @st: current draw state
186  * @user_data: User data pointer passed by the caller
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_reference (hb_draw_funcs_t *dfuncs);
284 
285 HB_EXTERN void
286 hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs);
287 
288 HB_EXTERN void
289 hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs);
290 
291 HB_EXTERN hb_bool_t
292 hb_draw_funcs_is_immutable (hb_draw_funcs_t *dfuncs);
293 
294 
295 HB_EXTERN void
296 hb_draw_move_to (hb_draw_funcs_t *dfuncs, void *draw_data,
297 		 hb_draw_state_t *st,
298 		 float to_x, float to_y);
299 
300 HB_EXTERN void
301 hb_draw_line_to (hb_draw_funcs_t *dfuncs, void *draw_data,
302 		 hb_draw_state_t *st,
303 		 float to_x, float to_y);
304 
305 HB_EXTERN void
306 hb_draw_quadratic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
307 		      hb_draw_state_t *st,
308 		      float control_x, float control_y,
309 		      float to_x, float to_y);
310 
311 HB_EXTERN void
312 hb_draw_cubic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
313 		  hb_draw_state_t *st,
314 		  float control1_x, float control1_y,
315 		  float control2_x, float control2_y,
316 		  float to_x, float to_y);
317 
318 HB_EXTERN void
319 hb_draw_close_path (hb_draw_funcs_t *dfuncs, void *draw_data,
320 		    hb_draw_state_t *st);
321 
322 
323 HB_END_DECLS
324 
325 #endif /* HB_DRAW_H */
326