ICU 4.8.1.1
4.8.1.1
|
00001 /* 00002 ********************************************************************** 00003 * Copyright (C) 2002-2010, International Business Machines 00004 * Corporation and others. All Rights Reserved. 00005 ********************************************************************** 00006 */ 00007 00008 #ifndef __PARAGRAPHLAYOUT_H 00009 00010 #define __PARAGRAPHLAYOUT_H 00011 00017 /* 00018 * ParagraphLayout doesn't make much sense without 00019 * BreakIterator... 00020 */ 00021 #include "unicode/uscript.h" 00022 #if ! UCONFIG_NO_BREAK_ITERATION 00023 00024 #include "layout/LETypes.h" 00025 #include "layout/LEFontInstance.h" 00026 #include "layout/LayoutEngine.h" 00027 #include "unicode/ubidi.h" 00028 #include "unicode/brkiter.h" 00029 00030 #include "layout/RunArrays.h" 00031 00032 U_NAMESPACE_BEGIN 00033 00044 class U_LAYOUTEX_API ParagraphLayout : public UObject 00045 { 00046 public: 00047 class VisualRun; 00048 00060 class U_LAYOUTEX_API Line : public UObject 00061 { 00062 public: 00071 ~Line(); 00072 00080 inline le_int32 countRuns() const; 00081 00090 le_int32 getAscent() const; 00091 00100 le_int32 getDescent() const; 00101 00110 le_int32 getLeading() const; 00111 00121 le_int32 getWidth() const; 00122 00138 const VisualRun *getVisualRun(le_int32 runIndex) const; 00139 00145 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 00146 00152 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 00153 00154 private: 00155 00160 static const char fgClassID; 00161 00162 friend class ParagraphLayout; 00163 00164 le_int32 fAscent; 00165 le_int32 fDescent; 00166 le_int32 fLeading; 00167 00168 le_int32 fRunCount; 00169 le_int32 fRunCapacity; 00170 00171 VisualRun **fRuns; 00172 00173 inline Line(); 00174 inline Line(const Line &other); 00175 inline Line &operator=(const Line & /*other*/) { return *this; }; 00176 00177 void computeMetrics(); 00178 00179 void append(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, 00180 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]); 00181 }; 00182 00198 class U_LAYOUTEX_API VisualRun : public UObject 00199 { 00200 public: 00213 inline const LEFontInstance *getFont() const; 00214 00223 inline UBiDiDirection getDirection() const; 00224 00232 inline le_int32 getGlyphCount() const; 00233 00244 inline const LEGlyphID *getGlyphs() const; 00245 00259 inline const float *getPositions() const; 00260 00271 inline const le_int32 *getGlyphToCharMap() const; 00272 00281 inline le_int32 getAscent() const; 00282 00291 inline le_int32 getDescent() const; 00292 00301 inline le_int32 getLeading() const; 00302 00308 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 00309 00315 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 00316 00317 private: 00318 00323 static const char fgClassID; 00324 00325 const LEFontInstance *fFont; 00326 const UBiDiDirection fDirection; 00327 00328 const le_int32 fGlyphCount; 00329 00330 const LEGlyphID *fGlyphs; 00331 const float *fPositions; 00332 const le_int32 *fGlyphToCharMap; 00333 00334 friend class Line; 00335 00336 inline VisualRun(); 00337 inline VisualRun(const VisualRun &other); 00338 inline VisualRun &operator=(const VisualRun &/*other*/) { return *this; }; 00339 00340 inline VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, 00341 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]); 00342 00343 ~VisualRun(); 00344 }; 00345 00389 ParagraphLayout(const LEUnicode chars[], le_int32 count, 00390 const FontRuns *fontRuns, 00391 const ValueRuns *levelRuns, 00392 const ValueRuns *scriptRuns, 00393 const LocaleRuns *localeRuns, 00394 UBiDiLevel paragraphLevel, le_bool vertical, 00395 LEErrorCode &status); 00396 00403 ~ParagraphLayout(); 00404 00405 // Note: the following is #if 0'd out because there's no good 00406 // way to implement it without either calling layoutEngineFactory() 00407 // or duplicating the logic there... 00408 #if 0 00409 00424 static le_bool isComplex(const LEUnicode chars[], le_int32 count, const FontRuns *fontRuns); 00425 #else 00426 00438 static le_bool isComplex(const LEUnicode chars[], le_int32 count); 00439 00440 #endif 00441 00451 inline UBiDiLevel getParagraphLevel(); 00452 00462 inline UBiDiDirection getTextDirection(); 00463 00472 virtual le_int32 getAscent() const; 00473 00482 virtual le_int32 getDescent() const; 00483 00492 virtual le_int32 getLeading() const; 00493 00500 inline void reflow(); 00510 inline le_bool isDone() const; 00511 00529 Line *nextLine(float width); 00530 00536 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } 00537 00543 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } 00544 00545 private: 00546 00547 00552 static const char fgClassID; 00553 00554 struct StyleRunInfo 00555 { 00556 LayoutEngine *engine; 00557 const LEFontInstance *font; 00558 const Locale *locale; 00559 LEGlyphID *glyphs; 00560 float *positions; 00561 UScriptCode script; 00562 UBiDiLevel level; 00563 le_int32 runBase; 00564 le_int32 runLimit; 00565 le_int32 glyphBase; 00566 le_int32 glyphCount; 00567 }; 00568 00569 ParagraphLayout() {}; 00570 ParagraphLayout(const ParagraphLayout & /*other*/) : UObject( ){}; 00571 inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; }; 00572 00573 void computeLevels(UBiDiLevel paragraphLevel); 00574 00575 Line *computeVisualRuns(); 00576 void appendRun(Line *line, le_int32 run, le_int32 firstChar, le_int32 lastChar); 00577 00578 void computeScripts(); 00579 00580 void computeLocales(); 00581 00582 void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status); 00583 00584 void computeMetrics(); 00585 00586 le_int32 getLanguageCode(const Locale *locale); 00587 00588 le_int32 getCharRun(le_int32 charIndex); 00589 00590 static le_bool isComplex(UScriptCode script); 00591 00592 le_int32 previousBreak(le_int32 charIndex); 00593 00594 00595 const LEUnicode *fChars; 00596 le_int32 fCharCount; 00597 00598 const FontRuns *fFontRuns; 00599 const ValueRuns *fLevelRuns; 00600 const ValueRuns *fScriptRuns; 00601 const LocaleRuns *fLocaleRuns; 00602 00603 le_bool fVertical; 00604 le_bool fClientLevels; 00605 le_bool fClientScripts; 00606 le_bool fClientLocales; 00607 00608 UBiDiLevel *fEmbeddingLevels; 00609 00610 le_int32 fAscent; 00611 le_int32 fDescent; 00612 le_int32 fLeading; 00613 00614 le_int32 *fGlyphToCharMap; 00615 le_int32 *fCharToMinGlyphMap; 00616 le_int32 *fCharToMaxGlyphMap; 00617 float *fGlyphWidths; 00618 le_int32 fGlyphCount; 00619 00620 UBiDi *fParaBidi; 00621 UBiDi *fLineBidi; 00622 00623 le_int32 *fStyleRunLimits; 00624 le_int32 *fStyleIndices; 00625 StyleRunInfo *fStyleRunInfo; 00626 le_int32 fStyleRunCount; 00627 00628 BreakIterator *fBreakIterator; 00629 le_int32 fLineStart; 00630 le_int32 fLineEnd; 00631 00632 le_int32 fFirstVisualRun; 00633 le_int32 fLastVisualRun; 00634 float fVisualRunLastX; 00635 float fVisualRunLastY; 00636 }; 00637 00638 inline UBiDiLevel ParagraphLayout::getParagraphLevel() 00639 { 00640 return ubidi_getParaLevel(fParaBidi); 00641 } 00642 00643 inline UBiDiDirection ParagraphLayout::getTextDirection() 00644 { 00645 return ubidi_getDirection(fParaBidi); 00646 } 00647 00648 inline void ParagraphLayout::reflow() 00649 { 00650 fLineEnd = 0; 00651 } 00652 00653 inline ParagraphLayout::Line::Line() 00654 : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL) 00655 { 00656 // nothing else to do 00657 } 00658 00659 inline ParagraphLayout::Line::Line(const Line & /*other*/) 00660 : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL) 00661 { 00662 // nothing else to do 00663 } 00664 00665 inline le_int32 ParagraphLayout::Line::countRuns() const 00666 { 00667 return fRunCount; 00668 } 00669 00670 inline const LEFontInstance *ParagraphLayout::VisualRun::getFont() const 00671 { 00672 return fFont; 00673 } 00674 00675 inline UBiDiDirection ParagraphLayout::VisualRun::getDirection() const 00676 { 00677 return fDirection; 00678 } 00679 00680 inline le_int32 ParagraphLayout::VisualRun::getGlyphCount() const 00681 { 00682 return fGlyphCount; 00683 } 00684 00685 inline const LEGlyphID *ParagraphLayout::VisualRun::getGlyphs() const 00686 { 00687 return fGlyphs; 00688 } 00689 00690 inline const float *ParagraphLayout::VisualRun::getPositions() const 00691 { 00692 return fPositions; 00693 } 00694 00695 inline const le_int32 *ParagraphLayout::VisualRun::getGlyphToCharMap() const 00696 { 00697 return fGlyphToCharMap; 00698 } 00699 00700 inline le_int32 ParagraphLayout::VisualRun::getAscent() const 00701 { 00702 return fFont->getAscent(); 00703 } 00704 00705 inline le_int32 ParagraphLayout::VisualRun::getDescent() const 00706 { 00707 return fFont->getDescent(); 00708 } 00709 00710 inline le_int32 ParagraphLayout::VisualRun::getLeading() const 00711 { 00712 return fFont->getLeading(); 00713 } 00714 00715 inline ParagraphLayout::VisualRun::VisualRun() 00716 : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL) 00717 { 00718 // nothing 00719 } 00720 00721 inline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/) 00722 : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL) 00723 { 00724 // nothing 00725 } 00726 00727 inline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount, 00728 const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[]) 00729 : fFont(font), fDirection(direction), fGlyphCount(glyphCount), 00730 fGlyphs(glyphs), fPositions(positions), fGlyphToCharMap(glyphToCharMap) 00731 { 00732 // nothing else needs to be done! 00733 } 00734 00735 U_NAMESPACE_END 00736 #endif 00737 #endif