gfx_layout.h

Go to the documentation of this file.
00001 /* $Id: gfx_layout.h 25502 2013-06-28 19:44:28Z rubidium $ */
00002 
00003 /*
00004  * This file is part of OpenTTD.
00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
00008  */
00009 
00012 #ifndef GFX_LAYOUT_H
00013 #define GFX_LAYOUT_H
00014 
00015 #include "fontcache.h"
00016 #include "gfx_func.h"
00017 #include "core/smallmap_type.hpp"
00018 
00019 #ifdef WITH_ICU
00020 #include "layout/ParagraphLayout.h"
00021 #define ICU_FONTINSTANCE : public LEFontInstance
00022 #else /* WITH_ICU */
00023 #define ICU_FONTINSTANCE
00024 #endif /* WITH_ICU */
00025 
00029 class Font ICU_FONTINSTANCE {
00030 public:
00031   FontCache *fc;     
00032   TextColour colour; 
00033 
00034   Font(FontSize size, TextColour colour);
00035 
00036 #ifdef WITH_ICU
00037   /* Implementation details of LEFontInstance */
00038 
00039   le_int32 getUnitsPerEM() const;
00040   le_int32 getAscent() const;
00041   le_int32 getDescent() const;
00042   le_int32 getLeading() const;
00043   float getXPixelsPerEm() const;
00044   float getYPixelsPerEm() const;
00045   float getScaleFactorX() const;
00046   float getScaleFactorY() const;
00047   const void *getFontTable(LETag tableTag) const;
00048   const void *getFontTable(LETag tableTag, size_t &length) const;
00049   LEGlyphID mapCharToGlyph(LEUnicode32 ch) const;
00050   void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const;
00051   le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const;
00052 #endif /* WITH_ICU */
00053 };
00054 
00056 typedef SmallMap<int, Font *> FontMap;
00057 
00058 #ifndef WITH_ICU
00059 
00079 class ParagraphLayout {
00080 public:
00082   class VisualRun {
00083     Font *font;       
00084     GlyphID *glyphs;  
00085     float *positions; 
00086     int glyph_count;  
00087 
00088   public:
00089     VisualRun(Font *font, const WChar *chars, int glyph_count, int x);
00090     ~VisualRun();
00091     Font *getFont() const;
00092     int getGlyphCount() const;
00093     const GlyphID *getGlyphs() const;
00094     float *getPositions() const;
00095     int getLeading() const;
00096   };
00097 
00099   class Line : public AutoDeleteSmallVector<VisualRun *, 4> {
00100   public:
00101     int getLeading() const;
00102     int getWidth() const;
00103     int countRuns() const;
00104     VisualRun *getVisualRun(int run) const;
00105   };
00106 
00107   const WChar *buffer_begin; 
00108   WChar *buffer;             
00109   FontMap &runs;             
00110 
00111   ParagraphLayout(WChar *buffer, int length, FontMap &runs);
00112   Line *nextLine(int max_width);
00113 };
00114 #endif /* !WITH_ICU */
00115 
00121 class Layouter : public AutoDeleteSmallVector<ParagraphLayout::Line *, 4> {
00122 #ifdef WITH_ICU
00123   typedef UChar CharType; 
00124 #else /* WITH_ICU */
00125   typedef WChar CharType; 
00126 #endif /* WITH_ICU */
00127 
00128   size_t AppendToBuffer(CharType *buff, const CharType *buffer_last, WChar c);
00129   ParagraphLayout *GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping);
00130 
00131   CharType buffer[DRAW_STRING_BUFFER]; 
00132   SmallVector<Font *, 4> fonts;        
00133 
00134 public:
00135   Layouter(const char *str, int maxw = INT32_MAX, TextColour colour = TC_FROMSTRING, FontSize fontsize = FS_NORMAL);
00136   ~Layouter();
00137   Dimension GetBounds();
00138 };
00139 
00140 #endif /* GFX_LAYOUT_H */