1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2019-2020 Ebrahim Byagowi
3*2d1272b8SAndroid Build Coastguard Worker *
4*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
5*2d1272b8SAndroid Build Coastguard Worker *
6*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
7*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
8*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
9*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
10*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
11*2d1272b8SAndroid Build Coastguard Worker *
12*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
17*2d1272b8SAndroid Build Coastguard Worker *
18*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23*2d1272b8SAndroid Build Coastguard Worker */
24*2d1272b8SAndroid Build Coastguard Worker
25*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
26*2d1272b8SAndroid Build Coastguard Worker
27*2d1272b8SAndroid Build Coastguard Worker #ifndef HB_NO_DRAW
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-draw.hh"
30*2d1272b8SAndroid Build Coastguard Worker
31*2d1272b8SAndroid Build Coastguard Worker /**
32*2d1272b8SAndroid Build Coastguard Worker * SECTION:hb-draw
33*2d1272b8SAndroid Build Coastguard Worker * @title: hb-draw
34*2d1272b8SAndroid Build Coastguard Worker * @short_description: Glyph drawing
35*2d1272b8SAndroid Build Coastguard Worker * @include: hb.h
36*2d1272b8SAndroid Build Coastguard Worker *
37*2d1272b8SAndroid Build Coastguard Worker * Functions for drawing (extracting) glyph shapes.
38*2d1272b8SAndroid Build Coastguard Worker *
39*2d1272b8SAndroid Build Coastguard Worker * The #hb_draw_funcs_t struct can be used with hb_font_draw_glyph().
40*2d1272b8SAndroid Build Coastguard Worker **/
41*2d1272b8SAndroid Build Coastguard Worker
42*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_move_to_nil(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data HB_UNUSED,hb_draw_state_t * st HB_UNUSED,float to_x HB_UNUSED,float to_y HB_UNUSED,void * user_data HB_UNUSED)43*2d1272b8SAndroid Build Coastguard Worker hb_draw_move_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
44*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st HB_UNUSED,
45*2d1272b8SAndroid Build Coastguard Worker float to_x HB_UNUSED, float to_y HB_UNUSED,
46*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED) {}
47*2d1272b8SAndroid Build Coastguard Worker
48*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_line_to_nil(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data HB_UNUSED,hb_draw_state_t * st HB_UNUSED,float to_x HB_UNUSED,float to_y HB_UNUSED,void * user_data HB_UNUSED)49*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
50*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st HB_UNUSED,
51*2d1272b8SAndroid Build Coastguard Worker float to_x HB_UNUSED, float to_y HB_UNUSED,
52*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED) {}
53*2d1272b8SAndroid Build Coastguard Worker
54*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_quadratic_to_nil(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st,float control_x,float control_y,float to_x,float to_y,void * user_data HB_UNUSED)55*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to_nil (hb_draw_funcs_t *dfuncs, void *draw_data,
56*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
57*2d1272b8SAndroid Build Coastguard Worker float control_x, float control_y,
58*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y,
59*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
60*2d1272b8SAndroid Build Coastguard Worker {
61*2d1272b8SAndroid Build Coastguard Worker #define HB_ONE_THIRD 0.33333333f
62*2d1272b8SAndroid Build Coastguard Worker dfuncs->emit_cubic_to (draw_data, *st,
63*2d1272b8SAndroid Build Coastguard Worker (st->current_x + 2.f * control_x) * HB_ONE_THIRD,
64*2d1272b8SAndroid Build Coastguard Worker (st->current_y + 2.f * control_y) * HB_ONE_THIRD,
65*2d1272b8SAndroid Build Coastguard Worker (to_x + 2.f * control_x) * HB_ONE_THIRD,
66*2d1272b8SAndroid Build Coastguard Worker (to_y + 2.f * control_y) * HB_ONE_THIRD,
67*2d1272b8SAndroid Build Coastguard Worker to_x, to_y);
68*2d1272b8SAndroid Build Coastguard Worker #undef HB_ONE_THIRD
69*2d1272b8SAndroid Build Coastguard Worker }
70*2d1272b8SAndroid Build Coastguard Worker
71*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_cubic_to_nil(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data HB_UNUSED,hb_draw_state_t * st HB_UNUSED,float control1_x HB_UNUSED,float control1_y HB_UNUSED,float control2_x HB_UNUSED,float control2_y HB_UNUSED,float to_x HB_UNUSED,float to_y HB_UNUSED,void * user_data HB_UNUSED)72*2d1272b8SAndroid Build Coastguard Worker hb_draw_cubic_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
73*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st HB_UNUSED,
74*2d1272b8SAndroid Build Coastguard Worker float control1_x HB_UNUSED, float control1_y HB_UNUSED,
75*2d1272b8SAndroid Build Coastguard Worker float control2_x HB_UNUSED, float control2_y HB_UNUSED,
76*2d1272b8SAndroid Build Coastguard Worker float to_x HB_UNUSED, float to_y HB_UNUSED,
77*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED) {}
78*2d1272b8SAndroid Build Coastguard Worker
79*2d1272b8SAndroid Build Coastguard Worker static void
hb_draw_close_path_nil(hb_draw_funcs_t * dfuncs HB_UNUSED,void * draw_data HB_UNUSED,hb_draw_state_t * st HB_UNUSED,void * user_data HB_UNUSED)80*2d1272b8SAndroid Build Coastguard Worker hb_draw_close_path_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
81*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st HB_UNUSED,
82*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED) {}
83*2d1272b8SAndroid Build Coastguard Worker
84*2d1272b8SAndroid Build Coastguard Worker
85*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_draw_funcs_set_preamble(hb_draw_funcs_t * dfuncs,bool func_is_null,void ** user_data,hb_destroy_func_t * destroy)86*2d1272b8SAndroid Build Coastguard Worker _hb_draw_funcs_set_preamble (hb_draw_funcs_t *dfuncs,
87*2d1272b8SAndroid Build Coastguard Worker bool func_is_null,
88*2d1272b8SAndroid Build Coastguard Worker void **user_data,
89*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t *destroy)
90*2d1272b8SAndroid Build Coastguard Worker {
91*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (dfuncs))
92*2d1272b8SAndroid Build Coastguard Worker {
93*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
94*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
95*2d1272b8SAndroid Build Coastguard Worker return false;
96*2d1272b8SAndroid Build Coastguard Worker }
97*2d1272b8SAndroid Build Coastguard Worker
98*2d1272b8SAndroid Build Coastguard Worker if (func_is_null)
99*2d1272b8SAndroid Build Coastguard Worker {
100*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
101*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
102*2d1272b8SAndroid Build Coastguard Worker *destroy = nullptr;
103*2d1272b8SAndroid Build Coastguard Worker *user_data = nullptr;
104*2d1272b8SAndroid Build Coastguard Worker }
105*2d1272b8SAndroid Build Coastguard Worker
106*2d1272b8SAndroid Build Coastguard Worker return true;
107*2d1272b8SAndroid Build Coastguard Worker }
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_draw_funcs_set_middle(hb_draw_funcs_t * dfuncs,void * user_data,hb_destroy_func_t destroy)110*2d1272b8SAndroid Build Coastguard Worker _hb_draw_funcs_set_middle (hb_draw_funcs_t *dfuncs,
111*2d1272b8SAndroid Build Coastguard Worker void *user_data,
112*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy)
113*2d1272b8SAndroid Build Coastguard Worker {
114*2d1272b8SAndroid Build Coastguard Worker if (user_data && !dfuncs->user_data)
115*2d1272b8SAndroid Build Coastguard Worker {
116*2d1272b8SAndroid Build Coastguard Worker dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data));
117*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!dfuncs->user_data))
118*2d1272b8SAndroid Build Coastguard Worker goto fail;
119*2d1272b8SAndroid Build Coastguard Worker }
120*2d1272b8SAndroid Build Coastguard Worker if (destroy && !dfuncs->destroy)
121*2d1272b8SAndroid Build Coastguard Worker {
122*2d1272b8SAndroid Build Coastguard Worker dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy));
123*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!dfuncs->destroy))
124*2d1272b8SAndroid Build Coastguard Worker goto fail;
125*2d1272b8SAndroid Build Coastguard Worker }
126*2d1272b8SAndroid Build Coastguard Worker
127*2d1272b8SAndroid Build Coastguard Worker return true;
128*2d1272b8SAndroid Build Coastguard Worker
129*2d1272b8SAndroid Build Coastguard Worker fail:
130*2d1272b8SAndroid Build Coastguard Worker if (destroy)
131*2d1272b8SAndroid Build Coastguard Worker (destroy) (user_data);
132*2d1272b8SAndroid Build Coastguard Worker return false;
133*2d1272b8SAndroid Build Coastguard Worker }
134*2d1272b8SAndroid Build Coastguard Worker
135*2d1272b8SAndroid Build Coastguard Worker #define HB_DRAW_FUNC_IMPLEMENT(name) \
136*2d1272b8SAndroid Build Coastguard Worker \
137*2d1272b8SAndroid Build Coastguard Worker void \
138*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_##name##_func (hb_draw_funcs_t *dfuncs, \
139*2d1272b8SAndroid Build Coastguard Worker hb_draw_##name##_func_t func, \
140*2d1272b8SAndroid Build Coastguard Worker void *user_data, \
141*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy) \
142*2d1272b8SAndroid Build Coastguard Worker { \
143*2d1272b8SAndroid Build Coastguard Worker if (!_hb_draw_funcs_set_preamble (dfuncs, !func, &user_data, &destroy))\
144*2d1272b8SAndroid Build Coastguard Worker return; \
145*2d1272b8SAndroid Build Coastguard Worker \
146*2d1272b8SAndroid Build Coastguard Worker if (dfuncs->destroy && dfuncs->destroy->name) \
147*2d1272b8SAndroid Build Coastguard Worker dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name); \
148*2d1272b8SAndroid Build Coastguard Worker \
149*2d1272b8SAndroid Build Coastguard Worker if (!_hb_draw_funcs_set_middle (dfuncs, user_data, destroy)) \
150*2d1272b8SAndroid Build Coastguard Worker return; \
151*2d1272b8SAndroid Build Coastguard Worker \
152*2d1272b8SAndroid Build Coastguard Worker if (func) \
153*2d1272b8SAndroid Build Coastguard Worker dfuncs->func.name = func; \
154*2d1272b8SAndroid Build Coastguard Worker else \
155*2d1272b8SAndroid Build Coastguard Worker dfuncs->func.name = hb_draw_##name##_nil; \
156*2d1272b8SAndroid Build Coastguard Worker \
157*2d1272b8SAndroid Build Coastguard Worker if (dfuncs->user_data) \
158*2d1272b8SAndroid Build Coastguard Worker dfuncs->user_data->name = user_data; \
159*2d1272b8SAndroid Build Coastguard Worker if (dfuncs->destroy) \
160*2d1272b8SAndroid Build Coastguard Worker dfuncs->destroy->name = destroy; \
161*2d1272b8SAndroid Build Coastguard Worker }
162*2d1272b8SAndroid Build Coastguard Worker
163*2d1272b8SAndroid Build Coastguard Worker HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
164*2d1272b8SAndroid Build Coastguard Worker #undef HB_DRAW_FUNC_IMPLEMENT
165*2d1272b8SAndroid Build Coastguard Worker
166*2d1272b8SAndroid Build Coastguard Worker /**
167*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_create:
168*2d1272b8SAndroid Build Coastguard Worker *
169*2d1272b8SAndroid Build Coastguard Worker * Creates a new draw callbacks object.
170*2d1272b8SAndroid Build Coastguard Worker *
171*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full):
172*2d1272b8SAndroid Build Coastguard Worker * A newly allocated #hb_draw_funcs_t with a reference count of 1. The initial
173*2d1272b8SAndroid Build Coastguard Worker * reference count should be released with hb_draw_funcs_destroy when you are
174*2d1272b8SAndroid Build Coastguard Worker * done using the #hb_draw_funcs_t. This function never returns `NULL`. If
175*2d1272b8SAndroid Build Coastguard Worker * memory cannot be allocated, a special singleton #hb_draw_funcs_t object will
176*2d1272b8SAndroid Build Coastguard Worker * be returned.
177*2d1272b8SAndroid Build Coastguard Worker *
178*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
179*2d1272b8SAndroid Build Coastguard Worker **/
180*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *
hb_draw_funcs_create()181*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_create ()
182*2d1272b8SAndroid Build Coastguard Worker {
183*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *dfuncs;
184*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!(dfuncs = hb_object_create<hb_draw_funcs_t> ())))
185*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_draw_funcs_t *> (&Null (hb_draw_funcs_t));
186*2d1272b8SAndroid Build Coastguard Worker
187*2d1272b8SAndroid Build Coastguard Worker dfuncs->func = Null (hb_draw_funcs_t).func;
188*2d1272b8SAndroid Build Coastguard Worker
189*2d1272b8SAndroid Build Coastguard Worker return dfuncs;
190*2d1272b8SAndroid Build Coastguard Worker }
191*2d1272b8SAndroid Build Coastguard Worker
192*2d1272b8SAndroid Build Coastguard Worker DEFINE_NULL_INSTANCE (hb_draw_funcs_t) =
193*2d1272b8SAndroid Build Coastguard Worker {
194*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
195*2d1272b8SAndroid Build Coastguard Worker
196*2d1272b8SAndroid Build Coastguard Worker {
197*2d1272b8SAndroid Build Coastguard Worker #define HB_DRAW_FUNC_IMPLEMENT(name) hb_draw_##name##_nil,
198*2d1272b8SAndroid Build Coastguard Worker HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
199*2d1272b8SAndroid Build Coastguard Worker #undef HB_DRAW_FUNC_IMPLEMENT
200*2d1272b8SAndroid Build Coastguard Worker }
201*2d1272b8SAndroid Build Coastguard Worker };
202*2d1272b8SAndroid Build Coastguard Worker
203*2d1272b8SAndroid Build Coastguard Worker /**
204*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_get_empty:
205*2d1272b8SAndroid Build Coastguard Worker *
206*2d1272b8SAndroid Build Coastguard Worker * Fetches the singleton empty draw-functions structure.
207*2d1272b8SAndroid Build Coastguard Worker *
208*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The empty draw-functions structure
209*2d1272b8SAndroid Build Coastguard Worker *
210*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
211*2d1272b8SAndroid Build Coastguard Worker **/
212*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *
hb_draw_funcs_get_empty()213*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_get_empty ()
214*2d1272b8SAndroid Build Coastguard Worker {
215*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_draw_funcs_t *> (&Null (hb_draw_funcs_t));
216*2d1272b8SAndroid Build Coastguard Worker }
217*2d1272b8SAndroid Build Coastguard Worker
218*2d1272b8SAndroid Build Coastguard Worker /**
219*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_reference: (skip)
220*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
221*2d1272b8SAndroid Build Coastguard Worker *
222*2d1272b8SAndroid Build Coastguard Worker * Increases the reference count on @dfuncs by one.
223*2d1272b8SAndroid Build Coastguard Worker *
224*2d1272b8SAndroid Build Coastguard Worker * This prevents @dfuncs from being destroyed until a matching
225*2d1272b8SAndroid Build Coastguard Worker * call to hb_draw_funcs_destroy() is made.
226*2d1272b8SAndroid Build Coastguard Worker *
227*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full):
228*2d1272b8SAndroid Build Coastguard Worker * The referenced #hb_draw_funcs_t.
229*2d1272b8SAndroid Build Coastguard Worker *
230*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
231*2d1272b8SAndroid Build Coastguard Worker **/
232*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_t *
hb_draw_funcs_reference(hb_draw_funcs_t * dfuncs)233*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_reference (hb_draw_funcs_t *dfuncs)
234*2d1272b8SAndroid Build Coastguard Worker {
235*2d1272b8SAndroid Build Coastguard Worker return hb_object_reference (dfuncs);
236*2d1272b8SAndroid Build Coastguard Worker }
237*2d1272b8SAndroid Build Coastguard Worker
238*2d1272b8SAndroid Build Coastguard Worker /**
239*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_destroy: (skip)
240*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
241*2d1272b8SAndroid Build Coastguard Worker *
242*2d1272b8SAndroid Build Coastguard Worker * Deallocate the @dfuncs.
243*2d1272b8SAndroid Build Coastguard Worker * Decreases the reference count on @dfuncs by one. If the result is zero, then
244*2d1272b8SAndroid Build Coastguard Worker * @dfuncs and all associated resources are freed. See hb_draw_funcs_reference().
245*2d1272b8SAndroid Build Coastguard Worker *
246*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
247*2d1272b8SAndroid Build Coastguard Worker **/
248*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_funcs_destroy(hb_draw_funcs_t * dfuncs)249*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs)
250*2d1272b8SAndroid Build Coastguard Worker {
251*2d1272b8SAndroid Build Coastguard Worker if (!hb_object_destroy (dfuncs)) return;
252*2d1272b8SAndroid Build Coastguard Worker
253*2d1272b8SAndroid Build Coastguard Worker if (dfuncs->destroy)
254*2d1272b8SAndroid Build Coastguard Worker {
255*2d1272b8SAndroid Build Coastguard Worker #define HB_DRAW_FUNC_IMPLEMENT(name) \
256*2d1272b8SAndroid Build Coastguard Worker if (dfuncs->destroy->name) dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name);
257*2d1272b8SAndroid Build Coastguard Worker HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
258*2d1272b8SAndroid Build Coastguard Worker #undef HB_DRAW_FUNC_IMPLEMENT
259*2d1272b8SAndroid Build Coastguard Worker }
260*2d1272b8SAndroid Build Coastguard Worker
261*2d1272b8SAndroid Build Coastguard Worker hb_free (dfuncs->destroy);
262*2d1272b8SAndroid Build Coastguard Worker hb_free (dfuncs->user_data);
263*2d1272b8SAndroid Build Coastguard Worker
264*2d1272b8SAndroid Build Coastguard Worker hb_free (dfuncs);
265*2d1272b8SAndroid Build Coastguard Worker }
266*2d1272b8SAndroid Build Coastguard Worker
267*2d1272b8SAndroid Build Coastguard Worker /**
268*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_set_user_data: (skip)
269*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: The draw-functions structure
270*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key
271*2d1272b8SAndroid Build Coastguard Worker * @data: A pointer to the user data
272*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): A callback to call when @data is not needed anymore
273*2d1272b8SAndroid Build Coastguard Worker * @replace: Whether to replace an existing data with the same key
274*2d1272b8SAndroid Build Coastguard Worker *
275*2d1272b8SAndroid Build Coastguard Worker * Attaches a user-data key/data pair to the specified draw-functions structure.
276*2d1272b8SAndroid Build Coastguard Worker *
277*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if success, `false` otherwise
278*2d1272b8SAndroid Build Coastguard Worker *
279*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
280*2d1272b8SAndroid Build Coastguard Worker **/
281*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_draw_funcs_set_user_data(hb_draw_funcs_t * dfuncs,hb_user_data_key_t * key,void * data,hb_destroy_func_t destroy,hb_bool_t replace)282*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_set_user_data (hb_draw_funcs_t *dfuncs,
283*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key,
284*2d1272b8SAndroid Build Coastguard Worker void * data,
285*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy,
286*2d1272b8SAndroid Build Coastguard Worker hb_bool_t replace)
287*2d1272b8SAndroid Build Coastguard Worker {
288*2d1272b8SAndroid Build Coastguard Worker return hb_object_set_user_data (dfuncs, key, data, destroy, replace);
289*2d1272b8SAndroid Build Coastguard Worker }
290*2d1272b8SAndroid Build Coastguard Worker
291*2d1272b8SAndroid Build Coastguard Worker /**
292*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_get_user_data: (skip)
293*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: The draw-functions structure
294*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key to query
295*2d1272b8SAndroid Build Coastguard Worker *
296*2d1272b8SAndroid Build Coastguard Worker * Fetches the user-data associated with the specified key,
297*2d1272b8SAndroid Build Coastguard Worker * attached to the specified draw-functions structure.
298*2d1272b8SAndroid Build Coastguard Worker *
299*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): A pointer to the user data
300*2d1272b8SAndroid Build Coastguard Worker *
301*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
302*2d1272b8SAndroid Build Coastguard Worker **/
303*2d1272b8SAndroid Build Coastguard Worker void *
hb_draw_funcs_get_user_data(const hb_draw_funcs_t * dfuncs,hb_user_data_key_t * key)304*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_get_user_data (const hb_draw_funcs_t *dfuncs,
305*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key)
306*2d1272b8SAndroid Build Coastguard Worker {
307*2d1272b8SAndroid Build Coastguard Worker return hb_object_get_user_data (dfuncs, key);
308*2d1272b8SAndroid Build Coastguard Worker }
309*2d1272b8SAndroid Build Coastguard Worker
310*2d1272b8SAndroid Build Coastguard Worker /**
311*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_make_immutable:
312*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
313*2d1272b8SAndroid Build Coastguard Worker *
314*2d1272b8SAndroid Build Coastguard Worker * Makes @dfuncs object immutable.
315*2d1272b8SAndroid Build Coastguard Worker *
316*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
317*2d1272b8SAndroid Build Coastguard Worker **/
318*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_funcs_make_immutable(hb_draw_funcs_t * dfuncs)319*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs)
320*2d1272b8SAndroid Build Coastguard Worker {
321*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (dfuncs))
322*2d1272b8SAndroid Build Coastguard Worker return;
323*2d1272b8SAndroid Build Coastguard Worker
324*2d1272b8SAndroid Build Coastguard Worker hb_object_make_immutable (dfuncs);
325*2d1272b8SAndroid Build Coastguard Worker }
326*2d1272b8SAndroid Build Coastguard Worker
327*2d1272b8SAndroid Build Coastguard Worker /**
328*2d1272b8SAndroid Build Coastguard Worker * hb_draw_funcs_is_immutable:
329*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
330*2d1272b8SAndroid Build Coastguard Worker *
331*2d1272b8SAndroid Build Coastguard Worker * Checks whether @dfuncs is immutable.
332*2d1272b8SAndroid Build Coastguard Worker *
333*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if @dfuncs is immutable, `false` otherwise
334*2d1272b8SAndroid Build Coastguard Worker *
335*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
336*2d1272b8SAndroid Build Coastguard Worker **/
337*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_draw_funcs_is_immutable(hb_draw_funcs_t * dfuncs)338*2d1272b8SAndroid Build Coastguard Worker hb_draw_funcs_is_immutable (hb_draw_funcs_t *dfuncs)
339*2d1272b8SAndroid Build Coastguard Worker {
340*2d1272b8SAndroid Build Coastguard Worker return hb_object_is_immutable (dfuncs);
341*2d1272b8SAndroid Build Coastguard Worker }
342*2d1272b8SAndroid Build Coastguard Worker
343*2d1272b8SAndroid Build Coastguard Worker
344*2d1272b8SAndroid Build Coastguard Worker /**
345*2d1272b8SAndroid Build Coastguard Worker * hb_draw_move_to:
346*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
347*2d1272b8SAndroid Build Coastguard Worker * @draw_data: associated draw data passed by the caller
348*2d1272b8SAndroid Build Coastguard Worker * @st: current draw state
349*2d1272b8SAndroid Build Coastguard Worker * @to_x: X component of target point
350*2d1272b8SAndroid Build Coastguard Worker * @to_y: Y component of target point
351*2d1272b8SAndroid Build Coastguard Worker *
352*2d1272b8SAndroid Build Coastguard Worker * Perform a "move-to" draw operation.
353*2d1272b8SAndroid Build Coastguard Worker *
354*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
355*2d1272b8SAndroid Build Coastguard Worker **/
356*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_move_to(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st,float to_x,float to_y)357*2d1272b8SAndroid Build Coastguard Worker hb_draw_move_to (hb_draw_funcs_t *dfuncs, void *draw_data,
358*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
359*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y)
360*2d1272b8SAndroid Build Coastguard Worker {
361*2d1272b8SAndroid Build Coastguard Worker dfuncs->move_to (draw_data, *st,
362*2d1272b8SAndroid Build Coastguard Worker to_x, to_y);
363*2d1272b8SAndroid Build Coastguard Worker }
364*2d1272b8SAndroid Build Coastguard Worker
365*2d1272b8SAndroid Build Coastguard Worker /**
366*2d1272b8SAndroid Build Coastguard Worker * hb_draw_line_to:
367*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
368*2d1272b8SAndroid Build Coastguard Worker * @draw_data: associated draw data passed by the caller
369*2d1272b8SAndroid Build Coastguard Worker * @st: current draw state
370*2d1272b8SAndroid Build Coastguard Worker * @to_x: X component of target point
371*2d1272b8SAndroid Build Coastguard Worker * @to_y: Y component of target point
372*2d1272b8SAndroid Build Coastguard Worker *
373*2d1272b8SAndroid Build Coastguard Worker * Perform a "line-to" draw operation.
374*2d1272b8SAndroid Build Coastguard Worker *
375*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
376*2d1272b8SAndroid Build Coastguard Worker **/
377*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_line_to(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st,float to_x,float to_y)378*2d1272b8SAndroid Build Coastguard Worker hb_draw_line_to (hb_draw_funcs_t *dfuncs, void *draw_data,
379*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
380*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y)
381*2d1272b8SAndroid Build Coastguard Worker {
382*2d1272b8SAndroid Build Coastguard Worker dfuncs->line_to (draw_data, *st,
383*2d1272b8SAndroid Build Coastguard Worker to_x, to_y);
384*2d1272b8SAndroid Build Coastguard Worker }
385*2d1272b8SAndroid Build Coastguard Worker
386*2d1272b8SAndroid Build Coastguard Worker /**
387*2d1272b8SAndroid Build Coastguard Worker * hb_draw_quadratic_to:
388*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
389*2d1272b8SAndroid Build Coastguard Worker * @draw_data: associated draw data passed by the caller
390*2d1272b8SAndroid Build Coastguard Worker * @st: current draw state
391*2d1272b8SAndroid Build Coastguard Worker * @control_x: X component of control point
392*2d1272b8SAndroid Build Coastguard Worker * @control_y: Y component of control point
393*2d1272b8SAndroid Build Coastguard Worker * @to_x: X component of target point
394*2d1272b8SAndroid Build Coastguard Worker * @to_y: Y component of target point
395*2d1272b8SAndroid Build Coastguard Worker *
396*2d1272b8SAndroid Build Coastguard Worker * Perform a "quadratic-to" draw operation.
397*2d1272b8SAndroid Build Coastguard Worker *
398*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
399*2d1272b8SAndroid Build Coastguard Worker **/
400*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_quadratic_to(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st,float control_x,float control_y,float to_x,float to_y)401*2d1272b8SAndroid Build Coastguard Worker hb_draw_quadratic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
402*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
403*2d1272b8SAndroid Build Coastguard Worker float control_x, float control_y,
404*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y)
405*2d1272b8SAndroid Build Coastguard Worker {
406*2d1272b8SAndroid Build Coastguard Worker dfuncs->quadratic_to (draw_data, *st,
407*2d1272b8SAndroid Build Coastguard Worker control_x, control_y,
408*2d1272b8SAndroid Build Coastguard Worker to_x, to_y);
409*2d1272b8SAndroid Build Coastguard Worker }
410*2d1272b8SAndroid Build Coastguard Worker
411*2d1272b8SAndroid Build Coastguard Worker /**
412*2d1272b8SAndroid Build Coastguard Worker * hb_draw_cubic_to:
413*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
414*2d1272b8SAndroid Build Coastguard Worker * @draw_data: associated draw data passed by the caller
415*2d1272b8SAndroid Build Coastguard Worker * @st: current draw state
416*2d1272b8SAndroid Build Coastguard Worker * @control1_x: X component of first control point
417*2d1272b8SAndroid Build Coastguard Worker * @control1_y: Y component of first control point
418*2d1272b8SAndroid Build Coastguard Worker * @control2_x: X component of second control point
419*2d1272b8SAndroid Build Coastguard Worker * @control2_y: Y component of second control point
420*2d1272b8SAndroid Build Coastguard Worker * @to_x: X component of target point
421*2d1272b8SAndroid Build Coastguard Worker * @to_y: Y component of target point
422*2d1272b8SAndroid Build Coastguard Worker *
423*2d1272b8SAndroid Build Coastguard Worker * Perform a "cubic-to" draw operation.
424*2d1272b8SAndroid Build Coastguard Worker *
425*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
426*2d1272b8SAndroid Build Coastguard Worker **/
427*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_cubic_to(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st,float control1_x,float control1_y,float control2_x,float control2_y,float to_x,float to_y)428*2d1272b8SAndroid Build Coastguard Worker hb_draw_cubic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
429*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st,
430*2d1272b8SAndroid Build Coastguard Worker float control1_x, float control1_y,
431*2d1272b8SAndroid Build Coastguard Worker float control2_x, float control2_y,
432*2d1272b8SAndroid Build Coastguard Worker float to_x, float to_y)
433*2d1272b8SAndroid Build Coastguard Worker {
434*2d1272b8SAndroid Build Coastguard Worker dfuncs->cubic_to (draw_data, *st,
435*2d1272b8SAndroid Build Coastguard Worker control1_x, control1_y,
436*2d1272b8SAndroid Build Coastguard Worker control2_x, control2_y,
437*2d1272b8SAndroid Build Coastguard Worker to_x, to_y);
438*2d1272b8SAndroid Build Coastguard Worker }
439*2d1272b8SAndroid Build Coastguard Worker
440*2d1272b8SAndroid Build Coastguard Worker /**
441*2d1272b8SAndroid Build Coastguard Worker * hb_draw_close_path:
442*2d1272b8SAndroid Build Coastguard Worker * @dfuncs: draw functions
443*2d1272b8SAndroid Build Coastguard Worker * @draw_data: associated draw data passed by the caller
444*2d1272b8SAndroid Build Coastguard Worker * @st: current draw state
445*2d1272b8SAndroid Build Coastguard Worker *
446*2d1272b8SAndroid Build Coastguard Worker * Perform a "close-path" draw operation.
447*2d1272b8SAndroid Build Coastguard Worker *
448*2d1272b8SAndroid Build Coastguard Worker * Since: 4.0.0
449*2d1272b8SAndroid Build Coastguard Worker **/
450*2d1272b8SAndroid Build Coastguard Worker void
hb_draw_close_path(hb_draw_funcs_t * dfuncs,void * draw_data,hb_draw_state_t * st)451*2d1272b8SAndroid Build Coastguard Worker hb_draw_close_path (hb_draw_funcs_t *dfuncs, void *draw_data,
452*2d1272b8SAndroid Build Coastguard Worker hb_draw_state_t *st)
453*2d1272b8SAndroid Build Coastguard Worker {
454*2d1272b8SAndroid Build Coastguard Worker dfuncs->close_path (draw_data, *st);
455*2d1272b8SAndroid Build Coastguard Worker }
456*2d1272b8SAndroid Build Coastguard Worker
457*2d1272b8SAndroid Build Coastguard Worker
458*2d1272b8SAndroid Build Coastguard Worker #endif
459