1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2022 Matthias Clasen
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_PAINT
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #include "hb-paint.hh"
30*2d1272b8SAndroid Build Coastguard Worker
31*2d1272b8SAndroid Build Coastguard Worker /**
32*2d1272b8SAndroid Build Coastguard Worker * SECTION: hb-paint
33*2d1272b8SAndroid Build Coastguard Worker * @title: hb-paint
34*2d1272b8SAndroid Build Coastguard Worker * @short_description: Glyph painting
35*2d1272b8SAndroid Build Coastguard Worker * @include: hb.h
36*2d1272b8SAndroid Build Coastguard Worker *
37*2d1272b8SAndroid Build Coastguard Worker * Functions for painting glyphs.
38*2d1272b8SAndroid Build Coastguard Worker *
39*2d1272b8SAndroid Build Coastguard Worker * The main purpose of these functions is to paint (extract) color glyph layers
40*2d1272b8SAndroid Build Coastguard Worker * from the COLRv1 table, but the API works for drawing ordinary outlines and
41*2d1272b8SAndroid Build Coastguard Worker * images as well.
42*2d1272b8SAndroid Build Coastguard Worker *
43*2d1272b8SAndroid Build Coastguard Worker * The #hb_paint_funcs_t struct can be used with hb_font_paint_glyph().
44*2d1272b8SAndroid Build Coastguard Worker **/
45*2d1272b8SAndroid Build Coastguard Worker
46*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_push_transform_nil(hb_paint_funcs_t * funcs,void * paint_data,float xx,float yx,float xy,float yy,float dx,float dy,void * user_data)47*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_transform_nil (hb_paint_funcs_t *funcs, void *paint_data,
48*2d1272b8SAndroid Build Coastguard Worker float xx, float yx,
49*2d1272b8SAndroid Build Coastguard Worker float xy, float yy,
50*2d1272b8SAndroid Build Coastguard Worker float dx, float dy,
51*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
52*2d1272b8SAndroid Build Coastguard Worker
53*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_pop_transform_nil(hb_paint_funcs_t * funcs,void * paint_data,void * user_data)54*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_transform_nil (hb_paint_funcs_t *funcs, void *paint_data,
55*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
56*2d1272b8SAndroid Build Coastguard Worker
57*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_paint_color_glyph_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_codepoint_t glyph,hb_font_t * font,void * user_data)58*2d1272b8SAndroid Build Coastguard Worker hb_paint_color_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data,
59*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
60*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font,
61*2d1272b8SAndroid Build Coastguard Worker void *user_data) { return false; }
62*2d1272b8SAndroid Build Coastguard Worker
63*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_push_clip_glyph_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_codepoint_t glyph,hb_font_t * font,void * user_data)64*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_clip_glyph_nil (hb_paint_funcs_t *funcs, void *paint_data,
65*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
66*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font,
67*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_push_clip_rectangle_nil(hb_paint_funcs_t * funcs,void * paint_data,float xmin,float ymin,float xmax,float ymax,void * user_data)70*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_clip_rectangle_nil (hb_paint_funcs_t *funcs, void *paint_data,
71*2d1272b8SAndroid Build Coastguard Worker float xmin, float ymin, float xmax, float ymax,
72*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
73*2d1272b8SAndroid Build Coastguard Worker
74*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_pop_clip_nil(hb_paint_funcs_t * funcs,void * paint_data,void * user_data)75*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_clip_nil (hb_paint_funcs_t *funcs, void *paint_data,
76*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
77*2d1272b8SAndroid Build Coastguard Worker
78*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_color_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_bool_t is_foreground,hb_color_t color,void * user_data)79*2d1272b8SAndroid Build Coastguard Worker hb_paint_color_nil (hb_paint_funcs_t *funcs, void *paint_data,
80*2d1272b8SAndroid Build Coastguard Worker hb_bool_t is_foreground,
81*2d1272b8SAndroid Build Coastguard Worker hb_color_t color,
82*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
83*2d1272b8SAndroid Build Coastguard Worker
84*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_paint_image_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_blob_t * image,unsigned int width,unsigned int height,hb_tag_t format,float slant_xy,hb_glyph_extents_t * extents,void * user_data)85*2d1272b8SAndroid Build Coastguard Worker hb_paint_image_nil (hb_paint_funcs_t *funcs, void *paint_data,
86*2d1272b8SAndroid Build Coastguard Worker hb_blob_t *image,
87*2d1272b8SAndroid Build Coastguard Worker unsigned int width,
88*2d1272b8SAndroid Build Coastguard Worker unsigned int height,
89*2d1272b8SAndroid Build Coastguard Worker hb_tag_t format,
90*2d1272b8SAndroid Build Coastguard Worker float slant_xy,
91*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents,
92*2d1272b8SAndroid Build Coastguard Worker void *user_data) { return false; }
93*2d1272b8SAndroid Build Coastguard Worker
94*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_linear_gradient_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float x1,float y1,float x2,float y2,void * user_data)95*2d1272b8SAndroid Build Coastguard Worker hb_paint_linear_gradient_nil (hb_paint_funcs_t *funcs, void *paint_data,
96*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
97*2d1272b8SAndroid Build Coastguard Worker float x0, float y0,
98*2d1272b8SAndroid Build Coastguard Worker float x1, float y1,
99*2d1272b8SAndroid Build Coastguard Worker float x2, float y2,
100*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
101*2d1272b8SAndroid Build Coastguard Worker
102*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_radial_gradient_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float r0,float x1,float y1,float r1,void * user_data)103*2d1272b8SAndroid Build Coastguard Worker hb_paint_radial_gradient_nil (hb_paint_funcs_t *funcs, void *paint_data,
104*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
105*2d1272b8SAndroid Build Coastguard Worker float x0, float y0, float r0,
106*2d1272b8SAndroid Build Coastguard Worker float x1, float y1, float r1,
107*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
108*2d1272b8SAndroid Build Coastguard Worker
109*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_sweep_gradient_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float start_angle,float end_angle,void * user_data)110*2d1272b8SAndroid Build Coastguard Worker hb_paint_sweep_gradient_nil (hb_paint_funcs_t *funcs, void *paint_data,
111*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
112*2d1272b8SAndroid Build Coastguard Worker float x0, float y0,
113*2d1272b8SAndroid Build Coastguard Worker float start_angle,
114*2d1272b8SAndroid Build Coastguard Worker float end_angle,
115*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
116*2d1272b8SAndroid Build Coastguard Worker
117*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_push_group_nil(hb_paint_funcs_t * funcs,void * paint_data,void * user_data)118*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_group_nil (hb_paint_funcs_t *funcs, void *paint_data,
119*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
120*2d1272b8SAndroid Build Coastguard Worker
121*2d1272b8SAndroid Build Coastguard Worker static void
hb_paint_pop_group_nil(hb_paint_funcs_t * funcs,void * paint_data,hb_paint_composite_mode_t mode,void * user_data)122*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_group_nil (hb_paint_funcs_t *funcs, void *paint_data,
123*2d1272b8SAndroid Build Coastguard Worker hb_paint_composite_mode_t mode,
124*2d1272b8SAndroid Build Coastguard Worker void *user_data) {}
125*2d1272b8SAndroid Build Coastguard Worker
126*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_paint_custom_palette_color_nil(hb_paint_funcs_t * funcs,void * paint_data,unsigned int color_index,hb_color_t * color,void * user_data)127*2d1272b8SAndroid Build Coastguard Worker hb_paint_custom_palette_color_nil (hb_paint_funcs_t *funcs, void *paint_data,
128*2d1272b8SAndroid Build Coastguard Worker unsigned int color_index,
129*2d1272b8SAndroid Build Coastguard Worker hb_color_t *color,
130*2d1272b8SAndroid Build Coastguard Worker void *user_data) { return false; }
131*2d1272b8SAndroid Build Coastguard Worker
132*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_paint_funcs_set_preamble(hb_paint_funcs_t * funcs,bool func_is_null,void ** user_data,hb_destroy_func_t * destroy)133*2d1272b8SAndroid Build Coastguard Worker _hb_paint_funcs_set_preamble (hb_paint_funcs_t *funcs,
134*2d1272b8SAndroid Build Coastguard Worker bool func_is_null,
135*2d1272b8SAndroid Build Coastguard Worker void **user_data,
136*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t *destroy)
137*2d1272b8SAndroid Build Coastguard Worker {
138*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (funcs))
139*2d1272b8SAndroid Build Coastguard Worker {
140*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
141*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
142*2d1272b8SAndroid Build Coastguard Worker return false;
143*2d1272b8SAndroid Build Coastguard Worker }
144*2d1272b8SAndroid Build Coastguard Worker
145*2d1272b8SAndroid Build Coastguard Worker if (func_is_null)
146*2d1272b8SAndroid Build Coastguard Worker {
147*2d1272b8SAndroid Build Coastguard Worker if (*destroy)
148*2d1272b8SAndroid Build Coastguard Worker (*destroy) (*user_data);
149*2d1272b8SAndroid Build Coastguard Worker *destroy = nullptr;
150*2d1272b8SAndroid Build Coastguard Worker *user_data = nullptr;
151*2d1272b8SAndroid Build Coastguard Worker }
152*2d1272b8SAndroid Build Coastguard Worker
153*2d1272b8SAndroid Build Coastguard Worker return true;
154*2d1272b8SAndroid Build Coastguard Worker }
155*2d1272b8SAndroid Build Coastguard Worker
156*2d1272b8SAndroid Build Coastguard Worker static bool
_hb_paint_funcs_set_middle(hb_paint_funcs_t * funcs,void * user_data,hb_destroy_func_t destroy)157*2d1272b8SAndroid Build Coastguard Worker _hb_paint_funcs_set_middle (hb_paint_funcs_t *funcs,
158*2d1272b8SAndroid Build Coastguard Worker void *user_data,
159*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy)
160*2d1272b8SAndroid Build Coastguard Worker {
161*2d1272b8SAndroid Build Coastguard Worker if (user_data && !funcs->user_data)
162*2d1272b8SAndroid Build Coastguard Worker {
163*2d1272b8SAndroid Build Coastguard Worker funcs->user_data = (decltype (funcs->user_data)) hb_calloc (1, sizeof (*funcs->user_data));
164*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!funcs->user_data))
165*2d1272b8SAndroid Build Coastguard Worker goto fail;
166*2d1272b8SAndroid Build Coastguard Worker }
167*2d1272b8SAndroid Build Coastguard Worker if (destroy && !funcs->destroy)
168*2d1272b8SAndroid Build Coastguard Worker {
169*2d1272b8SAndroid Build Coastguard Worker funcs->destroy = (decltype (funcs->destroy)) hb_calloc (1, sizeof (*funcs->destroy));
170*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!funcs->destroy))
171*2d1272b8SAndroid Build Coastguard Worker goto fail;
172*2d1272b8SAndroid Build Coastguard Worker }
173*2d1272b8SAndroid Build Coastguard Worker
174*2d1272b8SAndroid Build Coastguard Worker return true;
175*2d1272b8SAndroid Build Coastguard Worker
176*2d1272b8SAndroid Build Coastguard Worker fail:
177*2d1272b8SAndroid Build Coastguard Worker if (destroy)
178*2d1272b8SAndroid Build Coastguard Worker (destroy) (user_data);
179*2d1272b8SAndroid Build Coastguard Worker return false;
180*2d1272b8SAndroid Build Coastguard Worker }
181*2d1272b8SAndroid Build Coastguard Worker
182*2d1272b8SAndroid Build Coastguard Worker #define HB_PAINT_FUNC_IMPLEMENT(name) \
183*2d1272b8SAndroid Build Coastguard Worker \
184*2d1272b8SAndroid Build Coastguard Worker void \
185*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_set_##name##_func (hb_paint_funcs_t *funcs, \
186*2d1272b8SAndroid Build Coastguard Worker hb_paint_##name##_func_t func, \
187*2d1272b8SAndroid Build Coastguard Worker void *user_data, \
188*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy) \
189*2d1272b8SAndroid Build Coastguard Worker { \
190*2d1272b8SAndroid Build Coastguard Worker if (!_hb_paint_funcs_set_preamble (funcs, !func, &user_data, &destroy)) \
191*2d1272b8SAndroid Build Coastguard Worker return; \
192*2d1272b8SAndroid Build Coastguard Worker \
193*2d1272b8SAndroid Build Coastguard Worker if (funcs->destroy && funcs->destroy->name) \
194*2d1272b8SAndroid Build Coastguard Worker funcs->destroy->name (!funcs->user_data ? nullptr : funcs->user_data->name);\
195*2d1272b8SAndroid Build Coastguard Worker \
196*2d1272b8SAndroid Build Coastguard Worker if (!_hb_paint_funcs_set_middle (funcs, user_data, destroy)) \
197*2d1272b8SAndroid Build Coastguard Worker return; \
198*2d1272b8SAndroid Build Coastguard Worker \
199*2d1272b8SAndroid Build Coastguard Worker if (func) \
200*2d1272b8SAndroid Build Coastguard Worker funcs->func.name = func; \
201*2d1272b8SAndroid Build Coastguard Worker else \
202*2d1272b8SAndroid Build Coastguard Worker funcs->func.name = hb_paint_##name##_nil; \
203*2d1272b8SAndroid Build Coastguard Worker \
204*2d1272b8SAndroid Build Coastguard Worker if (funcs->user_data) \
205*2d1272b8SAndroid Build Coastguard Worker funcs->user_data->name = user_data; \
206*2d1272b8SAndroid Build Coastguard Worker if (funcs->destroy) \
207*2d1272b8SAndroid Build Coastguard Worker funcs->destroy->name = destroy; \
208*2d1272b8SAndroid Build Coastguard Worker }
209*2d1272b8SAndroid Build Coastguard Worker
210*2d1272b8SAndroid Build Coastguard Worker HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS
211*2d1272b8SAndroid Build Coastguard Worker #undef HB_PAINT_FUNC_IMPLEMENT
212*2d1272b8SAndroid Build Coastguard Worker
213*2d1272b8SAndroid Build Coastguard Worker /**
214*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_create:
215*2d1272b8SAndroid Build Coastguard Worker *
216*2d1272b8SAndroid Build Coastguard Worker * Creates a new #hb_paint_funcs_t structure of paint functions.
217*2d1272b8SAndroid Build Coastguard Worker *
218*2d1272b8SAndroid Build Coastguard Worker * The initial reference count of 1 should be released with hb_paint_funcs_destroy()
219*2d1272b8SAndroid Build Coastguard Worker * when you are done using the #hb_paint_funcs_t. This function never returns
220*2d1272b8SAndroid Build Coastguard Worker * `NULL`. If memory cannot be allocated, a special singleton #hb_paint_funcs_t
221*2d1272b8SAndroid Build Coastguard Worker * object will be returned.
222*2d1272b8SAndroid Build Coastguard Worker *
223*2d1272b8SAndroid Build Coastguard Worker * Returns value: (transfer full): the paint-functions structure
224*2d1272b8SAndroid Build Coastguard Worker *
225*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
226*2d1272b8SAndroid Build Coastguard Worker */
227*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *
hb_paint_funcs_create()228*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_create ()
229*2d1272b8SAndroid Build Coastguard Worker {
230*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *funcs;
231*2d1272b8SAndroid Build Coastguard Worker if (unlikely (!(funcs = hb_object_create<hb_paint_funcs_t> ())))
232*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_paint_funcs_t *> (&Null (hb_paint_funcs_t));
233*2d1272b8SAndroid Build Coastguard Worker
234*2d1272b8SAndroid Build Coastguard Worker funcs->func = Null (hb_paint_funcs_t).func;
235*2d1272b8SAndroid Build Coastguard Worker
236*2d1272b8SAndroid Build Coastguard Worker return funcs;
237*2d1272b8SAndroid Build Coastguard Worker }
238*2d1272b8SAndroid Build Coastguard Worker
239*2d1272b8SAndroid Build Coastguard Worker DEFINE_NULL_INSTANCE (hb_paint_funcs_t) =
240*2d1272b8SAndroid Build Coastguard Worker {
241*2d1272b8SAndroid Build Coastguard Worker HB_OBJECT_HEADER_STATIC,
242*2d1272b8SAndroid Build Coastguard Worker
243*2d1272b8SAndroid Build Coastguard Worker {
244*2d1272b8SAndroid Build Coastguard Worker #define HB_PAINT_FUNC_IMPLEMENT(name) hb_paint_##name##_nil,
245*2d1272b8SAndroid Build Coastguard Worker HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS
246*2d1272b8SAndroid Build Coastguard Worker #undef HB_PAINT_FUNC_IMPLEMENT
247*2d1272b8SAndroid Build Coastguard Worker }
248*2d1272b8SAndroid Build Coastguard Worker };
249*2d1272b8SAndroid Build Coastguard Worker
250*2d1272b8SAndroid Build Coastguard Worker /**
251*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_get_empty:
252*2d1272b8SAndroid Build Coastguard Worker *
253*2d1272b8SAndroid Build Coastguard Worker * Fetches the singleton empty paint-functions structure.
254*2d1272b8SAndroid Build Coastguard Worker *
255*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): The empty paint-functions structure
256*2d1272b8SAndroid Build Coastguard Worker *
257*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
258*2d1272b8SAndroid Build Coastguard Worker **/
259*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *
hb_paint_funcs_get_empty()260*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_get_empty ()
261*2d1272b8SAndroid Build Coastguard Worker {
262*2d1272b8SAndroid Build Coastguard Worker return const_cast<hb_paint_funcs_t *> (&Null (hb_paint_funcs_t));
263*2d1272b8SAndroid Build Coastguard Worker }
264*2d1272b8SAndroid Build Coastguard Worker
265*2d1272b8SAndroid Build Coastguard Worker /**
266*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_reference: (skip)
267*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
268*2d1272b8SAndroid Build Coastguard Worker *
269*2d1272b8SAndroid Build Coastguard Worker * Increases the reference count on a paint-functions structure.
270*2d1272b8SAndroid Build Coastguard Worker *
271*2d1272b8SAndroid Build Coastguard Worker * This prevents @funcs from being destroyed until a matching
272*2d1272b8SAndroid Build Coastguard Worker * call to hb_paint_funcs_destroy() is made.
273*2d1272b8SAndroid Build Coastguard Worker *
274*2d1272b8SAndroid Build Coastguard Worker * Return value: The paint-functions structure
275*2d1272b8SAndroid Build Coastguard Worker *
276*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
277*2d1272b8SAndroid Build Coastguard Worker */
278*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_t *
hb_paint_funcs_reference(hb_paint_funcs_t * funcs)279*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_reference (hb_paint_funcs_t *funcs)
280*2d1272b8SAndroid Build Coastguard Worker {
281*2d1272b8SAndroid Build Coastguard Worker return hb_object_reference (funcs);
282*2d1272b8SAndroid Build Coastguard Worker }
283*2d1272b8SAndroid Build Coastguard Worker
284*2d1272b8SAndroid Build Coastguard Worker /**
285*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_destroy: (skip)
286*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
287*2d1272b8SAndroid Build Coastguard Worker *
288*2d1272b8SAndroid Build Coastguard Worker * Decreases the reference count on a paint-functions structure.
289*2d1272b8SAndroid Build Coastguard Worker *
290*2d1272b8SAndroid Build Coastguard Worker * When the reference count reaches zero, the structure
291*2d1272b8SAndroid Build Coastguard Worker * is destroyed, freeing all memory.
292*2d1272b8SAndroid Build Coastguard Worker *
293*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
294*2d1272b8SAndroid Build Coastguard Worker */
295*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_funcs_destroy(hb_paint_funcs_t * funcs)296*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_destroy (hb_paint_funcs_t *funcs)
297*2d1272b8SAndroid Build Coastguard Worker {
298*2d1272b8SAndroid Build Coastguard Worker if (!hb_object_destroy (funcs)) return;
299*2d1272b8SAndroid Build Coastguard Worker
300*2d1272b8SAndroid Build Coastguard Worker if (funcs->destroy)
301*2d1272b8SAndroid Build Coastguard Worker {
302*2d1272b8SAndroid Build Coastguard Worker #define HB_PAINT_FUNC_IMPLEMENT(name) \
303*2d1272b8SAndroid Build Coastguard Worker if (funcs->destroy->name) funcs->destroy->name (!funcs->user_data ? nullptr : funcs->user_data->name);
304*2d1272b8SAndroid Build Coastguard Worker HB_PAINT_FUNCS_IMPLEMENT_CALLBACKS
305*2d1272b8SAndroid Build Coastguard Worker #undef HB_PAINT_FUNC_IMPLEMENT
306*2d1272b8SAndroid Build Coastguard Worker }
307*2d1272b8SAndroid Build Coastguard Worker
308*2d1272b8SAndroid Build Coastguard Worker hb_free (funcs->destroy);
309*2d1272b8SAndroid Build Coastguard Worker hb_free (funcs->user_data);
310*2d1272b8SAndroid Build Coastguard Worker hb_free (funcs);
311*2d1272b8SAndroid Build Coastguard Worker }
312*2d1272b8SAndroid Build Coastguard Worker
313*2d1272b8SAndroid Build Coastguard Worker /**
314*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_set_user_data: (skip)
315*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
316*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key
317*2d1272b8SAndroid Build Coastguard Worker * @data: A pointer to the user data
318*2d1272b8SAndroid Build Coastguard Worker * @destroy: (nullable): A callback to call when @data is not needed anymore
319*2d1272b8SAndroid Build Coastguard Worker * @replace: Whether to replace an existing data with the same key
320*2d1272b8SAndroid Build Coastguard Worker *
321*2d1272b8SAndroid Build Coastguard Worker * Attaches a user-data key/data pair to the specified paint-functions structure.
322*2d1272b8SAndroid Build Coastguard Worker *
323*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if success, `false` otherwise
324*2d1272b8SAndroid Build Coastguard Worker *
325*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
326*2d1272b8SAndroid Build Coastguard Worker **/
327*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_paint_funcs_set_user_data(hb_paint_funcs_t * funcs,hb_user_data_key_t * key,void * data,hb_destroy_func_t destroy,hb_bool_t replace)328*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_set_user_data (hb_paint_funcs_t *funcs,
329*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key,
330*2d1272b8SAndroid Build Coastguard Worker void * data,
331*2d1272b8SAndroid Build Coastguard Worker hb_destroy_func_t destroy,
332*2d1272b8SAndroid Build Coastguard Worker hb_bool_t replace)
333*2d1272b8SAndroid Build Coastguard Worker {
334*2d1272b8SAndroid Build Coastguard Worker return hb_object_set_user_data (funcs, key, data, destroy, replace);
335*2d1272b8SAndroid Build Coastguard Worker }
336*2d1272b8SAndroid Build Coastguard Worker
337*2d1272b8SAndroid Build Coastguard Worker /**
338*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_get_user_data: (skip)
339*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
340*2d1272b8SAndroid Build Coastguard Worker * @key: The user-data key to query
341*2d1272b8SAndroid Build Coastguard Worker *
342*2d1272b8SAndroid Build Coastguard Worker * Fetches the user-data associated with the specified key,
343*2d1272b8SAndroid Build Coastguard Worker * attached to the specified paint-functions structure.
344*2d1272b8SAndroid Build Coastguard Worker *
345*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): A pointer to the user data
346*2d1272b8SAndroid Build Coastguard Worker *
347*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
348*2d1272b8SAndroid Build Coastguard Worker **/
349*2d1272b8SAndroid Build Coastguard Worker void *
hb_paint_funcs_get_user_data(const hb_paint_funcs_t * funcs,hb_user_data_key_t * key)350*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_get_user_data (const hb_paint_funcs_t *funcs,
351*2d1272b8SAndroid Build Coastguard Worker hb_user_data_key_t *key)
352*2d1272b8SAndroid Build Coastguard Worker {
353*2d1272b8SAndroid Build Coastguard Worker return hb_object_get_user_data (funcs, key);
354*2d1272b8SAndroid Build Coastguard Worker }
355*2d1272b8SAndroid Build Coastguard Worker
356*2d1272b8SAndroid Build Coastguard Worker /**
357*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_make_immutable:
358*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
359*2d1272b8SAndroid Build Coastguard Worker *
360*2d1272b8SAndroid Build Coastguard Worker * Makes a paint-functions structure immutable.
361*2d1272b8SAndroid Build Coastguard Worker *
362*2d1272b8SAndroid Build Coastguard Worker * After this call, all attempts to set one of the callbacks
363*2d1272b8SAndroid Build Coastguard Worker * on @funcs will fail.
364*2d1272b8SAndroid Build Coastguard Worker *
365*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
366*2d1272b8SAndroid Build Coastguard Worker */
367*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_funcs_make_immutable(hb_paint_funcs_t * funcs)368*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_make_immutable (hb_paint_funcs_t *funcs)
369*2d1272b8SAndroid Build Coastguard Worker {
370*2d1272b8SAndroid Build Coastguard Worker if (hb_object_is_immutable (funcs))
371*2d1272b8SAndroid Build Coastguard Worker return;
372*2d1272b8SAndroid Build Coastguard Worker
373*2d1272b8SAndroid Build Coastguard Worker hb_object_make_immutable (funcs);
374*2d1272b8SAndroid Build Coastguard Worker }
375*2d1272b8SAndroid Build Coastguard Worker
376*2d1272b8SAndroid Build Coastguard Worker /**
377*2d1272b8SAndroid Build Coastguard Worker * hb_paint_funcs_is_immutable:
378*2d1272b8SAndroid Build Coastguard Worker * @funcs: The paint-functions structure
379*2d1272b8SAndroid Build Coastguard Worker *
380*2d1272b8SAndroid Build Coastguard Worker * Tests whether a paint-functions structure is immutable.
381*2d1272b8SAndroid Build Coastguard Worker *
382*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if @funcs is immutable, `false` otherwise
383*2d1272b8SAndroid Build Coastguard Worker *
384*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
385*2d1272b8SAndroid Build Coastguard Worker */
386*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_paint_funcs_is_immutable(hb_paint_funcs_t * funcs)387*2d1272b8SAndroid Build Coastguard Worker hb_paint_funcs_is_immutable (hb_paint_funcs_t *funcs)
388*2d1272b8SAndroid Build Coastguard Worker {
389*2d1272b8SAndroid Build Coastguard Worker return hb_object_is_immutable (funcs);
390*2d1272b8SAndroid Build Coastguard Worker }
391*2d1272b8SAndroid Build Coastguard Worker
392*2d1272b8SAndroid Build Coastguard Worker
393*2d1272b8SAndroid Build Coastguard Worker /**
394*2d1272b8SAndroid Build Coastguard Worker * hb_color_line_get_color_stops:
395*2d1272b8SAndroid Build Coastguard Worker * @color_line: a #hb_color_line_t object
396*2d1272b8SAndroid Build Coastguard Worker * @start: the index of the first color stop to return
397*2d1272b8SAndroid Build Coastguard Worker * @count: (inout) (optional): Input = the maximum number of feature tags to return;
398*2d1272b8SAndroid Build Coastguard Worker * Output = the actual number of feature tags returned (may be zero)
399*2d1272b8SAndroid Build Coastguard Worker * @color_stops: (out) (array length=count) (optional): Array of #hb_color_stop_t to populate
400*2d1272b8SAndroid Build Coastguard Worker *
401*2d1272b8SAndroid Build Coastguard Worker * Fetches a list of color stops from the given color line object.
402*2d1272b8SAndroid Build Coastguard Worker *
403*2d1272b8SAndroid Build Coastguard Worker * Note that due to variations being applied, the returned color stops
404*2d1272b8SAndroid Build Coastguard Worker * may be out of order. It is the callers responsibility to ensure that
405*2d1272b8SAndroid Build Coastguard Worker * color stops are sorted by their offset before they are used.
406*2d1272b8SAndroid Build Coastguard Worker *
407*2d1272b8SAndroid Build Coastguard Worker * Return value: the total number of color stops in @color_line
408*2d1272b8SAndroid Build Coastguard Worker *
409*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
410*2d1272b8SAndroid Build Coastguard Worker */
411*2d1272b8SAndroid Build Coastguard Worker unsigned int
hb_color_line_get_color_stops(hb_color_line_t * color_line,unsigned int start,unsigned int * count,hb_color_stop_t * color_stops)412*2d1272b8SAndroid Build Coastguard Worker hb_color_line_get_color_stops (hb_color_line_t *color_line,
413*2d1272b8SAndroid Build Coastguard Worker unsigned int start,
414*2d1272b8SAndroid Build Coastguard Worker unsigned int *count,
415*2d1272b8SAndroid Build Coastguard Worker hb_color_stop_t *color_stops)
416*2d1272b8SAndroid Build Coastguard Worker {
417*2d1272b8SAndroid Build Coastguard Worker return color_line->get_color_stops (color_line,
418*2d1272b8SAndroid Build Coastguard Worker color_line->data,
419*2d1272b8SAndroid Build Coastguard Worker start, count,
420*2d1272b8SAndroid Build Coastguard Worker color_stops,
421*2d1272b8SAndroid Build Coastguard Worker color_line->get_color_stops_user_data);
422*2d1272b8SAndroid Build Coastguard Worker }
423*2d1272b8SAndroid Build Coastguard Worker
424*2d1272b8SAndroid Build Coastguard Worker /**
425*2d1272b8SAndroid Build Coastguard Worker * hb_color_line_get_extend:
426*2d1272b8SAndroid Build Coastguard Worker * @color_line: a #hb_color_line_t object
427*2d1272b8SAndroid Build Coastguard Worker *
428*2d1272b8SAndroid Build Coastguard Worker * Fetches the extend mode of the color line object.
429*2d1272b8SAndroid Build Coastguard Worker *
430*2d1272b8SAndroid Build Coastguard Worker * Return value: the extend mode of @color_line
431*2d1272b8SAndroid Build Coastguard Worker *
432*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
433*2d1272b8SAndroid Build Coastguard Worker */
434*2d1272b8SAndroid Build Coastguard Worker hb_paint_extend_t
hb_color_line_get_extend(hb_color_line_t * color_line)435*2d1272b8SAndroid Build Coastguard Worker hb_color_line_get_extend (hb_color_line_t *color_line)
436*2d1272b8SAndroid Build Coastguard Worker {
437*2d1272b8SAndroid Build Coastguard Worker return color_line->get_extend (color_line,
438*2d1272b8SAndroid Build Coastguard Worker color_line->data,
439*2d1272b8SAndroid Build Coastguard Worker color_line->get_extend_user_data);
440*2d1272b8SAndroid Build Coastguard Worker }
441*2d1272b8SAndroid Build Coastguard Worker
442*2d1272b8SAndroid Build Coastguard Worker
443*2d1272b8SAndroid Build Coastguard Worker /**
444*2d1272b8SAndroid Build Coastguard Worker * hb_paint_push_transform:
445*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
446*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
447*2d1272b8SAndroid Build Coastguard Worker * @xx: xx component of the transform matrix
448*2d1272b8SAndroid Build Coastguard Worker * @yx: yx component of the transform matrix
449*2d1272b8SAndroid Build Coastguard Worker * @xy: xy component of the transform matrix
450*2d1272b8SAndroid Build Coastguard Worker * @yy: yy component of the transform matrix
451*2d1272b8SAndroid Build Coastguard Worker * @dx: dx component of the transform matrix
452*2d1272b8SAndroid Build Coastguard Worker * @dy: dy component of the transform matrix
453*2d1272b8SAndroid Build Coastguard Worker *
454*2d1272b8SAndroid Build Coastguard Worker * Perform a "push-transform" paint operation.
455*2d1272b8SAndroid Build Coastguard Worker *
456*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
457*2d1272b8SAndroid Build Coastguard Worker */
458*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_push_transform(hb_paint_funcs_t * funcs,void * paint_data,float xx,float yx,float xy,float yy,float dx,float dy)459*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_transform (hb_paint_funcs_t *funcs, void *paint_data,
460*2d1272b8SAndroid Build Coastguard Worker float xx, float yx,
461*2d1272b8SAndroid Build Coastguard Worker float xy, float yy,
462*2d1272b8SAndroid Build Coastguard Worker float dx, float dy)
463*2d1272b8SAndroid Build Coastguard Worker {
464*2d1272b8SAndroid Build Coastguard Worker funcs->push_transform (paint_data, xx, yx, xy, yy, dx, dy);
465*2d1272b8SAndroid Build Coastguard Worker }
466*2d1272b8SAndroid Build Coastguard Worker
467*2d1272b8SAndroid Build Coastguard Worker /**
468*2d1272b8SAndroid Build Coastguard Worker * hb_paint_pop_transform:
469*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
470*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
471*2d1272b8SAndroid Build Coastguard Worker *
472*2d1272b8SAndroid Build Coastguard Worker * Perform a "pop-transform" paint operation.
473*2d1272b8SAndroid Build Coastguard Worker *
474*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
475*2d1272b8SAndroid Build Coastguard Worker */
476*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_pop_transform(hb_paint_funcs_t * funcs,void * paint_data)477*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_transform (hb_paint_funcs_t *funcs, void *paint_data)
478*2d1272b8SAndroid Build Coastguard Worker {
479*2d1272b8SAndroid Build Coastguard Worker funcs->pop_transform (paint_data);
480*2d1272b8SAndroid Build Coastguard Worker }
481*2d1272b8SAndroid Build Coastguard Worker
482*2d1272b8SAndroid Build Coastguard Worker /**
483*2d1272b8SAndroid Build Coastguard Worker * hb_paint_color_glyph:
484*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
485*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
486*2d1272b8SAndroid Build Coastguard Worker * @glyph: the glyph ID
487*2d1272b8SAndroid Build Coastguard Worker * @font: the font
488*2d1272b8SAndroid Build Coastguard Worker *
489*2d1272b8SAndroid Build Coastguard Worker * Perform a "color-glyph" paint operation.
490*2d1272b8SAndroid Build Coastguard Worker *
491*2d1272b8SAndroid Build Coastguard Worker * Since: 8.2.0
492*2d1272b8SAndroid Build Coastguard Worker */
493*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_paint_color_glyph(hb_paint_funcs_t * funcs,void * paint_data,hb_codepoint_t glyph,hb_font_t * font)494*2d1272b8SAndroid Build Coastguard Worker hb_paint_color_glyph (hb_paint_funcs_t *funcs, void *paint_data,
495*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
496*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font)
497*2d1272b8SAndroid Build Coastguard Worker {
498*2d1272b8SAndroid Build Coastguard Worker return funcs->color_glyph (paint_data, glyph, font);
499*2d1272b8SAndroid Build Coastguard Worker }
500*2d1272b8SAndroid Build Coastguard Worker
501*2d1272b8SAndroid Build Coastguard Worker /**
502*2d1272b8SAndroid Build Coastguard Worker * hb_paint_push_clip_glyph:
503*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
504*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
505*2d1272b8SAndroid Build Coastguard Worker * @glyph: the glyph ID
506*2d1272b8SAndroid Build Coastguard Worker * @font: the font
507*2d1272b8SAndroid Build Coastguard Worker *
508*2d1272b8SAndroid Build Coastguard Worker * Perform a "push-clip-glyph" paint operation.
509*2d1272b8SAndroid Build Coastguard Worker *
510*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
511*2d1272b8SAndroid Build Coastguard Worker */
512*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_push_clip_glyph(hb_paint_funcs_t * funcs,void * paint_data,hb_codepoint_t glyph,hb_font_t * font)513*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_clip_glyph (hb_paint_funcs_t *funcs, void *paint_data,
514*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t glyph,
515*2d1272b8SAndroid Build Coastguard Worker hb_font_t *font)
516*2d1272b8SAndroid Build Coastguard Worker {
517*2d1272b8SAndroid Build Coastguard Worker funcs->push_clip_glyph (paint_data, glyph, font);
518*2d1272b8SAndroid Build Coastguard Worker }
519*2d1272b8SAndroid Build Coastguard Worker
520*2d1272b8SAndroid Build Coastguard Worker /**
521*2d1272b8SAndroid Build Coastguard Worker * hb_paint_push_clip_rectangle:
522*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
523*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
524*2d1272b8SAndroid Build Coastguard Worker * @xmin: min X for the rectangle
525*2d1272b8SAndroid Build Coastguard Worker * @ymin: min Y for the rectangle
526*2d1272b8SAndroid Build Coastguard Worker * @xmax: max X for the rectangle
527*2d1272b8SAndroid Build Coastguard Worker * @ymax: max Y for the rectangle
528*2d1272b8SAndroid Build Coastguard Worker *
529*2d1272b8SAndroid Build Coastguard Worker * Perform a "push-clip-rect" paint operation.
530*2d1272b8SAndroid Build Coastguard Worker *
531*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
532*2d1272b8SAndroid Build Coastguard Worker */
533*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_push_clip_rectangle(hb_paint_funcs_t * funcs,void * paint_data,float xmin,float ymin,float xmax,float ymax)534*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_clip_rectangle (hb_paint_funcs_t *funcs, void *paint_data,
535*2d1272b8SAndroid Build Coastguard Worker float xmin, float ymin, float xmax, float ymax)
536*2d1272b8SAndroid Build Coastguard Worker {
537*2d1272b8SAndroid Build Coastguard Worker funcs->push_clip_rectangle (paint_data, xmin, ymin, xmax, ymax);
538*2d1272b8SAndroid Build Coastguard Worker }
539*2d1272b8SAndroid Build Coastguard Worker
540*2d1272b8SAndroid Build Coastguard Worker /**
541*2d1272b8SAndroid Build Coastguard Worker * hb_paint_pop_clip:
542*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
543*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
544*2d1272b8SAndroid Build Coastguard Worker *
545*2d1272b8SAndroid Build Coastguard Worker * Perform a "pop-clip" paint operation.
546*2d1272b8SAndroid Build Coastguard Worker *
547*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
548*2d1272b8SAndroid Build Coastguard Worker */
549*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_pop_clip(hb_paint_funcs_t * funcs,void * paint_data)550*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_clip (hb_paint_funcs_t *funcs, void *paint_data)
551*2d1272b8SAndroid Build Coastguard Worker {
552*2d1272b8SAndroid Build Coastguard Worker funcs->pop_clip (paint_data);
553*2d1272b8SAndroid Build Coastguard Worker }
554*2d1272b8SAndroid Build Coastguard Worker
555*2d1272b8SAndroid Build Coastguard Worker /**
556*2d1272b8SAndroid Build Coastguard Worker * hb_paint_color:
557*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
558*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
559*2d1272b8SAndroid Build Coastguard Worker * @is_foreground: whether the color is the foreground
560*2d1272b8SAndroid Build Coastguard Worker * @color: The color to use
561*2d1272b8SAndroid Build Coastguard Worker *
562*2d1272b8SAndroid Build Coastguard Worker * Perform a "color" paint operation.
563*2d1272b8SAndroid Build Coastguard Worker *
564*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
565*2d1272b8SAndroid Build Coastguard Worker */
566*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_color(hb_paint_funcs_t * funcs,void * paint_data,hb_bool_t is_foreground,hb_color_t color)567*2d1272b8SAndroid Build Coastguard Worker hb_paint_color (hb_paint_funcs_t *funcs, void *paint_data,
568*2d1272b8SAndroid Build Coastguard Worker hb_bool_t is_foreground,
569*2d1272b8SAndroid Build Coastguard Worker hb_color_t color)
570*2d1272b8SAndroid Build Coastguard Worker {
571*2d1272b8SAndroid Build Coastguard Worker funcs->color (paint_data, is_foreground, color);
572*2d1272b8SAndroid Build Coastguard Worker }
573*2d1272b8SAndroid Build Coastguard Worker
574*2d1272b8SAndroid Build Coastguard Worker /**
575*2d1272b8SAndroid Build Coastguard Worker * hb_paint_image:
576*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
577*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
578*2d1272b8SAndroid Build Coastguard Worker * @image: image data
579*2d1272b8SAndroid Build Coastguard Worker * @width: width of the raster image in pixels, or 0
580*2d1272b8SAndroid Build Coastguard Worker * @height: height of the raster image in pixels, or 0
581*2d1272b8SAndroid Build Coastguard Worker * @format: the image format as a tag
582*2d1272b8SAndroid Build Coastguard Worker * @slant: the synthetic slant ratio to be applied to the image during rendering
583*2d1272b8SAndroid Build Coastguard Worker * @extents: (nullable): the extents of the glyph
584*2d1272b8SAndroid Build Coastguard Worker *
585*2d1272b8SAndroid Build Coastguard Worker * Perform a "image" paint operation.
586*2d1272b8SAndroid Build Coastguard Worker *
587*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
588*2d1272b8SAndroid Build Coastguard Worker */
589*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_image(hb_paint_funcs_t * funcs,void * paint_data,hb_blob_t * image,unsigned int width,unsigned int height,hb_tag_t format,float slant,hb_glyph_extents_t * extents)590*2d1272b8SAndroid Build Coastguard Worker hb_paint_image (hb_paint_funcs_t *funcs, void *paint_data,
591*2d1272b8SAndroid Build Coastguard Worker hb_blob_t *image,
592*2d1272b8SAndroid Build Coastguard Worker unsigned int width,
593*2d1272b8SAndroid Build Coastguard Worker unsigned int height,
594*2d1272b8SAndroid Build Coastguard Worker hb_tag_t format,
595*2d1272b8SAndroid Build Coastguard Worker float slant,
596*2d1272b8SAndroid Build Coastguard Worker hb_glyph_extents_t *extents)
597*2d1272b8SAndroid Build Coastguard Worker {
598*2d1272b8SAndroid Build Coastguard Worker funcs->image (paint_data, image, width, height, format, slant, extents);
599*2d1272b8SAndroid Build Coastguard Worker }
600*2d1272b8SAndroid Build Coastguard Worker
601*2d1272b8SAndroid Build Coastguard Worker /**
602*2d1272b8SAndroid Build Coastguard Worker * hb_paint_linear_gradient:
603*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
604*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
605*2d1272b8SAndroid Build Coastguard Worker * @color_line: Color information for the gradient
606*2d1272b8SAndroid Build Coastguard Worker * @x0: X coordinate of the first point
607*2d1272b8SAndroid Build Coastguard Worker * @y0: Y coordinate of the first point
608*2d1272b8SAndroid Build Coastguard Worker * @x1: X coordinate of the second point
609*2d1272b8SAndroid Build Coastguard Worker * @y1: Y coordinate of the second point
610*2d1272b8SAndroid Build Coastguard Worker * @x2: X coordinate of the third point
611*2d1272b8SAndroid Build Coastguard Worker * @y2: Y coordinate of the third point
612*2d1272b8SAndroid Build Coastguard Worker *
613*2d1272b8SAndroid Build Coastguard Worker * Perform a "linear-gradient" paint operation.
614*2d1272b8SAndroid Build Coastguard Worker *
615*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
616*2d1272b8SAndroid Build Coastguard Worker */
617*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_linear_gradient(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float x1,float y1,float x2,float y2)618*2d1272b8SAndroid Build Coastguard Worker hb_paint_linear_gradient (hb_paint_funcs_t *funcs, void *paint_data,
619*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
620*2d1272b8SAndroid Build Coastguard Worker float x0, float y0,
621*2d1272b8SAndroid Build Coastguard Worker float x1, float y1,
622*2d1272b8SAndroid Build Coastguard Worker float x2, float y2)
623*2d1272b8SAndroid Build Coastguard Worker {
624*2d1272b8SAndroid Build Coastguard Worker funcs->linear_gradient (paint_data, color_line, x0, y0, x1, y1, x2, y2);
625*2d1272b8SAndroid Build Coastguard Worker }
626*2d1272b8SAndroid Build Coastguard Worker
627*2d1272b8SAndroid Build Coastguard Worker /**
628*2d1272b8SAndroid Build Coastguard Worker * hb_paint_radial_gradient:
629*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
630*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
631*2d1272b8SAndroid Build Coastguard Worker * @color_line: Color information for the gradient
632*2d1272b8SAndroid Build Coastguard Worker * @x0: X coordinate of the first circle's center
633*2d1272b8SAndroid Build Coastguard Worker * @y0: Y coordinate of the first circle's center
634*2d1272b8SAndroid Build Coastguard Worker * @r0: radius of the first circle
635*2d1272b8SAndroid Build Coastguard Worker * @x1: X coordinate of the second circle's center
636*2d1272b8SAndroid Build Coastguard Worker * @y1: Y coordinate of the second circle's center
637*2d1272b8SAndroid Build Coastguard Worker * @r1: radius of the second circle
638*2d1272b8SAndroid Build Coastguard Worker *
639*2d1272b8SAndroid Build Coastguard Worker * Perform a "radial-gradient" paint operation.
640*2d1272b8SAndroid Build Coastguard Worker *
641*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
642*2d1272b8SAndroid Build Coastguard Worker */
643*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_radial_gradient(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float r0,float x1,float y1,float r1)644*2d1272b8SAndroid Build Coastguard Worker hb_paint_radial_gradient (hb_paint_funcs_t *funcs, void *paint_data,
645*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
646*2d1272b8SAndroid Build Coastguard Worker float x0, float y0, float r0,
647*2d1272b8SAndroid Build Coastguard Worker float x1, float y1, float r1)
648*2d1272b8SAndroid Build Coastguard Worker {
649*2d1272b8SAndroid Build Coastguard Worker funcs->radial_gradient (paint_data, color_line, x0, y0, r0, y1, x1, r1);
650*2d1272b8SAndroid Build Coastguard Worker }
651*2d1272b8SAndroid Build Coastguard Worker
652*2d1272b8SAndroid Build Coastguard Worker /**
653*2d1272b8SAndroid Build Coastguard Worker * hb_paint_sweep_gradient:
654*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
655*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
656*2d1272b8SAndroid Build Coastguard Worker * @color_line: Color information for the gradient
657*2d1272b8SAndroid Build Coastguard Worker * @x0: X coordinate of the circle's center
658*2d1272b8SAndroid Build Coastguard Worker * @y0: Y coordinate of the circle's center
659*2d1272b8SAndroid Build Coastguard Worker * @start_angle: the start angle
660*2d1272b8SAndroid Build Coastguard Worker * @end_angle: the end angle
661*2d1272b8SAndroid Build Coastguard Worker *
662*2d1272b8SAndroid Build Coastguard Worker * Perform a "sweep-gradient" paint operation.
663*2d1272b8SAndroid Build Coastguard Worker *
664*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
665*2d1272b8SAndroid Build Coastguard Worker */
666*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_sweep_gradient(hb_paint_funcs_t * funcs,void * paint_data,hb_color_line_t * color_line,float x0,float y0,float start_angle,float end_angle)667*2d1272b8SAndroid Build Coastguard Worker hb_paint_sweep_gradient (hb_paint_funcs_t *funcs, void *paint_data,
668*2d1272b8SAndroid Build Coastguard Worker hb_color_line_t *color_line,
669*2d1272b8SAndroid Build Coastguard Worker float x0, float y0,
670*2d1272b8SAndroid Build Coastguard Worker float start_angle, float end_angle)
671*2d1272b8SAndroid Build Coastguard Worker {
672*2d1272b8SAndroid Build Coastguard Worker funcs->sweep_gradient (paint_data, color_line, x0, y0, start_angle, end_angle);
673*2d1272b8SAndroid Build Coastguard Worker }
674*2d1272b8SAndroid Build Coastguard Worker
675*2d1272b8SAndroid Build Coastguard Worker /**
676*2d1272b8SAndroid Build Coastguard Worker * hb_paint_push_group:
677*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
678*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
679*2d1272b8SAndroid Build Coastguard Worker *
680*2d1272b8SAndroid Build Coastguard Worker * Perform a "push-group" paint operation.
681*2d1272b8SAndroid Build Coastguard Worker *
682*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
683*2d1272b8SAndroid Build Coastguard Worker */
684*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_push_group(hb_paint_funcs_t * funcs,void * paint_data)685*2d1272b8SAndroid Build Coastguard Worker hb_paint_push_group (hb_paint_funcs_t *funcs, void *paint_data)
686*2d1272b8SAndroid Build Coastguard Worker {
687*2d1272b8SAndroid Build Coastguard Worker funcs->push_group (paint_data);
688*2d1272b8SAndroid Build Coastguard Worker }
689*2d1272b8SAndroid Build Coastguard Worker
690*2d1272b8SAndroid Build Coastguard Worker /**
691*2d1272b8SAndroid Build Coastguard Worker * hb_paint_pop_group:
692*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
693*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
694*2d1272b8SAndroid Build Coastguard Worker * @mode: the compositing mode to use
695*2d1272b8SAndroid Build Coastguard Worker *
696*2d1272b8SAndroid Build Coastguard Worker * Perform a "pop-group" paint operation.
697*2d1272b8SAndroid Build Coastguard Worker *
698*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
699*2d1272b8SAndroid Build Coastguard Worker */
700*2d1272b8SAndroid Build Coastguard Worker void
hb_paint_pop_group(hb_paint_funcs_t * funcs,void * paint_data,hb_paint_composite_mode_t mode)701*2d1272b8SAndroid Build Coastguard Worker hb_paint_pop_group (hb_paint_funcs_t *funcs, void *paint_data,
702*2d1272b8SAndroid Build Coastguard Worker hb_paint_composite_mode_t mode)
703*2d1272b8SAndroid Build Coastguard Worker {
704*2d1272b8SAndroid Build Coastguard Worker funcs->pop_group (paint_data, mode);
705*2d1272b8SAndroid Build Coastguard Worker }
706*2d1272b8SAndroid Build Coastguard Worker
707*2d1272b8SAndroid Build Coastguard Worker /**
708*2d1272b8SAndroid Build Coastguard Worker * hb_paint_custom_palette_color:
709*2d1272b8SAndroid Build Coastguard Worker * @funcs: paint functions
710*2d1272b8SAndroid Build Coastguard Worker * @paint_data: associated data passed by the caller
711*2d1272b8SAndroid Build Coastguard Worker * @color_index: color index
712*2d1272b8SAndroid Build Coastguard Worker * @color: (out): fetched color
713*2d1272b8SAndroid Build Coastguard Worker *
714*2d1272b8SAndroid Build Coastguard Worker * Gets the custom palette color for @color_index.
715*2d1272b8SAndroid Build Coastguard Worker *
716*2d1272b8SAndroid Build Coastguard Worker * Return value: `true` if found, `false` otherwise
717*2d1272b8SAndroid Build Coastguard Worker *
718*2d1272b8SAndroid Build Coastguard Worker * Since: 7.0.0
719*2d1272b8SAndroid Build Coastguard Worker */
720*2d1272b8SAndroid Build Coastguard Worker hb_bool_t
hb_paint_custom_palette_color(hb_paint_funcs_t * funcs,void * paint_data,unsigned int color_index,hb_color_t * color)721*2d1272b8SAndroid Build Coastguard Worker hb_paint_custom_palette_color (hb_paint_funcs_t *funcs, void *paint_data,
722*2d1272b8SAndroid Build Coastguard Worker unsigned int color_index,
723*2d1272b8SAndroid Build Coastguard Worker hb_color_t *color)
724*2d1272b8SAndroid Build Coastguard Worker {
725*2d1272b8SAndroid Build Coastguard Worker return funcs->custom_palette_color (paint_data, color_index, color);
726*2d1272b8SAndroid Build Coastguard Worker }
727*2d1272b8SAndroid Build Coastguard Worker
728*2d1272b8SAndroid Build Coastguard Worker #endif
729