ParagraphLayout.h

Go to the documentation of this file.
00001 /*
00002  **********************************************************************
00003  *   Copyright (C) 2002-2005, 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();
00501 
00519     Line *nextLine(float width);
00520 
00526     static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
00527 
00533     virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
00534 
00535 private:
00536 
00537 
00542     static const char fgClassID;
00543 
00544     struct StyleRunInfo
00545     {
00546           LayoutEngine   *engine;
00547     const LEFontInstance *font;
00548     const Locale         *locale;
00549           LEGlyphID      *glyphs;
00550           float          *positions;
00551           UScriptCode     script;
00552           UBiDiLevel      level;
00553           le_int32        runBase;
00554           le_int32        runLimit;
00555           le_int32        glyphBase;
00556           le_int32        glyphCount;
00557     };
00558 
00559     ParagraphLayout() {};
00560     ParagraphLayout(const ParagraphLayout & /*other*/) : UObject( ){};
00561     inline ParagraphLayout &operator=(const ParagraphLayout & /*other*/) { return *this; };
00562 
00563     void computeLevels(UBiDiLevel paragraphLevel);
00564 
00565     Line *computeVisualRuns();
00566     void appendRun(Line *line, le_int32 run, le_int32 firstChar, le_int32 lastChar);
00567 
00568     void computeScripts();
00569 
00570     void computeLocales();
00571 
00572     void computeSubFonts(const FontRuns *fontRuns, LEErrorCode &status);
00573 
00574     void computeMetrics();
00575 
00576     le_int32 getLanguageCode(const Locale *locale);
00577 
00578     le_int32 getCharRun(le_int32 charIndex);
00579 
00580     static le_bool isComplex(UScriptCode script);
00581 
00582     le_int32 previousBreak(le_int32 charIndex);
00583 
00584 
00585     const LEUnicode *fChars;
00586           le_int32   fCharCount;
00587 
00588     const FontRuns   *fFontRuns;
00589     const ValueRuns  *fLevelRuns;
00590     const ValueRuns  *fScriptRuns;
00591     const LocaleRuns *fLocaleRuns;
00592 
00593           le_bool fVertical;
00594           le_bool fClientLevels;
00595           le_bool fClientScripts;
00596           le_bool fClientLocales;
00597 
00598           UBiDiLevel *fEmbeddingLevels;
00599 
00600           le_int32 fAscent;
00601           le_int32 fDescent;
00602           le_int32 fLeading;
00603 
00604           le_int32 *fGlyphToCharMap;
00605           le_int32 *fCharToMinGlyphMap;
00606           le_int32 *fCharToMaxGlyphMap;
00607           float    *fGlyphWidths;
00608           le_int32  fGlyphCount;
00609 
00610           UBiDi *fParaBidi;
00611           UBiDi *fLineBidi;
00612 
00613           le_int32     *fStyleRunLimits;
00614           le_int32     *fStyleIndices;
00615           StyleRunInfo *fStyleRunInfo;
00616           le_int32      fStyleRunCount;
00617 
00618           BreakIterator *fBreakIterator;
00619           le_int32       fLineStart;
00620           le_int32       fLineEnd;
00621 
00622           le_int32       fFirstVisualRun;
00623           le_int32       fLastVisualRun;
00624           float          fVisualRunLastX;
00625           float          fVisualRunLastY;
00626 };
00627 
00628 inline UBiDiLevel ParagraphLayout::getParagraphLevel()
00629 {
00630     return ubidi_getParaLevel(fParaBidi);
00631 }
00632 
00633 inline UBiDiDirection ParagraphLayout::getTextDirection()
00634 {
00635     return ubidi_getDirection(fParaBidi);
00636 }
00637 
00638 inline void ParagraphLayout::reflow()
00639 {
00640     fLineEnd = 0;
00641 }
00642 
00643 inline ParagraphLayout::Line::Line()
00644     : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
00645 {
00646     // nothing else to do
00647 }
00648 
00649 inline ParagraphLayout::Line::Line(const Line & /*other*/)
00650     : UObject(), fAscent(0), fDescent(0), fLeading(0), fRunCount(0), fRunCapacity(0), fRuns(NULL)
00651 {
00652     // nothing else to do
00653 }
00654 
00655 inline le_int32 ParagraphLayout::Line::countRuns() const
00656 {
00657     return fRunCount;
00658 }
00659 
00660 inline const LEFontInstance *ParagraphLayout::VisualRun::getFont() const
00661 {
00662     return fFont;
00663 }
00664 
00665 inline UBiDiDirection ParagraphLayout::VisualRun::getDirection() const
00666 {
00667     return fDirection;
00668 }
00669 
00670 inline le_int32 ParagraphLayout::VisualRun::getGlyphCount() const
00671 {
00672     return fGlyphCount;
00673 }
00674 
00675 inline const LEGlyphID *ParagraphLayout::VisualRun::getGlyphs() const
00676 {
00677     return fGlyphs;
00678 }
00679 
00680 inline const float *ParagraphLayout::VisualRun::getPositions() const
00681 {
00682     return fPositions;
00683 }
00684 
00685 inline const le_int32 *ParagraphLayout::VisualRun::getGlyphToCharMap() const
00686 {
00687     return fGlyphToCharMap;
00688 }
00689 
00690 inline le_int32 ParagraphLayout::VisualRun::getAscent() const
00691 {
00692     return fFont->getAscent();
00693 }
00694 
00695 inline le_int32 ParagraphLayout::VisualRun::getDescent() const
00696 {
00697     return fFont->getDescent();
00698 }
00699 
00700 inline le_int32 ParagraphLayout::VisualRun::getLeading() const
00701 {
00702     return fFont->getLeading();
00703 }
00704 
00705 inline ParagraphLayout::VisualRun::VisualRun()
00706     : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
00707 {
00708     // nothing
00709 }
00710 
00711 inline ParagraphLayout::VisualRun::VisualRun(const VisualRun &/*other*/)
00712     : UObject(), fFont(NULL), fDirection(UBIDI_LTR), fGlyphCount(0), fGlyphs(NULL), fPositions(NULL), fGlyphToCharMap(NULL)
00713 {
00714     // nothing
00715 }
00716 
00717 inline ParagraphLayout::VisualRun::VisualRun(const LEFontInstance *font, UBiDiDirection direction, le_int32 glyphCount,
00718                                              const LEGlyphID glyphs[], const float positions[], const le_int32 glyphToCharMap[])
00719     : fFont(font), fDirection(direction), fGlyphCount(glyphCount),
00720       fGlyphs(glyphs), fPositions(positions), fGlyphToCharMap(glyphToCharMap)
00721 {
00722     // nothing else needs to be done!
00723 }
00724 
00725 U_NAMESPACE_END
00726 #endif
00727 #endif

Generated on Mon Aug 13 07:17:24 2007 for ICU 3.6 by  doxygen 1.5.2