1*2d1272b8SAndroid Build Coastguard Worker /*
2*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2009 Red Hat, Inc.
3*2d1272b8SAndroid Build Coastguard Worker * Copyright © 2011 Google, Inc.
4*2d1272b8SAndroid Build Coastguard Worker *
5*2d1272b8SAndroid Build Coastguard Worker * This is part of HarfBuzz, a text shaping library.
6*2d1272b8SAndroid Build Coastguard Worker *
7*2d1272b8SAndroid Build Coastguard Worker * Permission is hereby granted, without written agreement and without
8*2d1272b8SAndroid Build Coastguard Worker * license or royalty fees, to use, copy, modify, and distribute this
9*2d1272b8SAndroid Build Coastguard Worker * software and its documentation for any purpose, provided that the
10*2d1272b8SAndroid Build Coastguard Worker * above copyright notice and the following two paragraphs appear in
11*2d1272b8SAndroid Build Coastguard Worker * all copies of this software.
12*2d1272b8SAndroid Build Coastguard Worker *
13*2d1272b8SAndroid Build Coastguard Worker * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
14*2d1272b8SAndroid Build Coastguard Worker * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
15*2d1272b8SAndroid Build Coastguard Worker * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
16*2d1272b8SAndroid Build Coastguard Worker * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
17*2d1272b8SAndroid Build Coastguard Worker * DAMAGE.
18*2d1272b8SAndroid Build Coastguard Worker *
19*2d1272b8SAndroid Build Coastguard Worker * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
20*2d1272b8SAndroid Build Coastguard Worker * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
21*2d1272b8SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
22*2d1272b8SAndroid Build Coastguard Worker * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
23*2d1272b8SAndroid Build Coastguard Worker * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
24*2d1272b8SAndroid Build Coastguard Worker *
25*2d1272b8SAndroid Build Coastguard Worker * Red Hat Author(s): Behdad Esfahbod
26*2d1272b8SAndroid Build Coastguard Worker * Google Author(s): Behdad Esfahbod
27*2d1272b8SAndroid Build Coastguard Worker */
28*2d1272b8SAndroid Build Coastguard Worker
29*2d1272b8SAndroid Build Coastguard Worker #include "hb.hh"
30*2d1272b8SAndroid Build Coastguard Worker
31*2d1272b8SAndroid Build Coastguard Worker #ifdef HAVE_GLIB
32*2d1272b8SAndroid Build Coastguard Worker
33*2d1272b8SAndroid Build Coastguard Worker #include "hb-glib.h"
34*2d1272b8SAndroid Build Coastguard Worker
35*2d1272b8SAndroid Build Coastguard Worker #include "hb-machinery.hh"
36*2d1272b8SAndroid Build Coastguard Worker
37*2d1272b8SAndroid Build Coastguard Worker
38*2d1272b8SAndroid Build Coastguard Worker /**
39*2d1272b8SAndroid Build Coastguard Worker * SECTION:hb-glib
40*2d1272b8SAndroid Build Coastguard Worker * @title: hb-glib
41*2d1272b8SAndroid Build Coastguard Worker * @short_description: GLib integration
42*2d1272b8SAndroid Build Coastguard Worker * @include: hb-glib.h
43*2d1272b8SAndroid Build Coastguard Worker *
44*2d1272b8SAndroid Build Coastguard Worker * Functions for using HarfBuzz with the GLib library.
45*2d1272b8SAndroid Build Coastguard Worker *
46*2d1272b8SAndroid Build Coastguard Worker * HarfBuzz supports using GLib to provide Unicode data, by attaching
47*2d1272b8SAndroid Build Coastguard Worker * GLib functions to the virtual methods in a #hb_unicode_funcs_t function
48*2d1272b8SAndroid Build Coastguard Worker * structure.
49*2d1272b8SAndroid Build Coastguard Worker **/
50*2d1272b8SAndroid Build Coastguard Worker
51*2d1272b8SAndroid Build Coastguard Worker
52*2d1272b8SAndroid Build Coastguard Worker /**
53*2d1272b8SAndroid Build Coastguard Worker * hb_glib_script_to_script:
54*2d1272b8SAndroid Build Coastguard Worker * @script: The GUnicodeScript identifier to query
55*2d1272b8SAndroid Build Coastguard Worker *
56*2d1272b8SAndroid Build Coastguard Worker * Fetches the #hb_script_t script that corresponds to the
57*2d1272b8SAndroid Build Coastguard Worker * specified GUnicodeScript identifier.
58*2d1272b8SAndroid Build Coastguard Worker *
59*2d1272b8SAndroid Build Coastguard Worker * Return value: the #hb_script_t script found
60*2d1272b8SAndroid Build Coastguard Worker *
61*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.38
62*2d1272b8SAndroid Build Coastguard Worker **/
63*2d1272b8SAndroid Build Coastguard Worker hb_script_t
hb_glib_script_to_script(GUnicodeScript script)64*2d1272b8SAndroid Build Coastguard Worker hb_glib_script_to_script (GUnicodeScript script)
65*2d1272b8SAndroid Build Coastguard Worker {
66*2d1272b8SAndroid Build Coastguard Worker return (hb_script_t) g_unicode_script_to_iso15924 (script);
67*2d1272b8SAndroid Build Coastguard Worker }
68*2d1272b8SAndroid Build Coastguard Worker
69*2d1272b8SAndroid Build Coastguard Worker /**
70*2d1272b8SAndroid Build Coastguard Worker * hb_glib_script_from_script:
71*2d1272b8SAndroid Build Coastguard Worker * @script: The #hb_script_t to query
72*2d1272b8SAndroid Build Coastguard Worker *
73*2d1272b8SAndroid Build Coastguard Worker * Fetches the GUnicodeScript identifier that corresponds to the
74*2d1272b8SAndroid Build Coastguard Worker * specified #hb_script_t script.
75*2d1272b8SAndroid Build Coastguard Worker *
76*2d1272b8SAndroid Build Coastguard Worker * Return value: the GUnicodeScript identifier found
77*2d1272b8SAndroid Build Coastguard Worker *
78*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.38
79*2d1272b8SAndroid Build Coastguard Worker **/
80*2d1272b8SAndroid Build Coastguard Worker GUnicodeScript
hb_glib_script_from_script(hb_script_t script)81*2d1272b8SAndroid Build Coastguard Worker hb_glib_script_from_script (hb_script_t script)
82*2d1272b8SAndroid Build Coastguard Worker {
83*2d1272b8SAndroid Build Coastguard Worker return g_unicode_script_from_iso15924 (script);
84*2d1272b8SAndroid Build Coastguard Worker }
85*2d1272b8SAndroid Build Coastguard Worker
86*2d1272b8SAndroid Build Coastguard Worker
87*2d1272b8SAndroid Build Coastguard Worker static hb_unicode_combining_class_t
hb_glib_unicode_combining_class(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t unicode,void * user_data HB_UNUSED)88*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_combining_class (hb_unicode_funcs_t *ufuncs HB_UNUSED,
89*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
90*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
91*2d1272b8SAndroid Build Coastguard Worker
92*2d1272b8SAndroid Build Coastguard Worker {
93*2d1272b8SAndroid Build Coastguard Worker return (hb_unicode_combining_class_t) g_unichar_combining_class (unicode);
94*2d1272b8SAndroid Build Coastguard Worker }
95*2d1272b8SAndroid Build Coastguard Worker
96*2d1272b8SAndroid Build Coastguard Worker static hb_unicode_general_category_t
hb_glib_unicode_general_category(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t unicode,void * user_data HB_UNUSED)97*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_general_category (hb_unicode_funcs_t *ufuncs HB_UNUSED,
98*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
99*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
100*2d1272b8SAndroid Build Coastguard Worker
101*2d1272b8SAndroid Build Coastguard Worker {
102*2d1272b8SAndroid Build Coastguard Worker /* hb_unicode_general_category_t and GUnicodeType are identical */
103*2d1272b8SAndroid Build Coastguard Worker return (hb_unicode_general_category_t) g_unichar_type (unicode);
104*2d1272b8SAndroid Build Coastguard Worker }
105*2d1272b8SAndroid Build Coastguard Worker
106*2d1272b8SAndroid Build Coastguard Worker static hb_codepoint_t
hb_glib_unicode_mirroring(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t unicode,void * user_data HB_UNUSED)107*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_mirroring (hb_unicode_funcs_t *ufuncs HB_UNUSED,
108*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
109*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
110*2d1272b8SAndroid Build Coastguard Worker {
111*2d1272b8SAndroid Build Coastguard Worker g_unichar_get_mirror_char (unicode, &unicode);
112*2d1272b8SAndroid Build Coastguard Worker return unicode;
113*2d1272b8SAndroid Build Coastguard Worker }
114*2d1272b8SAndroid Build Coastguard Worker
115*2d1272b8SAndroid Build Coastguard Worker static hb_script_t
hb_glib_unicode_script(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t unicode,void * user_data HB_UNUSED)116*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_script (hb_unicode_funcs_t *ufuncs HB_UNUSED,
117*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t unicode,
118*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
119*2d1272b8SAndroid Build Coastguard Worker {
120*2d1272b8SAndroid Build Coastguard Worker return hb_glib_script_to_script (g_unichar_get_script (unicode));
121*2d1272b8SAndroid Build Coastguard Worker }
122*2d1272b8SAndroid Build Coastguard Worker
123*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_glib_unicode_compose(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t a,hb_codepoint_t b,hb_codepoint_t * ab,void * user_data HB_UNUSED)124*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
125*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t a,
126*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t b,
127*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *ab,
128*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
129*2d1272b8SAndroid Build Coastguard Worker {
130*2d1272b8SAndroid Build Coastguard Worker #if GLIB_CHECK_VERSION(2,29,12)
131*2d1272b8SAndroid Build Coastguard Worker return g_unichar_compose (a, b, ab);
132*2d1272b8SAndroid Build Coastguard Worker #else
133*2d1272b8SAndroid Build Coastguard Worker return false;
134*2d1272b8SAndroid Build Coastguard Worker #endif
135*2d1272b8SAndroid Build Coastguard Worker }
136*2d1272b8SAndroid Build Coastguard Worker
137*2d1272b8SAndroid Build Coastguard Worker static hb_bool_t
hb_glib_unicode_decompose(hb_unicode_funcs_t * ufuncs HB_UNUSED,hb_codepoint_t ab,hb_codepoint_t * a,hb_codepoint_t * b,void * user_data HB_UNUSED)138*2d1272b8SAndroid Build Coastguard Worker hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
139*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t ab,
140*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *a,
141*2d1272b8SAndroid Build Coastguard Worker hb_codepoint_t *b,
142*2d1272b8SAndroid Build Coastguard Worker void *user_data HB_UNUSED)
143*2d1272b8SAndroid Build Coastguard Worker {
144*2d1272b8SAndroid Build Coastguard Worker #if GLIB_CHECK_VERSION(2,29,12)
145*2d1272b8SAndroid Build Coastguard Worker return g_unichar_decompose (ab, a, b);
146*2d1272b8SAndroid Build Coastguard Worker #else
147*2d1272b8SAndroid Build Coastguard Worker return false;
148*2d1272b8SAndroid Build Coastguard Worker #endif
149*2d1272b8SAndroid Build Coastguard Worker }
150*2d1272b8SAndroid Build Coastguard Worker
151*2d1272b8SAndroid Build Coastguard Worker
152*2d1272b8SAndroid Build Coastguard Worker static inline void free_static_glib_funcs ();
153*2d1272b8SAndroid Build Coastguard Worker
154*2d1272b8SAndroid Build Coastguard Worker static struct hb_glib_unicode_funcs_lazy_loader_t : hb_unicode_funcs_lazy_loader_t<hb_glib_unicode_funcs_lazy_loader_t>
155*2d1272b8SAndroid Build Coastguard Worker {
createhb_glib_unicode_funcs_lazy_loader_t156*2d1272b8SAndroid Build Coastguard Worker static hb_unicode_funcs_t *create ()
157*2d1272b8SAndroid Build Coastguard Worker {
158*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_t *funcs = hb_unicode_funcs_create (nullptr);
159*2d1272b8SAndroid Build Coastguard Worker
160*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_combining_class_func (funcs, hb_glib_unicode_combining_class, nullptr, nullptr);
161*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_general_category_func (funcs, hb_glib_unicode_general_category, nullptr, nullptr);
162*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_mirroring_func (funcs, hb_glib_unicode_mirroring, nullptr, nullptr);
163*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_script_func (funcs, hb_glib_unicode_script, nullptr, nullptr);
164*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_compose_func (funcs, hb_glib_unicode_compose, nullptr, nullptr);
165*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_set_decompose_func (funcs, hb_glib_unicode_decompose, nullptr, nullptr);
166*2d1272b8SAndroid Build Coastguard Worker
167*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_make_immutable (funcs);
168*2d1272b8SAndroid Build Coastguard Worker
169*2d1272b8SAndroid Build Coastguard Worker hb_atexit (free_static_glib_funcs);
170*2d1272b8SAndroid Build Coastguard Worker
171*2d1272b8SAndroid Build Coastguard Worker return funcs;
172*2d1272b8SAndroid Build Coastguard Worker }
173*2d1272b8SAndroid Build Coastguard Worker } static_glib_funcs;
174*2d1272b8SAndroid Build Coastguard Worker
175*2d1272b8SAndroid Build Coastguard Worker static inline
free_static_glib_funcs()176*2d1272b8SAndroid Build Coastguard Worker void free_static_glib_funcs ()
177*2d1272b8SAndroid Build Coastguard Worker {
178*2d1272b8SAndroid Build Coastguard Worker static_glib_funcs.free_instance ();
179*2d1272b8SAndroid Build Coastguard Worker }
180*2d1272b8SAndroid Build Coastguard Worker
181*2d1272b8SAndroid Build Coastguard Worker /**
182*2d1272b8SAndroid Build Coastguard Worker * hb_glib_get_unicode_funcs:
183*2d1272b8SAndroid Build Coastguard Worker *
184*2d1272b8SAndroid Build Coastguard Worker * Fetches a Unicode-functions structure that is populated
185*2d1272b8SAndroid Build Coastguard Worker * with the appropriate GLib function for each method.
186*2d1272b8SAndroid Build Coastguard Worker *
187*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer none): a pointer to the #hb_unicode_funcs_t Unicode-functions structure
188*2d1272b8SAndroid Build Coastguard Worker *
189*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.38
190*2d1272b8SAndroid Build Coastguard Worker **/
191*2d1272b8SAndroid Build Coastguard Worker hb_unicode_funcs_t *
hb_glib_get_unicode_funcs()192*2d1272b8SAndroid Build Coastguard Worker hb_glib_get_unicode_funcs ()
193*2d1272b8SAndroid Build Coastguard Worker {
194*2d1272b8SAndroid Build Coastguard Worker return static_glib_funcs.get_unconst ();
195*2d1272b8SAndroid Build Coastguard Worker }
196*2d1272b8SAndroid Build Coastguard Worker
197*2d1272b8SAndroid Build Coastguard Worker
198*2d1272b8SAndroid Build Coastguard Worker
199*2d1272b8SAndroid Build Coastguard Worker #if GLIB_CHECK_VERSION(2,31,10)
200*2d1272b8SAndroid Build Coastguard Worker
201*2d1272b8SAndroid Build Coastguard Worker static void
_hb_g_bytes_unref(void * data)202*2d1272b8SAndroid Build Coastguard Worker _hb_g_bytes_unref (void *data)
203*2d1272b8SAndroid Build Coastguard Worker {
204*2d1272b8SAndroid Build Coastguard Worker g_bytes_unref ((GBytes *) data);
205*2d1272b8SAndroid Build Coastguard Worker }
206*2d1272b8SAndroid Build Coastguard Worker
207*2d1272b8SAndroid Build Coastguard Worker /**
208*2d1272b8SAndroid Build Coastguard Worker * hb_glib_blob_create:
209*2d1272b8SAndroid Build Coastguard Worker * @gbytes: the GBytes structure to work upon
210*2d1272b8SAndroid Build Coastguard Worker *
211*2d1272b8SAndroid Build Coastguard Worker * Creates an #hb_blob_t blob from the specified
212*2d1272b8SAndroid Build Coastguard Worker * GBytes data structure.
213*2d1272b8SAndroid Build Coastguard Worker *
214*2d1272b8SAndroid Build Coastguard Worker * Return value: (transfer full): the new #hb_blob_t blob object
215*2d1272b8SAndroid Build Coastguard Worker *
216*2d1272b8SAndroid Build Coastguard Worker * Since: 0.9.38
217*2d1272b8SAndroid Build Coastguard Worker **/
218*2d1272b8SAndroid Build Coastguard Worker hb_blob_t *
hb_glib_blob_create(GBytes * gbytes)219*2d1272b8SAndroid Build Coastguard Worker hb_glib_blob_create (GBytes *gbytes)
220*2d1272b8SAndroid Build Coastguard Worker {
221*2d1272b8SAndroid Build Coastguard Worker gsize size = 0;
222*2d1272b8SAndroid Build Coastguard Worker gconstpointer data = g_bytes_get_data (gbytes, &size);
223*2d1272b8SAndroid Build Coastguard Worker return hb_blob_create ((const char *) data,
224*2d1272b8SAndroid Build Coastguard Worker size,
225*2d1272b8SAndroid Build Coastguard Worker HB_MEMORY_MODE_READONLY,
226*2d1272b8SAndroid Build Coastguard Worker g_bytes_ref (gbytes),
227*2d1272b8SAndroid Build Coastguard Worker _hb_g_bytes_unref);
228*2d1272b8SAndroid Build Coastguard Worker }
229*2d1272b8SAndroid Build Coastguard Worker #endif
230*2d1272b8SAndroid Build Coastguard Worker
231*2d1272b8SAndroid Build Coastguard Worker
232*2d1272b8SAndroid Build Coastguard Worker #endif
233