| 1 | // © 2016 and later: Unicode, Inc. and others. |
| 2 | // License & terms of use: http://www.unicode.org/copyright.html |
| 3 | /* |
| 4 | ********************************************************************** |
| 5 | * Copyright (C) 2002-2014, International Business Machines |
| 6 | * Corporation and others. All Rights Reserved. |
| 7 | ********************************************************************** |
| 8 | */ |
| 9 | |
| 10 | #ifndef __PARAGRAPHLAYOUT_H |
| 11 | |
| 12 | #define __PARAGRAPHLAYOUT_H |
| 13 | |
| 14 | /** |
| 15 | * \file |
| 16 | * \brief C++ API: Paragraph Layout |
| 17 | */ |
| 18 | |
| 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 | * |
| 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 |
| 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 | * |
| 67 | * @stable ICU 3.2 |
| 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 | * |
| 78 | * @stable ICU 3.2 |
| 79 | */ |
| 80 | ~Line(); |
| 81 | |
| 82 | /** |
| 83 | * Count the number of visual runs in the line. |
| 84 | * |
| 85 | * @return the number of visual runs. |
| 86 | * |
| 87 | * @stable ICU 3.2 |
| 88 | */ |
| 89 | inline le_int32 countRuns() const; |
| 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 | * |
| 97 | * @stable ICU 3.2 |
| 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 | * |
| 107 | * @stable ICU 3.2 |
| 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 | * |
| 117 | * @stable ICU 3.2 |
| 118 | */ |
| 119 | le_int32 getLeading() const; |
| 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 | * |
| 128 | * @stable ICU 2.8 |
| 129 | */ |
| 130 | le_int32 getWidth() const; |
| 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 | * |
| 145 | * @stable ICU 3.2 |
| 146 | */ |
| 147 | const VisualRun *getVisualRun(le_int32 runIndex) const; |
| 148 | |
| 149 | /** |
| 150 | * ICU "poor man's RTTI", returns a UClassID for this class. |
| 151 | * |
| 152 | * @stable ICU 3.2 |
| 153 | */ |
| 154 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
| 155 | |
| 156 | /** |
| 157 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
| 158 | * |
| 159 | * @stable ICU 3.2 |
| 160 | */ |
| 161 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
| 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 | |
| 182 | inline Line(); |
| 183 | inline Line(const Line &other); |
| 184 | inline Line &operator=(const Line & /*other*/) { return *this; }; |
| 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 | * |
| 200 | * These objects are only created by <code>ParagraphLayout::Line</code> objects, |
| 201 | * so their constructors and destructors are private. |
| 202 | * |
| 203 | * @see ParagraphLayout::Line |
| 204 | * |
| 205 | * @stable ICU 3.2 |
| 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 | * |
| 220 | * @stable ICU 3.2 |
| 221 | */ |
| 222 | inline const LEFontInstance *getFont() const; |
| 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 | * |
| 230 | * @stable ICU 3.2 |
| 231 | */ |
| 232 | inline UBiDiDirection getDirection() const; |
| 233 | |
| 234 | /** |
| 235 | * Get the number of glyphs in the visual run. |
| 236 | * |
| 237 | * @return the number of glyphs. |
| 238 | * |
| 239 | * @stable ICU 3.2 |
| 240 | */ |
| 241 | inline le_int32 getGlyphCount() const; |
| 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 | * |
| 251 | * @stable ICU 3.2 |
| 252 | */ |
| 253 | inline const LEGlyphID *getGlyphs() const; |
| 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 | * |
| 266 | * @stable ICU 3.2 |
| 267 | */ |
| 268 | inline const float *getPositions() const; |
| 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 | * |
| 278 | * @stable ICU 3.2 |
| 279 | */ |
| 280 | inline const le_int32 *getGlyphToCharMap() const; |
| 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 | * |
| 288 | * @stable ICU 3.2 |
| 289 | */ |
| 290 | inline le_int32 getAscent() const; |
| 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 | * |
| 298 | * @stable ICU 3.2 |
| 299 | */ |
| 300 | inline le_int32 getDescent() const; |
| 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 | * |
| 308 | * @stable ICU 3.2 |
| 309 | */ |
| 310 | inline le_int32 getLeading() const; |
| 311 | |
| 312 | /** |
| 313 | * ICU "poor man's RTTI", returns a UClassID for this class. |
| 314 | * |
| 315 | * @stable ICU 3.2 |
| 316 | */ |
| 317 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
| 318 | |
| 319 | /** |
| 320 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
| 321 | * |
| 322 | * @stable ICU 3.2 |
| 323 | */ |
| 324 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
| 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 | |
| 345 | inline VisualRun(); |
| 346 | inline VisualRun(const VisualRun &other); |
| 347 | inline VisualRun &operator=(const VisualRun &/*other*/) { return *this; }; |
| 348 | |
| 349 | inline VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, |
| 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 | * |
| 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 | * |
| 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 | * |
| 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. |
| 390 | * |
| 391 | * @see ubidi.h |
| 392 | * @see LEFontInstance.h |
| 393 | * @see LayoutEngine.h |
| 394 | * @see RunArrays.h |
| 395 | * |
| 396 | * @stable ICU 2.8 |
| 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, |
| 403 | UBiDiLevel paragraphLevel, le_bool vertical, |
| 404 | LEErrorCode &status); |
| 405 | |
| 406 | /** |
| 407 | * The destructor. Virtual so that it works correctly with |
| 408 | * sublcasses. |
| 409 | * |
| 410 | * @stable ICU 3.2 |
| 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 | * |
| 429 | * @return <code>TRUE</code> if the paragraph contains complex text. |
| 430 | * |
| 431 | * @stable ICU 3.2 |
| 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 | * |
| 443 | * @return <code>TRUE</code> if any of the text requires complex processing. |
| 444 | * |
| 445 | * @stable ICU 3.2 |
| 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 | * |
| 458 | * @stable ICU 3.2 |
| 459 | */ |
| 460 | inline UBiDiLevel getParagraphLevel(); |
| 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 | * |
| 469 | * @stable ICU 3.2 |
| 470 | */ |
| 471 | inline UBiDiDirection getTextDirection(); |
| 472 | |
| 473 | /** |
| 474 | * Return the max ascent value for all the fonts |
| 475 | * in the paragraph. |
| 476 | * |
| 477 | * @return the ascent value. |
| 478 | * |
| 479 | * @stable ICU 3.2 |
| 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 | * |
| 489 | * @stable ICU 3.2 |
| 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 | * |
| 499 | * @stable ICU 3.2 |
| 500 | */ |
| 501 | virtual le_int32 getLeading() const; |
| 502 | |
| 503 | /** |
| 504 | * Reset line breaking to start from the beginning of the paragraph. |
| 505 | * |
| 506 | * |
| 507 | * @stable ICU 3.2 |
| 508 | */ |
| 509 | inline void reflow(); |
| 510 | |
| 511 | #ifndef U_HIDE_INTERNAL_API |
| 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; |
| 522 | #endif /* U_HIDE_INTERNAL_API */ |
| 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 |
| 535 | * more lines in the paragraph. |
| 536 | * |
| 537 | * @see ParagraphLayout::Line |
| 538 | * |
| 539 | * @stable ICU 3.2 |
| 540 | */ |
| 541 | Line *nextLine(float width); |
| 542 | |
| 543 | /** |
| 544 | * ICU "poor man's RTTI", returns a UClassID for this class. |
| 545 | * |
| 546 | * @stable ICU 3.2 |
| 547 | */ |
| 548 | static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } |
| 549 | |
| 550 | /** |
| 551 | * ICU "poor man's RTTI", returns a UClassID for the actual class. |
| 552 | * |
| 553 | * @stable ICU 3.2 |
| 554 | */ |
| 555 | virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } |
| 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( ){}; |
| 583 | inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; }; |
| 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 | |
| 594 | void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status); |
| 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; |
| 627 | le_int32 *fCharToMinGlyphMap; |
| 628 | le_int32 *fCharToMaxGlyphMap; |
| 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 | |
| 733 | inline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/) |
| 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 | |
| 747 | U_NAMESPACE_END |
| 748 | #endif |
| 749 | #endif |