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