]>
Commit | Line | Data |
---|---|---|
1 | // © 2016 and later: Unicode, Inc. and others. | |
2 | // License & terms of use: http://www.unicode.org/copyright.html | |
3 | /* | |
4 | ********************************************************************** | |
5 | * Copyright (C) 2003, International Business Machines | |
6 | * Corporation and others. All Rights Reserved. | |
7 | ********************************************************************** | |
8 | */ | |
9 | ||
10 | #include "layout/LETypes.h" | |
11 | #include "layout/LEFontInstance.h" | |
12 | ||
13 | #include "unicode/locid.h" | |
14 | ||
15 | #include "layout/RunArrays.h" | |
16 | ||
17 | U_NAMESPACE_BEGIN | |
18 | ||
19 | const char RunArray::fgClassID = 0; | |
20 | ||
21 | RunArray::RunArray(le_int32 initialCapacity) | |
22 | : fClientArrays(FALSE), fLimits(NULL), fCount(0), fCapacity(initialCapacity) | |
23 | { | |
24 | if (initialCapacity > 0) { | |
25 | fLimits = LE_NEW_ARRAY(le_int32, fCapacity); | |
26 | } | |
27 | } | |
28 | ||
29 | RunArray::~RunArray() | |
30 | { | |
31 | if (! fClientArrays) { | |
32 | LE_DELETE_ARRAY(fLimits); | |
33 | fLimits = NULL; | |
34 | } | |
35 | } | |
36 | ||
37 | le_int32 RunArray::ensureCapacity() | |
38 | { | |
39 | if (fCount >= fCapacity) { | |
40 | if (fCapacity == 0) { | |
41 | fCapacity = INITIAL_CAPACITY; | |
42 | init(fCapacity); | |
43 | } else { | |
44 | fCapacity += (fCapacity < CAPACITY_GROW_LIMIT ? fCapacity : CAPACITY_GROW_LIMIT); | |
45 | grow(fCapacity); | |
46 | } | |
47 | } | |
48 | ||
49 | return fCount++; | |
50 | } | |
51 | ||
52 | void RunArray::init(le_int32 capacity) | |
53 | { | |
54 | fLimits = LE_NEW_ARRAY(le_int32, capacity); | |
55 | } | |
56 | ||
57 | void RunArray::grow(le_int32 newCapacity) | |
58 | { | |
59 | fLimits = (le_int32 *) LE_GROW_ARRAY(fLimits, newCapacity); | |
60 | } | |
61 | ||
62 | le_int32 RunArray::add(le_int32 limit) | |
63 | { | |
64 | if (fClientArrays) { | |
65 | return -1; | |
66 | } | |
67 | ||
68 | le_int32 index = ensureCapacity(); | |
69 | le_int32 *limits = (le_int32 *) fLimits; | |
70 | ||
71 | limits[index] = limit; | |
72 | ||
73 | return index; | |
74 | } | |
75 | ||
76 | const char FontRuns::fgClassID = 0; | |
77 | ||
78 | FontRuns::FontRuns(le_int32 initialCapacity) | |
79 | : RunArray(initialCapacity), fFonts(NULL) | |
80 | { | |
81 | if (initialCapacity > 0) { | |
82 | fFonts = LE_NEW_ARRAY(const LEFontInstance *, initialCapacity); | |
83 | } | |
84 | } | |
85 | ||
86 | FontRuns::~FontRuns() | |
87 | { | |
88 | if (! fClientArrays) { | |
89 | LE_DELETE_ARRAY(fFonts); | |
90 | fFonts = NULL; | |
91 | } | |
92 | } | |
93 | ||
94 | void FontRuns::init(le_int32 capacity) | |
95 | { | |
96 | RunArray::init(capacity); | |
97 | fFonts = LE_NEW_ARRAY(const LEFontInstance *, capacity); | |
98 | } | |
99 | ||
100 | void FontRuns::grow(le_int32 capacity) | |
101 | { | |
102 | RunArray::grow(capacity); | |
103 | fFonts = (const LEFontInstance **) LE_GROW_ARRAY(fFonts, capacity); | |
104 | } | |
105 | ||
106 | le_int32 FontRuns::add(const LEFontInstance *font, le_int32 limit) | |
107 | { | |
108 | le_int32 index = RunArray::add(limit); | |
109 | ||
110 | if (index >= 0) { | |
111 | LEFontInstance **fonts = (LEFontInstance **) fFonts; | |
112 | ||
113 | fonts[index] = (LEFontInstance *) font; | |
114 | } | |
115 | ||
116 | return index; | |
117 | } | |
118 | ||
119 | const LEFontInstance *FontRuns::getFont(le_int32 run) const | |
120 | { | |
121 | if (run < 0 || run >= getCount()) { | |
122 | return NULL; | |
123 | } | |
124 | ||
125 | return fFonts[run]; | |
126 | } | |
127 | ||
128 | const char LocaleRuns::fgClassID = 0; | |
129 | ||
130 | LocaleRuns::LocaleRuns(le_int32 initialCapacity) | |
131 | : RunArray(initialCapacity), fLocales(NULL) | |
132 | { | |
133 | if (initialCapacity > 0) { | |
134 | fLocales = LE_NEW_ARRAY(const Locale *, initialCapacity); | |
135 | } | |
136 | } | |
137 | ||
138 | LocaleRuns::~LocaleRuns() | |
139 | { | |
140 | if (! fClientArrays) { | |
141 | LE_DELETE_ARRAY(fLocales); | |
142 | fLocales = NULL; | |
143 | } | |
144 | } | |
145 | ||
146 | void LocaleRuns::init(le_int32 capacity) | |
147 | { | |
148 | RunArray::init(capacity); | |
149 | fLocales = LE_NEW_ARRAY(const Locale *, capacity); | |
150 | } | |
151 | ||
152 | void LocaleRuns::grow(le_int32 capacity) | |
153 | { | |
154 | RunArray::grow(capacity); | |
155 | fLocales = (const Locale **) LE_GROW_ARRAY(fLocales, capacity); | |
156 | } | |
157 | ||
158 | le_int32 LocaleRuns::add(const Locale *locale, le_int32 limit) | |
159 | { | |
160 | le_int32 index = RunArray::add(limit); | |
161 | ||
162 | if (index >= 0) { | |
163 | Locale **locales = (Locale **) fLocales; | |
164 | ||
165 | locales[index] = (Locale *) locale; | |
166 | } | |
167 | ||
168 | return index; | |
169 | } | |
170 | ||
171 | const Locale *LocaleRuns::getLocale(le_int32 run) const | |
172 | { | |
173 | if (run < 0 || run >= getCount()) { | |
174 | return NULL; | |
175 | } | |
176 | ||
177 | return fLocales[run]; | |
178 | } | |
179 | ||
180 | const char ValueRuns::fgClassID = 0; | |
181 | ||
182 | ValueRuns::ValueRuns(le_int32 initialCapacity) | |
183 | : RunArray(initialCapacity), fValues(NULL) | |
184 | { | |
185 | if (initialCapacity > 0) { | |
186 | fValues = LE_NEW_ARRAY(le_int32, initialCapacity); | |
187 | } | |
188 | } | |
189 | ||
190 | ValueRuns::~ValueRuns() | |
191 | { | |
192 | if (! fClientArrays) { | |
193 | LE_DELETE_ARRAY(fValues); | |
194 | fValues = NULL; | |
195 | } | |
196 | } | |
197 | ||
198 | void ValueRuns::init(le_int32 capacity) | |
199 | { | |
200 | RunArray::init(capacity); | |
201 | fValues = LE_NEW_ARRAY(le_int32, capacity); | |
202 | } | |
203 | ||
204 | void ValueRuns::grow(le_int32 capacity) | |
205 | { | |
206 | RunArray::grow(capacity); | |
207 | fValues = (const le_int32 *) LE_GROW_ARRAY(fValues, capacity); | |
208 | } | |
209 | ||
210 | le_int32 ValueRuns::add(le_int32 value, le_int32 limit) | |
211 | { | |
212 | le_int32 index = RunArray::add(limit); | |
213 | ||
214 | if (index >= 0) { | |
215 | le_int32 *values = (le_int32 *) fValues; | |
216 | ||
217 | values[index] = value; | |
218 | } | |
219 | ||
220 | return index; | |
221 | } | |
222 | ||
223 | le_int32 ValueRuns::getValue(le_int32 run) const | |
224 | { | |
225 | if (run < 0 || run >= getCount()) { | |
226 | return -1; | |
227 | } | |
228 | ||
229 | return fValues[run]; | |
230 | } | |
231 | ||
232 | U_NAMESPACE_END |