]>
Commit | Line | Data |
---|---|---|
f3c0d7a5 A |
1 | // © 2016 and later: Unicode, Inc. and others. |
2 | // License & terms of use: http://www.unicode.org/copyright.html | |
b75a7d8f A |
3 | /* |
4 | ********************************************************************** | |
b331163b | 5 | * Copyright (C) 2002-2014, International Business Machines |
b75a7d8f A |
6 | * Corporation and others. All Rights Reserved. |
7 | ********************************************************************** | |
8 | */ | |
9 | ||
10 | #ifndef __PARAGRAPHLAYOUT_H | |
11 | ||
12 | #define __PARAGRAPHLAYOUT_H | |
13 | ||
73c04bcf A |
14 | /** |
15 | * \file | |
16 | * \brief C++ API: Paragraph Layout | |
17 | */ | |
18 | ||
b75a7d8f A |
19 | /* |
20 | * ParagraphLayout doesn't make much sense without | |
21 | * BreakIterator... | |
22 | */ | |
23 | #include "unicode/uscript.h" | |
24 | #if ! UCONFIG_NO_BREAK_ITERATION | |
25 | ||
26 | #include "layout/LETypes.h" | |
27 | #include "layout/LEFontInstance.h" | |
28 | #include "layout/LayoutEngine.h" | |
29 | #include "unicode/ubidi.h" | |
30 | #include "unicode/brkiter.h" | |
31 | ||
32 | #include "layout/RunArrays.h" | |
33 | ||
34 | U_NAMESPACE_BEGIN | |
35 | ||
36 | /** | |
37 | * ParagraphLayout. | |
38 | * | |
39 | * The <code>ParagraphLayout</code> object will analyze the text into runs of text in the | |
40 | * same font, script and direction, and will create a <code>LayoutEngine</code> object for each run. | |
41 | * The <code>LayoutEngine</code> will transform the characters into glyph codes in visual order. | |
42 | * | |
43 | * Clients can use this to break a paragraph into lines, and to display the glyphs in each line. | |
44 | * | |
b331163b A |
45 | * Note that {@link icu::LayoutEngine} is deprecated, but this class is not. |
46 | * You may use this class with the HarfBuzz icu-le-hb wrapper, | |
47 | * see http://www.freedesktop.org/wiki/Software/HarfBuzz/ | |
48 | * | |
49 | * See http://userguide.icu-project.org/layoutengine for special build instructions. | |
50 | * | |
51 | * @see icu::LayoutEngine | |
b75a7d8f A |
52 | */ |
53 | class U_LAYOUTEX_API ParagraphLayout : public UObject | |
54 | { | |
55 | public: | |
56 | class VisualRun; | |
57 | ||
58 | /** | |
59 | * This class represents a single line of text in a <code>ParagraphLayout</code>. They | |
60 | * can only be created by calling <code>ParagraphLayout::nextLine()</code>. Each line | |
61 | * consists of multiple visual runs, represented by <code>ParagraphLayout::VisualRun</code> | |
62 | * objects. | |
63 | * | |
64 | * @see ParagraphLayout | |
65 | * @see ParagraphLayout::VisualRun | |
66 | * | |
73c04bcf | 67 | * @stable ICU 3.2 |
b75a7d8f A |
68 | */ |
69 | class U_LAYOUTEX_API Line : public UObject | |
70 | { | |
71 | public: | |
72 | /** | |
73 | * The constructor is private since these objects can only be | |
74 | * created by <code>ParagraphLayout</code>. However, it is the | |
75 | * clients responsibility to destroy the objects, so the destructor | |
76 | * is public. | |
77 | * | |
73c04bcf | 78 | * @stable ICU 3.2 |
b75a7d8f A |
79 | */ |
80 | ~Line(); | |
81 | ||
82 | /** | |
83 | * Count the number of visual runs in the line. | |
84 | * | |
85 | * @return the number of visual runs. | |
86 | * | |
73c04bcf | 87 | * @stable ICU 3.2 |
b75a7d8f | 88 | */ |
73c04bcf | 89 | inline le_int32 countRuns() const; |
b75a7d8f A |
90 | |
91 | /** | |
92 | * Get the ascent of the line. This is the maximum ascent | |
93 | * of all the fonts on the line. | |
94 | * | |
95 | * @return the ascent of the line. | |
96 | * | |
73c04bcf | 97 | * @stable ICU 3.2 |
b75a7d8f A |
98 | */ |
99 | le_int32 getAscent() const; | |
100 | ||
101 | /** | |
102 | * Get the descent of the line. This is the maximum descent | |
103 | * of all the fonts on the line. | |
104 | * | |
105 | * @return the descent of the line. | |
106 | * | |
73c04bcf | 107 | * @stable ICU 3.2 |
b75a7d8f A |
108 | */ |
109 | le_int32 getDescent() const; | |
110 | ||
111 | /** | |
112 | * Get the leading of the line. This is the maximum leading | |
113 | * of all the fonts on the line. | |
114 | * | |
115 | * @return the leading of the line. | |
116 | * | |
73c04bcf | 117 | * @stable ICU 3.2 |
b75a7d8f A |
118 | */ |
119 | le_int32 getLeading() const; | |
374ca955 A |
120 | |
121 | /** | |
122 | * Get the width of the line. This is a convenience method | |
123 | * which returns the last X position of the last visual run | |
124 | * in the line. | |
125 | * | |
126 | * @return the width of the line. | |
127 | * | |
73c04bcf | 128 | * @stable ICU 2.8 |
374ca955 A |
129 | */ |
130 | le_int32 getWidth() const; | |
b75a7d8f A |
131 | |
132 | /** | |
133 | * Get a <code>ParagraphLayout::VisualRun</code> object for a given | |
134 | * visual run in the line. | |
135 | * | |
136 | * @param runIndex is the index of the run, in visual order. | |
137 | * | |
138 | * @return the <code>ParagraphLayout::VisualRun</code> object representing the | |
139 | * visual run. This object is owned by the <code>Line</code> object which | |
140 | * created it, and will remain valid for as long as the <code>Line</code> | |
141 | * object is valid. | |
142 | * | |
143 | * @see ParagraphLayout::VisualRun | |
144 | * | |
73c04bcf | 145 | * @stable ICU 3.2 |
b75a7d8f A |
146 | */ |
147 | const VisualRun *getVisualRun(le_int32 runIndex) const; | |
148 | ||
149 | /** | |
73c04bcf | 150 | * ICU "poor man's RTTI", returns a UClassID for this class. |
b75a7d8f | 151 | * |
73c04bcf | 152 | * @stable ICU 3.2 |
b75a7d8f | 153 | */ |
73c04bcf | 154 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
b75a7d8f A |
155 | |
156 | /** | |
73c04bcf | 157 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
b75a7d8f | 158 | * |
73c04bcf | 159 | * @stable ICU 3.2 |
b75a7d8f | 160 | */ |
73c04bcf | 161 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
b75a7d8f A |
162 | |
163 | private: | |
164 | ||
165 | /** | |
166 | * The address of this static class variable serves as this class's ID | |
167 | * for ICU "poor man's RTTI". | |
168 | */ | |
169 | static const char fgClassID; | |
170 | ||
171 | friend class ParagraphLayout; | |
172 | ||
173 | le_int32 fAscent; | |
174 | le_int32 fDescent; | |
175 | le_int32 fLeading; | |
176 | ||
177 | le_int32 fRunCount; | |
178 | le_int32 fRunCapacity; | |
179 | ||
180 | VisualRun **fRuns; | |
181 | ||
73c04bcf A |
182 | inline Line(); |
183 | inline Line(const Line &other); | |
184 | inline Line &operator=(const Line & /*other*/) { return *this; }; | |
b75a7d8f A |
185 | |
186 | void computeMetrics(); | |
187 | ||
188 | void append(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, | |
189 | const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]); | |
190 | }; | |
191 | ||
192 | /** | |
193 | * This object represents a single visual run in a line of text in | |
194 | * a paragraph. A visual run is text which is in the same font, | |
195 | * script, and direction. The text is represented by an array of | |
196 | * <code>LEGlyphIDs</code>, an array of (x, y) glyph positions and | |
197 | * a table which maps indices into the glyph array to indices into | |
198 | * the original character array which was used to create the paragraph. | |
199 | * | |
374ca955 | 200 | * These objects are only created by <code>ParagraphLayout::Line</code> objects, |
b75a7d8f A |
201 | * so their constructors and destructors are private. |
202 | * | |
203 | * @see ParagraphLayout::Line | |
204 | * | |
73c04bcf | 205 | * @stable ICU 3.2 |
b75a7d8f A |
206 | */ |
207 | class U_LAYOUTEX_API VisualRun : public UObject | |
208 | { | |
209 | public: | |
210 | /** | |
211 | * Get the <code>LEFontInstance</code> object which | |
212 | * represents the font of the visual run. This will always | |
213 | * be a non-composite font. | |
214 | * | |
215 | * @return the <code>LEFontInstance</code> object which represents the | |
216 | * font of the visual run. | |
217 | * | |
218 | * @see LEFontInstance | |
219 | * | |
73c04bcf | 220 | * @stable ICU 3.2 |
b75a7d8f | 221 | */ |
73c04bcf | 222 | inline const LEFontInstance *getFont() const; |
b75a7d8f A |
223 | |
224 | /** | |
225 | * Get the direction of the visual run. | |
226 | * | |
227 | * @return the direction of the run. This will be UBIDI_LTR if the | |
228 | * run is left-to-right and UBIDI_RTL if the line is right-to-left. | |
229 | * | |
73c04bcf | 230 | * @stable ICU 3.2 |
b75a7d8f | 231 | */ |
73c04bcf | 232 | inline UBiDiDirection getDirection() const; |
b75a7d8f A |
233 | |
234 | /** | |
235 | * Get the number of glyphs in the visual run. | |
236 | * | |
237 | * @return the number of glyphs. | |
238 | * | |
73c04bcf | 239 | * @stable ICU 3.2 |
b75a7d8f | 240 | */ |
73c04bcf | 241 | inline le_int32 getGlyphCount() const; |
b75a7d8f A |
242 | |
243 | /** | |
244 | * Get the glyphs in the visual run. Glyphs with the values <code>0xFFFE</code> and | |
245 | * <code>0xFFFF</code> should be ignored. | |
246 | * | |
247 | * @return the address of the array of glyphs for this visual run. The storage | |
248 | * is owned by the <code>VisualRun</code> object and must not be deleted. | |
249 | * It will remain valid as long as the <code>VisualRun</code> object is valid. | |
250 | * | |
73c04bcf | 251 | * @stable ICU 3.2 |
b75a7d8f | 252 | */ |
73c04bcf | 253 | inline const LEGlyphID *getGlyphs() const; |
b75a7d8f A |
254 | |
255 | /** | |
256 | * Get the (x, y) positions of the glyphs in the visual run. To simplify storage | |
257 | * management, the x and y positions are stored in a single array with the x positions | |
258 | * at even offsets in the array and the corresponding y position in the following odd offset. | |
259 | * There is an extra (x, y) pair at the end of the array which represents the advance of | |
260 | * the final glyph in the run. | |
261 | * | |
262 | * @return the address of the array of glyph positions for this visual run. The storage | |
263 | * is owned by the <code>VisualRun</code> object and must not be deleted. | |
264 | * It will remain valid as long as the <code>VisualRun</code> object is valid. | |
265 | * | |
73c04bcf | 266 | * @stable ICU 3.2 |
b75a7d8f | 267 | */ |
73c04bcf | 268 | inline const float *getPositions() const; |
b75a7d8f A |
269 | |
270 | /** | |
271 | * Get the glyph-to-character map for this visual run. This maps the indices into | |
272 | * the glyph array to indices into the character array used to create the paragraph. | |
273 | * | |
274 | * @return the address of the character-to-glyph map for this visual run. The storage | |
275 | * is owned by the <code>VisualRun</code> object and must not be deleted. | |
276 | * It will remain valid as long as the <code>VisualRun</code> object is valid. | |
277 | * | |
73c04bcf | 278 | * @stable ICU 3.2 |
b75a7d8f | 279 | */ |
73c04bcf | 280 | inline const le_int32 *getGlyphToCharMap() const; |
b75a7d8f A |
281 | |
282 | /** | |
283 | * A convenience method which returns the ascent value for the font | |
284 | * associated with this run. | |
285 | * | |
286 | * @return the ascent value of this run's font. | |
287 | * | |
73c04bcf | 288 | * @stable ICU 3.2 |
b75a7d8f | 289 | */ |
73c04bcf | 290 | inline le_int32 getAscent() const; |
b75a7d8f A |
291 | |
292 | /** | |
293 | * A convenience method which returns the descent value for the font | |
294 | * associated with this run. | |
295 | * | |
296 | * @return the descent value of this run's font. | |
297 | * | |
73c04bcf | 298 | * @stable ICU 3.2 |
b75a7d8f | 299 | */ |
73c04bcf | 300 | inline le_int32 getDescent() const; |
b75a7d8f A |
301 | |
302 | /** | |
303 | * A convenience method which returns the leading value for the font | |
304 | * associated with this run. | |
305 | * | |
306 | * @return the leading value of this run's font. | |
307 | * | |
73c04bcf | 308 | * @stable ICU 3.2 |
b75a7d8f | 309 | */ |
73c04bcf | 310 | inline le_int32 getLeading() const; |
b75a7d8f A |
311 | |
312 | /** | |
73c04bcf | 313 | * ICU "poor man's RTTI", returns a UClassID for this class. |
b75a7d8f | 314 | * |
73c04bcf | 315 | * @stable ICU 3.2 |
b75a7d8f | 316 | */ |
73c04bcf | 317 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
b75a7d8f A |
318 | |
319 | /** | |
73c04bcf | 320 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
b75a7d8f | 321 | * |
73c04bcf | 322 | * @stable ICU 3.2 |
b75a7d8f | 323 | */ |
73c04bcf | 324 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
b75a7d8f A |
325 | |
326 | private: | |
327 | ||
328 | /** | |
329 | * The address of this static class variable serves as this class's ID | |
330 | * for ICU "poor man's RTTI". | |
331 | */ | |
332 | static const char fgClassID; | |
333 | ||
334 | const LEFontInstance *fFont; | |
335 | const UBiDiDirection fDirection; | |
336 | ||
337 | const le_int32 fGlyphCount; | |
338 | ||
339 | const LEGlyphID *fGlyphs; | |
340 | const float *fPositions; | |
341 | const le_int32 *fGlyphToCharMap; | |
342 | ||
343 | friend class Line; | |
344 | ||
73c04bcf A |
345 | inline VisualRun(); |
346 | inline VisualRun(const VisualRun &other); | |
347 | inline VisualRun &operator=(const VisualRun &/*other*/) { return *this; }; | |
b75a7d8f | 348 | |
73c04bcf | 349 | inline VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, |
b75a7d8f A |
350 | const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]); |
351 | ||
352 | ~VisualRun(); | |
353 | }; | |
354 | ||
355 | /** | |
356 | * Construct a <code>ParagraphLayout</code> object for a styled paragraph. The paragraph is specified | |
357 | * as runs of text all in the same font. An <code>LEFontInstance</code> object and a limit offset | |
358 | * are specified for each font run. The limit offset is the offset of the character immediately | |
359 | * after the font run. | |
360 | * | |
361 | * Clients can optionally specify directional runs and / or script runs. If these aren't specified | |
362 | * they will be computed. | |
363 | * | |
374ca955 A |
364 | * If any errors are encountered during construction, <code>status</code> will be set, and the object |
365 | * will be set to be empty. | |
366 | * | |
b75a7d8f A |
367 | * @param chars is an array of the characters in the paragraph |
368 | * | |
369 | * @param count is the number of characters in the paragraph. | |
370 | * | |
371 | * @param fontRuns a pointer to a <code>FontRuns</code> object representing the font runs. | |
372 | * | |
373 | * @param levelRuns is a pointer to a <code>ValueRuns</code> object representing the directional levels. | |
374 | * If this pointer in <code>NULL</code> the levels will be determined by running the Unicde | |
375 | * Bidi algorithm. | |
376 | * | |
377 | * @param scriptRuns is a pointer to a <code>ValueRuns</code> object representing script runs. | |
378 | * If this pointer in <code>NULL</code> the script runs will be determined using the | |
379 | * Unicode code points. | |
380 | * | |
381 | * @param localeRuns is a pointer to a <code>LocaleRuns</code> object representing locale runs. | |
382 | * The <code>Locale</code> objects are used to determind the language of the text. If this | |
383 | * pointer is <code>NULL</code> the default locale will be used for all of the text. | |
384 | * | |
385 | * @param paragraphLevel is the directionality of the paragraph, as in the UBiDi object. | |
386 | * | |
374ca955 A |
387 | * @param vertical is <code>TRUE</code> if the paragraph should be set vertically. |
388 | * | |
389 | * @param status will be set to any error code encountered during construction. | |
b75a7d8f A |
390 | * |
391 | * @see ubidi.h | |
392 | * @see LEFontInstance.h | |
393 | * @see LayoutEngine.h | |
394 | * @see RunArrays.h | |
395 | * | |
73c04bcf | 396 | * @stable ICU 2.8 |
b75a7d8f A |
397 | */ |
398 | ParagraphLayout(const LEUnicode chars[], le_int32 count, | |
399 | const FontRuns *fontRuns, | |
400 | const ValueRuns *levelRuns, | |
401 | const ValueRuns *scriptRuns, | |
402 | const LocaleRuns *localeRuns, | |
374ca955 A |
403 | UBiDiLevel paragraphLevel, le_bool vertical, |
404 | LEErrorCode &status); | |
b75a7d8f A |
405 | |
406 | /** | |
407 | * The destructor. Virtual so that it works correctly with | |
408 | * sublcasses. | |
409 | * | |
73c04bcf | 410 | * @stable ICU 3.2 |
b75a7d8f A |
411 | */ |
412 | ~ParagraphLayout(); | |
413 | ||
414 | // Note: the following is #if 0'd out because there's no good | |
415 | // way to implement it without either calling layoutEngineFactory() | |
416 | // or duplicating the logic there... | |
417 | #if 0 | |
418 | /** | |
419 | * Examine the given styled paragraph and determine if it contains any text which | |
420 | * requires complex processing. (i.e. that cannot be correctly rendered by | |
421 | * just mapping the characters to glyphs and rendering them in order) | |
422 | * | |
423 | * @param chars is an array of the characters in the paragraph | |
424 | * | |
425 | * @param count is the number of characters in the paragraph. | |
426 | * | |
427 | * @param fontRuns is a pointer to a <code>FontRuns</code> object representing the font runs. | |
428 | * | |
374ca955 | 429 | * @return <code>TRUE</code> if the paragraph contains complex text. |
b75a7d8f | 430 | * |
73c04bcf | 431 | * @stable ICU 3.2 |
b75a7d8f A |
432 | */ |
433 | static le_bool isComplex(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns); | |
434 | #else | |
435 | /** | |
436 | * Examine the given text and determine if it contains characters in any | |
437 | * script which requires complex processing to be rendered correctly. | |
438 | * | |
439 | * @param chars is an array of the characters in the paragraph | |
440 | * | |
441 | * @param count is the number of characters in the paragraph. | |
442 | * | |
374ca955 | 443 | * @return <code>TRUE</code> if any of the text requires complex processing. |
b75a7d8f | 444 | * |
73c04bcf | 445 | * @stable ICU 3.2 |
b75a7d8f A |
446 | */ |
447 | static le_bool isComplex(const LEUnicode chars[], le_int32 count); | |
448 | ||
449 | #endif | |
450 | ||
451 | /** | |
452 | * Return the resolved paragraph level. This is useful for those cases | |
453 | * where the bidi analysis has determined the level based on the first | |
454 | * strong character in the paragraph. | |
455 | * | |
456 | * @return the resolved paragraph level. | |
457 | * | |
73c04bcf | 458 | * @stable ICU 3.2 |
b75a7d8f | 459 | */ |
73c04bcf | 460 | inline UBiDiLevel getParagraphLevel(); |
b75a7d8f A |
461 | |
462 | /** | |
463 | * Return the directionality of the text in the paragraph. | |
464 | * | |
465 | * @return <code>UBIDI_LTR</code> if the text is all left to right, | |
466 | * <code>UBIDI_RTL</code> if the text is all right to left, | |
467 | * or <code>UBIDI_MIXED</code> if the text has mixed direction. | |
468 | * | |
73c04bcf | 469 | * @stable ICU 3.2 |
b75a7d8f | 470 | */ |
73c04bcf | 471 | inline UBiDiDirection getTextDirection(); |
b75a7d8f A |
472 | |
473 | /** | |
474 | * Return the max ascent value for all the fonts | |
475 | * in the paragraph. | |
476 | * | |
477 | * @return the ascent value. | |
478 | * | |
73c04bcf | 479 | * @stable ICU 3.2 |
b75a7d8f A |
480 | */ |
481 | virtual le_int32 getAscent() const; | |
482 | ||
483 | /** | |
484 | * Return the max descent value for all the fonts | |
485 | * in the paragraph. | |
486 | * | |
487 | * @return the decent value. | |
488 | * | |
73c04bcf | 489 | * @stable ICU 3.2 |
b75a7d8f A |
490 | */ |
491 | virtual le_int32 getDescent() const; | |
492 | ||
493 | /** | |
494 | * Return the max leading value for all the fonts | |
495 | * in the paragraph. | |
496 | * | |
497 | * @return the leading value. | |
498 | * | |
73c04bcf | 499 | * @stable ICU 3.2 |
b75a7d8f A |
500 | */ |
501 | virtual le_int32 getLeading() const; | |
502 | ||
503 | /** | |
504 | * Reset line breaking to start from the beginning of the paragraph. | |
505 | * | |
506 | * | |
73c04bcf | 507 | * @stable ICU 3.2 |
b75a7d8f | 508 | */ |
73c04bcf | 509 | inline void reflow(); |
4388f060 A |
510 | |
511 | #ifndef U_HIDE_INTERNAL_API | |
729e4ab9 A |
512 | /** |
513 | * | |
514 | * Convenience method for determining if paragraph layout processing is complete ( i.e. there | |
515 | * are no more lines left to process. ) | |
516 | * | |
517 | * @return true if there are no more lines to be processed | |
518 | * | |
519 | * @internal | |
520 | */ | |
521 | inline le_bool isDone() const; | |
4388f060 | 522 | #endif /* U_HIDE_INTERNAL_API */ |
b75a7d8f A |
523 | |
524 | /** | |
525 | * Return a <code>ParagraphLayout::Line</code> object which represents next line | |
526 | * in the paragraph. The width of the line is specified each time so that it can | |
527 | * be varied to support arbitrary paragraph shapes. | |
528 | * | |
529 | * @param width is the width of the line. If <code>width</code> is less than or equal | |
530 | * to zero, a <code>ParagraphLayout::Line</code> object representing the | |
531 | * rest of the paragraph will be returned. | |
532 | * | |
533 | * @return a <code>ParagraphLayout::Line</code> object which represents the line. The caller | |
534 | * is responsible for deleting the object. Returns <code>NULL</code> if there are no | |
374ca955 | 535 | * more lines in the paragraph. |
b75a7d8f A |
536 | * |
537 | * @see ParagraphLayout::Line | |
538 | * | |
73c04bcf | 539 | * @stable ICU 3.2 |
b75a7d8f A |
540 | */ |
541 | Line *nextLine(float width); | |
542 | ||
543 | /** | |
73c04bcf | 544 | * ICU "poor man's RTTI", returns a UClassID for this class. |
b75a7d8f | 545 | * |
73c04bcf | 546 | * @stable ICU 3.2 |
b75a7d8f | 547 | */ |
73c04bcf | 548 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
b75a7d8f A |
549 | |
550 | /** | |
73c04bcf | 551 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
b75a7d8f | 552 | * |
73c04bcf | 553 | * @stable ICU 3.2 |
b75a7d8f | 554 | */ |
73c04bcf | 555 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
b75a7d8f A |
556 | |
557 | private: | |
558 | ||
559 | ||
560 | /** | |
561 | * The address of this static class variable serves as this class's ID | |
562 | * for ICU "poor man's RTTI". | |
563 | */ | |
564 | static const char fgClassID; | |
565 | ||
566 | struct StyleRunInfo | |
567 | { | |
568 | LayoutEngine *engine; | |
569 | const LEFontInstance *font; | |
570 | const Locale *locale; | |
571 | LEGlyphID *glyphs; | |
572 | float *positions; | |
573 | UScriptCode script; | |
574 | UBiDiLevel level; | |
575 | le_int32 runBase; | |
576 | le_int32 runLimit; | |
577 | le_int32 glyphBase; | |
578 | le_int32 glyphCount; | |
579 | }; | |
580 | ||
581 | ParagraphLayout() {}; | |
582 | ParagraphLayout(const ParagraphLayout & /*other*/) : UObject( ){}; | |
73c04bcf | 583 | inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; }; |
b75a7d8f A |
584 | |
585 | void computeLevels(UBiDiLevel paragraphLevel); | |
586 | ||
587 | Line *computeVisualRuns(); | |
588 | void appendRun(Line *line, le_int32 run, le_int32 firstChar, le_int32 lastChar); | |
589 | ||
590 | void computeScripts(); | |
591 | ||
592 | void computeLocales(); | |
593 | ||
374ca955 | 594 | void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status); |
b75a7d8f A |
595 | |
596 | void computeMetrics(); | |
597 | ||
598 | le_int32 getLanguageCode(const Locale *locale); | |
599 | ||
600 | le_int32 getCharRun(le_int32 charIndex); | |
601 | ||
602 | static le_bool isComplex(UScriptCode script); | |
603 | ||
604 | le_int32 previousBreak(le_int32 charIndex); | |
605 | ||
606 | ||
607 | const LEUnicode *fChars; | |
608 | le_int32 fCharCount; | |
609 | ||
610 | const FontRuns *fFontRuns; | |
611 | const ValueRuns *fLevelRuns; | |
612 | const ValueRuns *fScriptRuns; | |
613 | const LocaleRuns *fLocaleRuns; | |
614 | ||
615 | le_bool fVertical; | |
616 | le_bool fClientLevels; | |
617 | le_bool fClientScripts; | |
618 | le_bool fClientLocales; | |
619 | ||
620 | UBiDiLevel *fEmbeddingLevels; | |
621 | ||
622 | le_int32 fAscent; | |
623 | le_int32 fDescent; | |
624 | le_int32 fLeading; | |
625 | ||
626 | le_int32 *fGlyphToCharMap; | |
374ca955 A |
627 | le_int32 *fCharToMinGlyphMap; |
628 | le_int32 *fCharToMaxGlyphMap; | |
b75a7d8f A |
629 | float *fGlyphWidths; |
630 | le_int32 fGlyphCount; | |
631 | ||
632 | UBiDi *fParaBidi; | |
633 | UBiDi *fLineBidi; | |
634 | ||
635 | le_int32 *fStyleRunLimits; | |
636 | le_int32 *fStyleIndices; | |
637 | StyleRunInfo *fStyleRunInfo; | |
638 | le_int32 fStyleRunCount; | |
639 | ||
640 | BreakIterator *fBreakIterator; | |
641 | le_int32 fLineStart; | |
642 | le_int32 fLineEnd; | |
643 | ||
644 | le_int32 fFirstVisualRun; | |
645 | le_int32 fLastVisualRun; | |
646 | float fVisualRunLastX; | |
647 | float fVisualRunLastY; | |
648 | }; | |
649 | ||
650 | inline UBiDiLevel ParagraphLayout::getParagraphLevel() | |
651 | { | |
652 | return ubidi_getParaLevel(fParaBidi); | |
653 | } | |
654 | ||
655 | inline UBiDiDirection ParagraphLayout::getTextDirection() | |
656 | { | |
657 | return ubidi_getDirection(fParaBidi); | |
658 | } | |
659 | ||
660 | inline void ParagraphLayout::reflow() | |
661 | { | |
662 | fLineEnd = 0; | |
663 | } | |
664 | ||
665 | inline ParagraphLayout::Line::Line() | |
666 | : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL) | |
667 | { | |
668 | // nothing else to do | |
669 | } | |
670 | ||
671 | inline ParagraphLayout::Line::Line(const Line & /*other*/) | |
672 | : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL) | |
673 | { | |
674 | // nothing else to do | |
675 | } | |
676 | ||
677 | inline le_int32 ParagraphLayout::Line::countRuns() const | |
678 | { | |
679 | return fRunCount; | |
680 | } | |
681 | ||
682 | inline const LEFontInstance *ParagraphLayout::VisualRun::getFont() const | |
683 | { | |
684 | return fFont; | |
685 | } | |
686 | ||
687 | inline UBiDiDirection ParagraphLayout::VisualRun::getDirection() const | |
688 | { | |
689 | return fDirection; | |
690 | } | |
691 | ||
692 | inline le_int32 ParagraphLayout::VisualRun::getGlyphCount() const | |
693 | { | |
694 | return fGlyphCount; | |
695 | } | |
696 | ||
697 | inline const LEGlyphID *ParagraphLayout::VisualRun::getGlyphs() const | |
698 | { | |
699 | return fGlyphs; | |
700 | } | |
701 | ||
702 | inline const float *ParagraphLayout::VisualRun::getPositions() const | |
703 | { | |
704 | return fPositions; | |
705 | } | |
706 | ||
707 | inline const le_int32 *ParagraphLayout::VisualRun::getGlyphToCharMap() const | |
708 | { | |
709 | return fGlyphToCharMap; | |
710 | } | |
711 | ||
712 | inline le_int32 ParagraphLayout::VisualRun::getAscent() const | |
713 | { | |
714 | return fFont->getAscent(); | |
715 | } | |
716 | ||
717 | inline le_int32 ParagraphLayout::VisualRun::getDescent() const | |
718 | { | |
719 | return fFont->getDescent(); | |
720 | } | |
721 | ||
722 | inline le_int32 ParagraphLayout::VisualRun::getLeading() const | |
723 | { | |
724 | return fFont->getLeading(); | |
725 | } | |
726 | ||
727 | inline ParagraphLayout::VisualRun::VisualRun() | |
728 | : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL) | |
729 | { | |
730 | // nothing | |
731 | } | |
732 | ||
73c04bcf | 733 | inline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/) |
b75a7d8f A |
734 | : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL) |
735 | { | |
736 | // nothing | |
737 | } | |
738 | ||
739 | inline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, | |
740 | const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]) | |
741 | : fFont(font), fDirection(direction), fGlyphCount(glyphCount), | |
742 | fGlyphs(glyphs), fPositions(positions), fGlyphToCharMap(glyphToCharMap) | |
743 | { | |
744 | // nothing else needs to be done! | |
745 | } | |
746 | ||
b75a7d8f A |
747 | U_NAMESPACE_END |
748 | #endif | |
749 | #endif |