blob: 46797e64e62dd546f1ecdc5bc03053d2c06f4357 [file] [log] [blame]
Ebrahim Byagowif883c312019-10-13 12:31:53 +03301/*
Ebrahim Byagowi017f6062020-01-10 20:44:15 +03302 * Copyright © 2019-2020 Ebrahim Byagowi
Ebrahim Byagowif883c312019-10-13 12:31:53 +03303 *
4 * This is part of HarfBuzz, a text shaping library.
5 *
6 * Permission is hereby granted, without written agreement and without
7 * license or royalty fees, to use, copy, modify, and distribute this
8 * software and its documentation for any purpose, provided that the
9 * above copyright notice and the following two paragraphs appear in
10 * all copies of this software.
11 *
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
16 * DAMAGE.
17 *
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
23 */
24
25#include "hb.hh"
26
Ebrahim Byagowiac81e942020-01-28 12:34:47 +033027#ifndef HB_NO_DRAW
Ebrahim Byagowif883c312019-10-13 12:31:53 +033028
Ebrahim Byagowiac81e942020-01-28 12:34:47 +033029#include "hb-draw.hh"
Ebrahim Byagowif883c312019-10-13 12:31:53 +033030
Khaled Hosny8e892bd2022-02-08 19:36:29 +020031/**
32 * SECTION:hb-draw
33 * @title: hb-draw
34 * @short_description: Glyph drawing
35 * @include: hb.h
36 *
37 * Functions for drawing (extracting) glyph shapes.
38 **/
39
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060040static void
41hb_draw_move_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
Behdad Esfahbodf1a9a9c2022-02-03 14:10:40 -060042 hb_draw_state_t *st HB_UNUSED,
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060043 float to_x HB_UNUSED, float to_y HB_UNUSED,
44 void *user_data HB_UNUSED) {}
45
46static void
47hb_draw_line_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
Behdad Esfahbodf1a9a9c2022-02-03 14:10:40 -060048 hb_draw_state_t *st HB_UNUSED,
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060049 float to_x HB_UNUSED, float to_y HB_UNUSED,
50 void *user_data HB_UNUSED) {}
51
52static void
Behdad Esfahboda357e5d2022-02-03 14:42:56 -060053hb_draw_quadratic_to_nil (hb_draw_funcs_t *dfuncs, void *draw_data,
54 hb_draw_state_t *st,
55 float control_x, float control_y,
56 float to_x, float to_y,
Behdad Esfahbod2ce19f22022-02-05 15:01:15 -060057 void *user_data HB_UNUSED)
Behdad Esfahboda357e5d2022-02-03 14:42:56 -060058{
Behdad Esfahbod36dd5d32022-06-26 16:16:43 -060059#define HB_ONE_THIRD 0.33333333f
Behdad Esfahboda357e5d2022-02-03 14:42:56 -060060 dfuncs->emit_cubic_to (draw_data, *st,
Behdad Esfahbod36dd5d32022-06-26 16:16:43 -060061 (st->current_x + 2.f * control_x) * HB_ONE_THIRD,
62 (st->current_y + 2.f * control_y) * HB_ONE_THIRD,
63 (to_x + 2.f * control_x) * HB_ONE_THIRD,
64 (to_y + 2.f * control_y) * HB_ONE_THIRD,
Behdad Esfahboda357e5d2022-02-03 14:42:56 -060065 to_x, to_y);
Behdad Esfahbod36dd5d32022-06-26 16:16:43 -060066#undef HB_ONE_THIRD
Behdad Esfahboda357e5d2022-02-03 14:42:56 -060067}
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060068
69static void
70hb_draw_cubic_to_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
Behdad Esfahbodf1a9a9c2022-02-03 14:10:40 -060071 hb_draw_state_t *st HB_UNUSED,
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060072 float control1_x HB_UNUSED, float control1_y HB_UNUSED,
73 float control2_x HB_UNUSED, float control2_y HB_UNUSED,
74 float to_x HB_UNUSED, float to_y HB_UNUSED,
75 void *user_data HB_UNUSED) {}
76
77static void
78hb_draw_close_path_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UNUSED,
Behdad Esfahbodf1a9a9c2022-02-03 14:10:40 -060079 hb_draw_state_t *st HB_UNUSED,
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -060080 void *user_data HB_UNUSED) {}
81
82
83#define HB_DRAW_FUNC_IMPLEMENT(name) \
84 \
85void \
86hb_draw_funcs_set_##name##_func (hb_draw_funcs_t *dfuncs, \
87 hb_draw_##name##_func_t func, \
88 void *user_data, \
89 hb_destroy_func_t destroy) \
90{ \
91 if (hb_object_is_immutable (dfuncs)) \
92 return; \
93 \
Behdad Esfahbode0a52312022-06-16 13:24:02 -060094 if (dfuncs->destroy && dfuncs->destroy->name) \
95 dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name); \
96 \
97 if (user_data && !dfuncs->user_data) \
98 { \
99 dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data)); \
100 if (unlikely (!dfuncs->user_data)) \
101 goto fail; \
102 } \
103 if (destroy && !dfuncs->destroy) \
104 { \
105 dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy)); \
106 if (unlikely (!dfuncs->destroy)) \
107 goto fail; \
108 } \
109 \
110 if (func) { \
111 dfuncs->func.name = func; \
112 if (dfuncs->user_data) \
113 dfuncs->user_data->name = user_data; \
114 if (dfuncs->destroy) \
115 dfuncs->destroy->name = destroy; \
116 } else { \
117 dfuncs->func.name = hb_draw_##name##_nil; \
118 if (dfuncs->user_data) \
119 dfuncs->user_data->name = nullptr; \
120 if (dfuncs->destroy) \
121 dfuncs->destroy->name = nullptr; \
122 } \
Behdad Esfahbodf8544cb2022-07-12 11:52:33 -0600123 return; \
Behdad Esfahbode0a52312022-06-16 13:24:02 -0600124 \
125fail: \
126 if (destroy) \
127 destroy (user_data); \
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -0600128}
129
130HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
131#undef HB_DRAW_FUNC_IMPLEMENT
132
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330133/**
Behdad Esfahbodf78a2502022-06-05 00:55:35 -0600134 * hb_draw_funcs_create:
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330135 *
Ebrahim Byagowi920dca42020-01-30 18:03:06 +0330136 * Creates a new draw callbacks object.
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330137 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200138 * Return value: (transfer full):
139 * A newly allocated #hb_draw_funcs_t with a reference count of 1. The initial
140 * reference count should be released with hb_draw_funcs_destroy when you are
Khaled Hosny98e90cc2022-06-30 08:43:57 +0200141 * done using the #hb_draw_funcs_t. This function never returns `NULL`. If
Khaled Hosnyf9428742022-02-12 01:43:11 +0200142 * memory cannot be allocated, a special singleton #hb_draw_funcs_t object will
143 * be returned.
144 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200145 * Since: 4.0.0
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330146 **/
Ebrahim Byagowiac81e942020-01-28 12:34:47 +0330147hb_draw_funcs_t *
148hb_draw_funcs_create ()
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330149{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600150 hb_draw_funcs_t *dfuncs;
151 if (unlikely (!(dfuncs = hb_object_create<hb_draw_funcs_t> ())))
Ebrahim Byagowiac81e942020-01-28 12:34:47 +0330152 return const_cast<hb_draw_funcs_t *> (&Null (hb_draw_funcs_t));
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330153
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600154 dfuncs->func = Null (hb_draw_funcs_t).func;
Behdad Esfahbodd6b61df2022-02-05 13:46:48 -0600155
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600156 return dfuncs;
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330157}
158
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -0600159DEFINE_NULL_INSTANCE (hb_draw_funcs_t) =
160{
161 HB_OBJECT_HEADER_STATIC,
162
163 {
164#define HB_DRAW_FUNC_IMPLEMENT(name) hb_draw_##name##_nil,
165 HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
166#undef HB_DRAW_FUNC_IMPLEMENT
167 }
168};
169
Behdad Esfahbod2bed4f42022-02-02 21:42:48 -0600170
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330171/**
Khaled Hosnyf9428742022-02-12 01:43:11 +0200172 * hb_draw_funcs_reference: (skip)
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600173 * @dfuncs: draw functions
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330174 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200175 * Increases the reference count on @dfuncs by one. This prevents @buffer from
176 * being destroyed until a matching call to hb_draw_funcs_destroy() is made.
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330177 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200178 * Return value: (transfer full):
179 * The referenced #hb_draw_funcs_t.
180 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200181 * Since: 4.0.0
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330182 **/
Ebrahim Byagowiac81e942020-01-28 12:34:47 +0330183hb_draw_funcs_t *
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600184hb_draw_funcs_reference (hb_draw_funcs_t *dfuncs)
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330185{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600186 return hb_object_reference (dfuncs);
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330187}
188
189/**
Khaled Hosnyf9428742022-02-12 01:43:11 +0200190 * hb_draw_funcs_destroy: (skip)
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600191 * @dfuncs: draw functions
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330192 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200193 * Deallocate the @dfuncs.
194 * Decreases the reference count on @dfuncs by one. If the result is zero, then
195 * @dfuncs and all associated resources are freed. See hb_draw_funcs_reference().
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330196 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200197 * Since: 4.0.0
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330198 **/
199void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600200hb_draw_funcs_destroy (hb_draw_funcs_t *dfuncs)
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330201{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600202 if (!hb_object_destroy (dfuncs)) return;
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330203
Behdad Esfahbode0a52312022-06-16 13:24:02 -0600204 if (dfuncs->destroy)
205 {
Behdad Esfahbodcdf1cb32022-02-07 19:05:52 -0600206#define HB_DRAW_FUNC_IMPLEMENT(name) \
Behdad Esfahbode0a52312022-06-16 13:24:02 -0600207 if (dfuncs->destroy->name) dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name);
208 HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS
Behdad Esfahbodcdf1cb32022-02-07 19:05:52 -0600209#undef HB_DRAW_FUNC_IMPLEMENT
Behdad Esfahbode0a52312022-06-16 13:24:02 -0600210 }
Behdad Esfahbodcdf1cb32022-02-07 19:05:52 -0600211
Behdad Esfahbod46a36772022-07-12 12:03:00 -0600212 hb_free (dfuncs->destroy);
213 hb_free (dfuncs->user_data);
214
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600215 hb_free (dfuncs);
Ebrahim Byagowiec1fba12020-01-13 19:31:18 +0330216}
217
218/**
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330219 * hb_draw_funcs_make_immutable:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600220 * @dfuncs: draw functions
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330221 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200222 * Makes @dfuncs object immutable.
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330223 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200224 * Since: 4.0.0
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330225 **/
226void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600227hb_draw_funcs_make_immutable (hb_draw_funcs_t *dfuncs)
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330228{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600229 if (hb_object_is_immutable (dfuncs))
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330230 return;
231
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600232 hb_object_make_immutable (dfuncs);
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330233}
234
235/**
236 * hb_draw_funcs_is_immutable:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600237 * @dfuncs: draw functions
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330238 *
Khaled Hosnyf9428742022-02-12 01:43:11 +0200239 * Checks whether @dfuncs is immutable.
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330240 *
Khaled Hosny98e90cc2022-06-30 08:43:57 +0200241 * Return value: `true` if @dfuncs is immutable, `false` otherwise
Khaled Hosnyf9428742022-02-12 01:43:11 +0200242 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200243 * Since: 4.0.0
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330244 **/
245hb_bool_t
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600246hb_draw_funcs_is_immutable (hb_draw_funcs_t *dfuncs)
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330247{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600248 return hb_object_is_immutable (dfuncs);
Ebrahim Byagowib4d3bf12020-02-02 14:32:38 +0330249}
250
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600251
Behdad Esfahbod23762302022-02-07 18:23:26 -0600252/**
253 * hb_draw_move_to:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600254 * @dfuncs: draw functions
Behdad Esfahbod23762302022-02-07 18:23:26 -0600255 * @draw_data: associated draw data passed by the caller
256 * @st: current draw state
257 * @to_x: X component of target point
258 * @to_y: Y component of target point
259 *
260 * Perform a "move-to" draw operation.
261 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200262 * Since: 4.0.0
Behdad Esfahbod23762302022-02-07 18:23:26 -0600263 **/
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600264void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600265hb_draw_move_to (hb_draw_funcs_t *dfuncs, void *draw_data,
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600266 hb_draw_state_t *st,
267 float to_x, float to_y)
268{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600269 dfuncs->move_to (draw_data, *st,
270 to_x, to_y);
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600271}
272
Behdad Esfahbod23762302022-02-07 18:23:26 -0600273/**
274 * hb_draw_line_to:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600275 * @dfuncs: draw functions
Behdad Esfahbod23762302022-02-07 18:23:26 -0600276 * @draw_data: associated draw data passed by the caller
277 * @st: current draw state
278 * @to_x: X component of target point
279 * @to_y: Y component of target point
280 *
281 * Perform a "line-to" draw operation.
282 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200283 * Since: 4.0.0
Behdad Esfahbod23762302022-02-07 18:23:26 -0600284 **/
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600285void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600286hb_draw_line_to (hb_draw_funcs_t *dfuncs, void *draw_data,
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600287 hb_draw_state_t *st,
288 float to_x, float to_y)
289{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600290 dfuncs->line_to (draw_data, *st,
291 to_x, to_y);
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600292}
293
Behdad Esfahbod23762302022-02-07 18:23:26 -0600294/**
295 * hb_draw_quadratic_to:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600296 * @dfuncs: draw functions
Behdad Esfahbod23762302022-02-07 18:23:26 -0600297 * @draw_data: associated draw data passed by the caller
298 * @st: current draw state
299 * @control_x: X component of control point
300 * @control_y: Y component of control point
301 * @to_x: X component of target point
302 * @to_y: Y component of target point
303 *
304 * Perform a "quadratic-to" draw operation.
305 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200306 * Since: 4.0.0
Behdad Esfahbod23762302022-02-07 18:23:26 -0600307 **/
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600308void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600309hb_draw_quadratic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600310 hb_draw_state_t *st,
311 float control_x, float control_y,
312 float to_x, float to_y)
313{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600314 dfuncs->quadratic_to (draw_data, *st,
315 control_x, control_y,
316 to_x, to_y);
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600317}
318
Behdad Esfahbod23762302022-02-07 18:23:26 -0600319/**
320 * hb_draw_cubic_to:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600321 * @dfuncs: draw functions
Behdad Esfahbod23762302022-02-07 18:23:26 -0600322 * @draw_data: associated draw data passed by the caller
323 * @st: current draw state
324 * @control1_x: X component of first control point
325 * @control1_y: Y component of first control point
326 * @control2_x: X component of second control point
327 * @control2_y: Y component of second control point
328 * @to_x: X component of target point
329 * @to_y: Y component of target point
330 *
331 * Perform a "cubic-to" draw operation.
332 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200333 * Since: 4.0.0
Behdad Esfahbod23762302022-02-07 18:23:26 -0600334 **/
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600335void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600336hb_draw_cubic_to (hb_draw_funcs_t *dfuncs, void *draw_data,
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600337 hb_draw_state_t *st,
338 float control1_x, float control1_y,
339 float control2_x, float control2_y,
340 float to_x, float to_y)
341{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600342 dfuncs->cubic_to (draw_data, *st,
343 control1_x, control1_y,
344 control2_x, control2_y,
345 to_x, to_y);
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600346}
347
Behdad Esfahbod23762302022-02-07 18:23:26 -0600348/**
349 * hb_draw_close_path:
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600350 * @dfuncs: draw functions
Behdad Esfahbod23762302022-02-07 18:23:26 -0600351 * @draw_data: associated draw data passed by the caller
352 * @st: current draw state
353 *
354 * Perform a "close-path" draw operation.
355 *
Khaled Hosny8d1b0002022-03-01 21:27:32 +0200356 * Since: 4.0.0
Behdad Esfahbod23762302022-02-07 18:23:26 -0600357 **/
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600358void
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600359hb_draw_close_path (hb_draw_funcs_t *dfuncs, void *draw_data,
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600360 hb_draw_state_t *st)
361{
Behdad Esfahbodc56c1372022-02-07 18:38:00 -0600362 dfuncs->close_path (draw_data, *st);
Behdad Esfahboda9dd9f02022-02-03 13:58:36 -0600363}
364
365
Ebrahim Byagowif883c312019-10-13 12:31:53 +0330366#endif