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