]>
Commit | Line | Data |
---|---|---|
b75a7d8f | 1 | /* |
b75a7d8f | 2 | * |
73c04bcf | 3 | * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved |
b75a7d8f A |
4 | * |
5 | */ | |
6 | ||
7 | #ifndef __GLYPHPOSITIONADJUSTMENTS_H | |
8 | #define __GLYPHPOSITIONADJUSTMENTS_H | |
9 | ||
10 | /** | |
11 | * \file | |
12 | * \internal | |
13 | */ | |
14 | ||
15 | #include "LETypes.h" | |
16 | #include "OpenTypeTables.h" | |
17 | ||
18 | U_NAMESPACE_BEGIN | |
19 | ||
73c04bcf A |
20 | class LEGlyphStorage; |
21 | class LEFontInstance; | |
b75a7d8f | 22 | |
73c04bcf A |
23 | class GlyphPositionAdjustments : public UMemory |
24 | { | |
25 | private: | |
26 | class Adjustment : public UMemory { | |
27 | public: | |
b75a7d8f | 28 | |
73c04bcf A |
29 | inline Adjustment(); |
30 | inline Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff = -1); | |
31 | inline ~Adjustment(); | |
b75a7d8f | 32 | |
73c04bcf A |
33 | inline float getXPlacement() const; |
34 | inline float getYPlacement() const; | |
35 | inline float getXAdvance() const; | |
36 | inline float getYAdvance() const; | |
b75a7d8f | 37 | |
73c04bcf | 38 | inline le_int32 getBaseOffset() const; |
b75a7d8f | 39 | |
73c04bcf A |
40 | inline void setXPlacement(float newXPlacement); |
41 | inline void setYPlacement(float newYPlacement); | |
42 | inline void setXAdvance(float newXAdvance); | |
43 | inline void setYAdvance(float newYAdvance); | |
b75a7d8f | 44 | |
73c04bcf | 45 | inline void setBaseOffset(le_int32 newBaseOffset); |
b75a7d8f | 46 | |
73c04bcf A |
47 | inline void adjustXPlacement(float xAdjustment); |
48 | inline void adjustYPlacement(float yAdjustment); | |
49 | inline void adjustXAdvance(float xAdjustment); | |
50 | inline void adjustYAdvance(float yAdjustment); | |
51 | ||
52 | private: | |
53 | float xPlacement; | |
54 | float yPlacement; | |
55 | float xAdvance; | |
56 | float yAdvance; | |
57 | ||
58 | le_int32 baseOffset; | |
59 | ||
60 | // allow copying of this class because all of its fields are simple types | |
61 | }; | |
62 | ||
63 | class EntryExitPoint : public UMemory | |
64 | { | |
65 | public: | |
66 | inline EntryExitPoint(); | |
67 | inline ~EntryExitPoint(); | |
68 | ||
69 | inline le_bool isCursiveGlyph() const; | |
70 | inline le_bool baselineIsLogicalEnd() const; | |
71 | ||
72 | LEPoint *getEntryPoint(LEPoint &entryPoint) const; | |
73 | LEPoint *getExitPoint(LEPoint &exitPoint) const; | |
74 | ||
75 | inline void setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); | |
76 | inline void setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); | |
77 | inline void setCursiveGlyph(le_bool baselineIsLogicalEnd); | |
78 | ||
79 | private: | |
80 | enum EntryExitFlags | |
81 | { | |
82 | EEF_HAS_ENTRY_POINT = 0x80000000L, | |
83 | EEF_HAS_EXIT_POINT = 0x40000000L, | |
84 | EEF_IS_CURSIVE_GLYPH = 0x20000000L, | |
85 | EEF_BASELINE_IS_LOGICAL_END = 0x10000000L | |
86 | }; | |
87 | ||
88 | le_uint32 fFlags; | |
89 | LEPoint fEntryPoint; | |
90 | LEPoint fExitPoint; | |
91 | }; | |
b75a7d8f | 92 | |
73c04bcf A |
93 | le_int32 fGlyphCount; |
94 | EntryExitPoint *fEntryExitPoints; | |
95 | Adjustment *fAdjustments; | |
b75a7d8f | 96 | |
73c04bcf A |
97 | GlyphPositionAdjustments(); |
98 | ||
99 | public: | |
100 | GlyphPositionAdjustments(le_int32 glyphCount); | |
101 | ~GlyphPositionAdjustments(); | |
102 | ||
103 | inline le_bool hasCursiveGlyphs() const; | |
104 | inline le_bool isCursiveGlyph(le_int32 index) const; | |
105 | inline le_bool baselineIsLogicalEnd(le_int32 index) const; | |
106 | ||
107 | const LEPoint *getEntryPoint(le_int32 index, LEPoint &entryPoint) const; | |
108 | const LEPoint *getExitPoint(le_int32 index, LEPoint &exitPoint) const; | |
109 | ||
110 | inline float getXPlacement(le_int32 index) const; | |
111 | inline float getYPlacement(le_int32 index) const; | |
112 | inline float getXAdvance(le_int32 index) const; | |
113 | inline float getYAdvance(le_int32 index) const; | |
114 | ||
115 | inline le_int32 getBaseOffset(le_int32 index) const; | |
116 | ||
117 | inline void setXPlacement(le_int32 index, float newXPlacement); | |
118 | inline void setYPlacement(le_int32 index, float newYPlacement); | |
119 | inline void setXAdvance(le_int32 index, float newXAdvance); | |
120 | inline void setYAdvance(le_int32 index, float newYAdvance); | |
121 | ||
122 | inline void setBaseOffset(le_int32 index, le_int32 newBaseOffset); | |
123 | ||
124 | inline void adjustXPlacement(le_int32 index, float xAdjustment); | |
125 | inline void adjustYPlacement(le_int32 index, float yAdjustment); | |
126 | inline void adjustXAdvance(le_int32 index, float xAdjustment); | |
127 | inline void adjustYAdvance(le_int32 index, float yAdjustment); | |
128 | ||
129 | void setEntryPoint(le_int32 index, LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd); | |
130 | void setExitPoint(le_int32 index, LEPoint &newExitPoint, le_bool baselineIsLogicalEnd); | |
131 | void setCursiveGlyph(le_int32 index, le_bool baselineIsLogicalEnd); | |
132 | ||
133 | void applyCursiveAdjustments(LEGlyphStorage &glyphStorage, le_bool rightToLeft, const LEFontInstance *fontInstance); | |
b75a7d8f A |
134 | }; |
135 | ||
73c04bcf | 136 | inline GlyphPositionAdjustments::Adjustment::Adjustment() |
b75a7d8f A |
137 | : xPlacement(0), yPlacement(0), xAdvance(0), yAdvance(0), baseOffset(-1) |
138 | { | |
139 | // nothing else to do! | |
140 | } | |
141 | ||
73c04bcf | 142 | inline GlyphPositionAdjustments::Adjustment::Adjustment(float xPlace, float yPlace, float xAdv, float yAdv, le_int32 baseOff) |
b75a7d8f A |
143 | : xPlacement(xPlace), yPlacement(yPlace), xAdvance(xAdv), yAdvance(yAdv), baseOffset(baseOff) |
144 | { | |
145 | // nothing else to do! | |
146 | } | |
147 | ||
73c04bcf | 148 | inline GlyphPositionAdjustments::Adjustment::~Adjustment() |
b75a7d8f A |
149 | { |
150 | // nothing to do! | |
151 | } | |
152 | ||
73c04bcf | 153 | inline float GlyphPositionAdjustments::Adjustment::getXPlacement() const |
b75a7d8f A |
154 | { |
155 | return xPlacement; | |
156 | } | |
157 | ||
73c04bcf | 158 | inline float GlyphPositionAdjustments::Adjustment::getYPlacement() const |
b75a7d8f A |
159 | { |
160 | return yPlacement; | |
161 | } | |
162 | ||
73c04bcf | 163 | inline float GlyphPositionAdjustments::Adjustment::getXAdvance() const |
b75a7d8f A |
164 | { |
165 | return xAdvance; | |
166 | } | |
167 | ||
73c04bcf | 168 | inline float GlyphPositionAdjustments::Adjustment::getYAdvance() const |
b75a7d8f A |
169 | { |
170 | return yAdvance; | |
171 | } | |
172 | ||
73c04bcf | 173 | inline le_int32 GlyphPositionAdjustments::Adjustment::getBaseOffset() const |
b75a7d8f A |
174 | { |
175 | return baseOffset; | |
176 | } | |
177 | ||
73c04bcf | 178 | inline void GlyphPositionAdjustments::Adjustment::setXPlacement(float newXPlacement) |
b75a7d8f A |
179 | { |
180 | xPlacement = newXPlacement; | |
181 | } | |
182 | ||
73c04bcf | 183 | inline void GlyphPositionAdjustments::Adjustment::setYPlacement(float newYPlacement) |
b75a7d8f A |
184 | { |
185 | yPlacement = newYPlacement; | |
186 | } | |
187 | ||
73c04bcf | 188 | inline void GlyphPositionAdjustments::Adjustment::setXAdvance(float newXAdvance) |
b75a7d8f A |
189 | { |
190 | xAdvance = newXAdvance; | |
191 | } | |
192 | ||
73c04bcf | 193 | inline void GlyphPositionAdjustments::Adjustment::setYAdvance(float newYAdvance) |
b75a7d8f A |
194 | { |
195 | yAdvance = newYAdvance; | |
196 | } | |
197 | ||
73c04bcf | 198 | inline void GlyphPositionAdjustments::Adjustment::setBaseOffset(le_int32 newBaseOffset) |
b75a7d8f A |
199 | { |
200 | baseOffset = newBaseOffset; | |
201 | } | |
202 | ||
73c04bcf | 203 | inline void GlyphPositionAdjustments::Adjustment::adjustXPlacement(float xAdjustment) |
b75a7d8f A |
204 | { |
205 | xPlacement += xAdjustment; | |
206 | } | |
207 | ||
73c04bcf | 208 | inline void GlyphPositionAdjustments::Adjustment::adjustYPlacement(float yAdjustment) |
b75a7d8f A |
209 | { |
210 | yPlacement += yAdjustment; | |
211 | } | |
212 | ||
73c04bcf | 213 | inline void GlyphPositionAdjustments::Adjustment::adjustXAdvance(float xAdjustment) |
b75a7d8f A |
214 | { |
215 | xAdvance += xAdjustment; | |
216 | } | |
217 | ||
73c04bcf | 218 | inline void GlyphPositionAdjustments::Adjustment::adjustYAdvance(float yAdjustment) |
b75a7d8f A |
219 | { |
220 | yAdvance += yAdjustment; | |
221 | } | |
222 | ||
73c04bcf A |
223 | inline GlyphPositionAdjustments::EntryExitPoint::EntryExitPoint() |
224 | : fFlags(0) | |
225 | { | |
226 | fEntryPoint.fX = fEntryPoint.fY = fExitPoint.fX = fExitPoint.fY = 0; | |
227 | } | |
228 | ||
229 | inline GlyphPositionAdjustments::EntryExitPoint::~EntryExitPoint() | |
230 | { | |
231 | // nothing special to do | |
232 | } | |
233 | ||
234 | inline le_bool GlyphPositionAdjustments::EntryExitPoint::isCursiveGlyph() const | |
235 | { | |
236 | return (fFlags & EEF_IS_CURSIVE_GLYPH) != 0; | |
237 | } | |
238 | ||
239 | inline le_bool GlyphPositionAdjustments::EntryExitPoint::baselineIsLogicalEnd() const | |
240 | { | |
241 | return (fFlags & EEF_BASELINE_IS_LOGICAL_END) != 0; | |
242 | } | |
243 | ||
244 | inline void GlyphPositionAdjustments::EntryExitPoint::setEntryPoint(LEPoint &newEntryPoint, le_bool baselineIsLogicalEnd) | |
245 | { | |
246 | if (baselineIsLogicalEnd) { | |
247 | fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); | |
248 | } else { | |
249 | fFlags |= (EEF_HAS_ENTRY_POINT | EEF_IS_CURSIVE_GLYPH); | |
250 | } | |
251 | ||
252 | fEntryPoint = newEntryPoint; | |
253 | } | |
254 | ||
255 | inline void GlyphPositionAdjustments::EntryExitPoint::setExitPoint(LEPoint &newExitPoint, le_bool baselineIsLogicalEnd) | |
256 | { | |
257 | if (baselineIsLogicalEnd) { | |
258 | fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); | |
259 | } else { | |
260 | fFlags |= (EEF_HAS_EXIT_POINT | EEF_IS_CURSIVE_GLYPH); | |
261 | } | |
262 | ||
263 | fExitPoint = newExitPoint; | |
264 | } | |
265 | ||
266 | inline void GlyphPositionAdjustments::EntryExitPoint::setCursiveGlyph(le_bool baselineIsLogicalEnd) | |
267 | { | |
268 | if (baselineIsLogicalEnd) { | |
269 | fFlags |= (EEF_IS_CURSIVE_GLYPH | EEF_BASELINE_IS_LOGICAL_END); | |
270 | } else { | |
271 | fFlags |= EEF_IS_CURSIVE_GLYPH; | |
272 | } | |
273 | } | |
274 | ||
275 | inline le_bool GlyphPositionAdjustments::isCursiveGlyph(le_int32 index) const | |
276 | { | |
277 | return fEntryExitPoints != NULL && fEntryExitPoints[index].isCursiveGlyph(); | |
278 | } | |
279 | ||
280 | inline le_bool GlyphPositionAdjustments::baselineIsLogicalEnd(le_int32 index) const | |
281 | { | |
282 | return fEntryExitPoints != NULL && fEntryExitPoints[index].baselineIsLogicalEnd(); | |
283 | } | |
284 | ||
285 | inline float GlyphPositionAdjustments::getXPlacement(le_int32 index) const | |
286 | { | |
287 | return fAdjustments[index].getXPlacement(); | |
288 | } | |
289 | ||
290 | inline float GlyphPositionAdjustments::getYPlacement(le_int32 index) const | |
291 | { | |
292 | return fAdjustments[index].getYPlacement(); | |
293 | } | |
294 | ||
295 | inline float GlyphPositionAdjustments::getXAdvance(le_int32 index) const | |
296 | { | |
297 | return fAdjustments[index].getXAdvance(); | |
298 | } | |
299 | ||
300 | inline float GlyphPositionAdjustments::getYAdvance(le_int32 index) const | |
301 | { | |
302 | return fAdjustments[index].getYAdvance(); | |
303 | } | |
304 | ||
305 | ||
306 | inline le_int32 GlyphPositionAdjustments::getBaseOffset(le_int32 index) const | |
307 | { | |
308 | return fAdjustments[index].getBaseOffset(); | |
309 | } | |
310 | ||
311 | inline void GlyphPositionAdjustments::setXPlacement(le_int32 index, float newXPlacement) | |
312 | { | |
313 | fAdjustments[index].setXPlacement(newXPlacement); | |
314 | } | |
315 | ||
316 | inline void GlyphPositionAdjustments::setYPlacement(le_int32 index, float newYPlacement) | |
317 | { | |
318 | fAdjustments[index].setYPlacement(newYPlacement); | |
319 | } | |
320 | ||
321 | inline void GlyphPositionAdjustments::setXAdvance(le_int32 index, float newXAdvance) | |
322 | { | |
323 | fAdjustments[index].setXAdvance(newXAdvance); | |
324 | } | |
325 | ||
326 | inline void GlyphPositionAdjustments::setYAdvance(le_int32 index, float newYAdvance) | |
327 | { | |
328 | fAdjustments[index].setYAdvance(newYAdvance); | |
329 | } | |
330 | ||
331 | inline void GlyphPositionAdjustments::setBaseOffset(le_int32 index, le_int32 newBaseOffset) | |
332 | { | |
333 | fAdjustments[index].setBaseOffset(newBaseOffset); | |
334 | } | |
335 | ||
336 | inline void GlyphPositionAdjustments::adjustXPlacement(le_int32 index, float xAdjustment) | |
337 | { | |
338 | fAdjustments[index].adjustXPlacement(xAdjustment); | |
339 | } | |
340 | ||
341 | inline void GlyphPositionAdjustments::adjustYPlacement(le_int32 index, float yAdjustment) | |
342 | { | |
343 | fAdjustments[index].adjustYPlacement(yAdjustment); | |
344 | } | |
345 | ||
346 | inline void GlyphPositionAdjustments::adjustXAdvance(le_int32 index, float xAdjustment) | |
347 | { | |
348 | fAdjustments[index].adjustXAdvance(xAdjustment); | |
349 | } | |
350 | ||
351 | inline void GlyphPositionAdjustments::adjustYAdvance(le_int32 index, float yAdjustment) | |
352 | { | |
353 | fAdjustments[index].adjustYAdvance(yAdjustment); | |
354 | } | |
355 | ||
356 | inline le_bool GlyphPositionAdjustments::hasCursiveGlyphs() const | |
357 | { | |
358 | return fEntryExitPoints != NULL; | |
359 | } | |
360 | ||
b75a7d8f A |
361 | U_NAMESPACE_END |
362 | #endif |