blob: 3da5dc4ed19b4d6e0d9b69b7c4a5f468de82a5dc [file] [log] [blame]
Behdad Esfahbod5c441882009-08-10 20:05:16 -04001/*
2 * Copyright (C) 2009 Red Hat, Inc.
3 *
4 * This is part of HarfBuzz, an OpenType Layout engine 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 * Red Hat Author(s): Behdad Esfahbod
25 */
26
27#include "hb-private.h"
28
29#include "hb-unicode-private.h"
30
31/*
32 * hb_unicode_funcs_t
33 */
34
Behdad Esfahbod48910f82009-08-10 23:05:05 -040035static hb_codepoint_t hb_unicode_get_mirroring_char_nil (hb_codepoint_t unicode) { return unicode; }
36static hb_category_t hb_unicode_get_general_category_nil (hb_codepoint_t unicode) { return HB_CATEGORY_OTHER_LETTER; }
37static hb_script_t hb_unicode_get_script_nil (hb_codepoint_t unicode) { return HB_SCRIPT_UNKNOWN; }
38static unsigned int hb_unicode_get_combining_class_nil (hb_codepoint_t unicode) { return 0; }
39static unsigned int hb_unicode_get_eastasian_width_nil (hb_codepoint_t unicode) { return 1; }
40
Behdad Esfahbodaf9e1042009-08-10 23:21:33 -040041hb_unicode_funcs_t _hb_unicode_funcs_nil = {
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -040042 HB_REFERENCE_COUNT_INVALID, /* ref_count */
43
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -040044 TRUE, /* immutable */
45
Behdad Esfahbod48910f82009-08-10 23:05:05 -040046 hb_unicode_get_general_category_nil,
47 hb_unicode_get_combining_class_nil,
48 hb_unicode_get_mirroring_char_nil,
49 hb_unicode_get_script_nil,
50 hb_unicode_get_eastasian_width_nil
Behdad Esfahbod5c441882009-08-10 20:05:16 -040051};
52
53hb_unicode_funcs_t *
54hb_unicode_funcs_create (void)
55{
56 hb_unicode_funcs_t *ufuncs;
57
58 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
59 return &_hb_unicode_funcs_nil;
60
Behdad Esfahbod48910f82009-08-10 23:05:05 -040061 *ufuncs = _hb_unicode_funcs_nil;
62 HB_OBJECT_DO_INIT (ufuncs);
63
Behdad Esfahbod5c441882009-08-10 20:05:16 -040064 return ufuncs;
65}
66
67hb_unicode_funcs_t *
68hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs)
69{
70 HB_OBJECT_DO_REFERENCE (ufuncs);
71}
72
73unsigned int
74hb_unicode_funcs_get_reference_count (hb_unicode_funcs_t *ufuncs)
75{
76 HB_OBJECT_DO_GET_REFERENCE_COUNT (ufuncs);
77}
78
79void
80hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs)
81{
82 HB_OBJECT_DO_DESTROY (ufuncs);
83
84 free (ufuncs);
85}
86
87hb_unicode_funcs_t *
88hb_unicode_funcs_copy (hb_unicode_funcs_t *other_ufuncs)
89{
90 hb_unicode_funcs_t *ufuncs;
91
92 if (!HB_OBJECT_DO_CREATE (hb_unicode_funcs_t, ufuncs))
93 return &_hb_unicode_funcs_nil;
94
95 *ufuncs = *other_ufuncs;
96 HB_OBJECT_DO_INIT (ufuncs);
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -040097 ufuncs->immutable = FALSE;
Behdad Esfahbod5c441882009-08-10 20:05:16 -040098
99 return ufuncs;
100}
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400101
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400102void
103hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs)
104{
105 if (HB_OBJECT_IS_INERT (ufuncs))
106 return;
107
108 ufuncs->immutable = TRUE;
109}
110
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400111
112void
113hb_unicode_funcs_set_mirroring_char_func (hb_unicode_funcs_t *ufuncs,
114 hb_unicode_get_mirroring_char_func_t mirroring_char_func)
115{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400116 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400117 return;
118
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400119 ufuncs->get_mirroring_char = mirroring_char_func ? mirroring_char_func : hb_unicode_get_mirroring_char_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400120}
121
122void
123hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
124 hb_unicode_get_general_category_func_t general_category_func)
125{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400126 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400127 return;
128
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400129 ufuncs->get_general_category = general_category_func ? general_category_func : hb_unicode_get_general_category_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400130}
131
132void
133hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
134 hb_unicode_get_script_func_t script_func)
135{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400136 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400137 return;
138
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400139 ufuncs->get_script = script_func ? script_func : hb_unicode_get_script_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400140}
141
142void
143hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
144 hb_unicode_get_combining_class_func_t combining_class_func)
145{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400146 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400147 return;
148
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400149 ufuncs->get_combining_class = combining_class_func ? combining_class_func : hb_unicode_get_combining_class_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400150}
151
152void
153hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs,
154 hb_unicode_get_eastasian_width_func_t eastasian_width_func)
155{
Behdad Esfahbodeb27ec02009-08-10 23:25:28 -0400156 if (ufuncs->immutable)
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400157 return;
158
Behdad Esfahbod48910f82009-08-10 23:05:05 -0400159 ufuncs->get_eastasian_width = eastasian_width_func ? eastasian_width_func : hb_unicode_get_eastasian_width_nil;
Behdad Esfahbod04cc0a22009-08-10 22:58:56 -0400160}
161