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