xref: /aosp_15_r20/external/harfbuzz_ng/src/hb-draw.cc (revision 2d1272b857b1f7575e6e246373e1cb218663db8a)
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