1 /* Pango
2 * pango-coverage.c: Coverage maps for fonts
3 *
4 * Copyright (C) 2000 Red Hat Software
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
20 */
21
22 #include "config.h"
23 #include <string.h>
24
25 #include "pango-coverage-private.h"
26
G_DEFINE_TYPE(PangoCoverage,pango_coverage,G_TYPE_OBJECT)27 G_DEFINE_TYPE (PangoCoverage, pango_coverage, G_TYPE_OBJECT)
28
29 static void
30 pango_coverage_init (PangoCoverage *coverage)
31 {
32 }
33
34 static void
pango_coverage_finalize(GObject * object)35 pango_coverage_finalize (GObject *object)
36 {
37 PangoCoverage *coverage = PANGO_COVERAGE (object);
38
39 if (coverage->chars)
40 hb_set_destroy (coverage->chars);
41
42 G_OBJECT_CLASS (pango_coverage_parent_class)->finalize (object);
43 }
44
45 static PangoCoverageLevel
pango_coverage_real_get(PangoCoverage * coverage,int index)46 pango_coverage_real_get (PangoCoverage *coverage,
47 int index)
48 {
49 if (coverage->chars == NULL)
50 return PANGO_COVERAGE_NONE;
51
52 if (hb_set_has (coverage->chars, (hb_codepoint_t)index))
53 return PANGO_COVERAGE_EXACT;
54 else
55 return PANGO_COVERAGE_NONE;
56 }
57
58 static void
pango_coverage_real_set(PangoCoverage * coverage,int index,PangoCoverageLevel level)59 pango_coverage_real_set (PangoCoverage *coverage,
60 int index,
61 PangoCoverageLevel level)
62 {
63 if (coverage->chars == NULL)
64 coverage->chars = hb_set_create ();
65
66 if (level != PANGO_COVERAGE_NONE)
67 hb_set_add (coverage->chars, (hb_codepoint_t)index);
68 else
69 hb_set_del (coverage->chars, (hb_codepoint_t)index);
70 }
71
72 static PangoCoverage *
pango_coverage_real_copy(PangoCoverage * coverage)73 pango_coverage_real_copy (PangoCoverage *coverage)
74 {
75 PangoCoverage *copy;
76
77 g_return_val_if_fail (coverage != NULL, NULL);
78
79 copy = g_object_new (PANGO_TYPE_COVERAGE, NULL);
80 if (coverage->chars)
81 {
82 int i;
83
84 copy->chars = hb_set_create ();
85 for (i = hb_set_get_min (coverage->chars); i <= hb_set_get_max (coverage->chars); i++)
86 {
87 if (hb_set_has (coverage->chars, (hb_codepoint_t)i))
88 hb_set_add (copy->chars, (hb_codepoint_t)i);
89 }
90 }
91
92 return copy;
93 }
94
95 static void
pango_coverage_class_init(PangoCoverageClass * class)96 pango_coverage_class_init (PangoCoverageClass *class)
97 {
98 GObjectClass *object_class = G_OBJECT_CLASS (class);
99
100 object_class->finalize = pango_coverage_finalize;
101
102 class->get = pango_coverage_real_get;
103 class->set = pango_coverage_real_set;
104 class->copy = pango_coverage_real_copy;
105 }
106
107 /**
108 * pango_coverage_new:
109 *
110 * Create a new `PangoCoverage`
111 *
112 * Return value: the newly allocated `PangoCoverage`, initialized
113 * to %PANGO_COVERAGE_NONE with a reference count of one, which
114 * should be freed with [method@Pango.Coverage.unref].
115 */
116 PangoCoverage *
pango_coverage_new(void)117 pango_coverage_new (void)
118 {
119 return g_object_new (PANGO_TYPE_COVERAGE, NULL);
120 }
121
122 /**
123 * pango_coverage_copy:
124 * @coverage: a `PangoCoverage`
125 *
126 * Copy an existing `PangoCoverage`.
127 *
128 * Return value: (transfer full): the newly allocated `PangoCoverage`,
129 * with a reference count of one, which should be freed with
130 * [method@Pango.Coverage.unref].
131 */
132 PangoCoverage *
pango_coverage_copy(PangoCoverage * coverage)133 pango_coverage_copy (PangoCoverage *coverage)
134 {
135 return PANGO_COVERAGE_GET_CLASS (coverage)->copy (coverage);
136 }
137
138 /**
139 * pango_coverage_ref:
140 * @coverage: (not nullable): a `PangoCoverage`
141 *
142 * Increase the reference count on the `PangoCoverage` by one.
143 *
144 * Return value: (transfer full): @coverage
145 */
146 PangoCoverage *
pango_coverage_ref(PangoCoverage * coverage)147 pango_coverage_ref (PangoCoverage *coverage)
148 {
149 return g_object_ref (coverage);
150 }
151
152 /**
153 * pango_coverage_unref:
154 * @coverage: (transfer full) (not nullable): a `PangoCoverage`
155 *
156 * Decrease the reference count on the `PangoCoverage` by one.
157 *
158 * If the result is zero, free the coverage and all associated memory.
159 */
160 void
pango_coverage_unref(PangoCoverage * coverage)161 pango_coverage_unref (PangoCoverage *coverage)
162 {
163 g_object_unref (coverage);
164 }
165
166 /**
167 * pango_coverage_get:
168 * @coverage: a `PangoCoverage`
169 * @index_: the index to check
170 *
171 * Determine whether a particular index is covered by @coverage.
172 *
173 * Return value: the coverage level of @coverage for character @index_.
174 */
175 PangoCoverageLevel
pango_coverage_get(PangoCoverage * coverage,int index)176 pango_coverage_get (PangoCoverage *coverage,
177 int index)
178 {
179 return PANGO_COVERAGE_GET_CLASS (coverage)->get (coverage, index);
180 }
181
182 /**
183 * pango_coverage_set:
184 * @coverage: a `PangoCoverage`
185 * @index_: the index to modify
186 * @level: the new level for @index_
187 *
188 * Modify a particular index within @coverage
189 */
190 void
pango_coverage_set(PangoCoverage * coverage,int index,PangoCoverageLevel level)191 pango_coverage_set (PangoCoverage *coverage,
192 int index,
193 PangoCoverageLevel level)
194 {
195 PANGO_COVERAGE_GET_CLASS (coverage)->set (coverage, index, level);
196 }
197
198 /**
199 * pango_coverage_max:
200 * @coverage: a `PangoCoverage`
201 * @other: another `PangoCoverage`
202 *
203 * Set the coverage for each index in @coverage to be the max (better)
204 * value of the current coverage for the index and the coverage for
205 * the corresponding index in @other.
206 *
207 * Deprecated: 1.44: This function does nothing
208 */
209 void
pango_coverage_max(PangoCoverage * coverage,PangoCoverage * other)210 pango_coverage_max (PangoCoverage *coverage,
211 PangoCoverage *other)
212 {
213 }
214
215 /**
216 * pango_coverage_to_bytes:
217 * @coverage: a `PangoCoverage`
218 * @bytes: (out) (array length=n_bytes) (element-type guint8):
219 * location to store result (must be freed with g_free())
220 * @n_bytes: (out): location to store size of result
221 *
222 * Convert a `PangoCoverage` structure into a flat binary format.
223 *
224 * Deprecated: 1.44: This returns %NULL
225 */
226 void
pango_coverage_to_bytes(PangoCoverage * coverage,guchar ** bytes,int * n_bytes)227 pango_coverage_to_bytes (PangoCoverage *coverage,
228 guchar **bytes,
229 int *n_bytes)
230 {
231 *bytes = NULL;
232 *n_bytes = 0;
233 }
234
235 /**
236 * pango_coverage_from_bytes:
237 * @bytes: (array length=n_bytes) (element-type guint8): binary data
238 * representing a `PangoCoverage`
239 * @n_bytes: the size of @bytes in bytes
240 *
241 * Convert data generated from pango_coverage_to_bytes()
242 * back to a `PangoCoverage`.
243 *
244 * Return value: (transfer full) (nullable): a newly allocated `PangoCoverage`
245 *
246 * Deprecated: 1.44: This returns %NULL
247 */
248 PangoCoverage *
pango_coverage_from_bytes(guchar * bytes,int n_bytes)249 pango_coverage_from_bytes (guchar *bytes,
250 int n_bytes)
251 {
252 return NULL;
253 }
254