| ## Public API Reference

- Main Page
- Modules
- Namespaces
- Classes
- Files
- Related Pages

- File List
- File Members

# csplugincommon/opengl/glfontcache.h

Go to the documentation of this file.

    00001 /*
    00002     Copyright (C) 2003 by Jorrit Tyberghein
    00003               (C) 2003 by Frank Richter
    00004
    00005     This library is free software; you can redistribute it and/or
    00006     modify it under the terms of the GNU Library General Public
    00007     License as published by the Free Software Foundation; either
    00008     version 2 of the License, or (at your option) any later version.
    00009
    00010     This library is distributed in the hope that it will be useful,
    00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
    00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00013     Library General Public License for more details.
    00014
    00015     You should have received a copy of the GNU Library General Public
    00016     License along with this library; if not, write to the Free
    00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
    00018 */
    00019
    00020 #ifndef __CS_CANVAS_OPENGLCOMMON_GLFONTCACHE_H__
    00021 #define __CS_CANVAS_OPENGLCOMMON_GLFONTCACHE_H__
    00022
    00027 #include "csextern_gl.h"
    00028 #include "csgeom/subrec.h"
    00029 #include "csgeom/vector2.h"
    00030 #include "csutil/dirtyaccessarray.h"
    00031 #include "csutil/refarr.h"
    00032 #include "csplugincommon/canvas/fontcache.h"
    00033
    00034 class csGLStateCache;
    00035
    00036 class csGraphics2DGLCommon;
    00037
    00044 class CS_CSPLUGINCOMMON_GL_EXPORT csGLFontCache : public csFontCache
    00045 {
    00046   struct GLGlyphCacheData : public csFontCache::GlyphCacheData
    00047   {
    00048     csSubRect* subrect;
    00049     float tx1, ty1, tx2, ty2;
    00050     size_t texNum;
    00051     csBitmapMetrics bmetrics;
    00052   };
    00053
    00054   csGraphics2DGLCommon* G2D;
    00055   csGLStateCache* statecache;
    00056
    00057   int texSize;
    00058   size_t maxTxts;
    00059   size_t usedTexs;
    00060   int glyphAlign;
    00061   GLuint texWhite;
    00062   /* There are currently 3 ways to draw text:
    00063      1) Using a special multitexture setup that blends the FG and BG color.
    00064         Preferred, as we save the texture environment switch.
    00065         Obviously requires MT.
    00066      2) Using ARB_fragment_program.
    00067         This is a workaround for a bug in some ATI drivers that seem to garble
    00068         text drawing under certain circumstances, which is avoided by using an
    00069         AFP instead of a multitexturing setup.
    00070      3) Using "Blend" environment which has the same effect as (1).
    00071         Not all HW properly supports this.
    00072      4) Most ugly: separate passes for FG and BG - needs two textures (one
    00073         with background, one with foreground transparency), and doesn't always
    00074         look right with AA! (We ignore that until someone complains.)
    00075    */
    00076   // Whether to use method 1.
    00077   bool multiTexText;
    00078   // Whether to use method 2.
    00079   bool afpText;
    00080   // Whether to use method 3.
    00081   bool intensityBlendText;
    00082   GLuint textProgram;
    00083
    00084   struct CacheTexture
    00085   {
    00086     GLuint handle;
    00087     GLuint mirrorHandle;
    00088     csSubRectangles* glyphRects;
    00089
    00090     CacheTexture ()
    00091     {
    00092       glyphRects = 0;
    00093     }
    00094     ~CacheTexture ()
    00095     {
    00096       delete glyphRects;
    00097     }
    00098     void InitRects (int size)
    00099     {
    00100       glyphRects = new csSubRectangles (csRect (0, 0, size, size));
    00101     }
    00102   };
    00103   csArray<CacheTexture> textures;
    00104   csBlockAllocator<GLGlyphCacheData> cacheDataAlloc;
    00105
    00106   struct TextJob
    00107   {
    00108     GLuint texture;
    00109     GLuint mirrorTexture;
    00110     int fg, bg;
    00111     size_t vertOffset, vertCount, bgVertOffset, bgVertCount;
    00112
    00113     void ClearRanges()
    00114     {
    00115       vertOffset = vertCount = bgVertOffset = bgVertCount = 0;
    00116     }
    00117   };
    00118   csArray<TextJob> jobs;
    00119   size_t jobCount;
    00120   bool textWriting;
    00121   bool needStates;
    00122   int envColor;
    00123   size_t numFloats;
    00124   size_t maxFloats;
    00125   bool tcaEnabled, vaEnabled, caEnabled;
    00126   csDirtyAccessArray<float> verts2d;
    00127   csDirtyAccessArray<float> texcoords;
    00128
    00129   TextJob& GetJob (int fg, int bg, GLuint texture, GLuint mirrorTexture,
    00130     size_t bgOffset);
    00131
    00132   inline void FlushArrays ();
    00133   void BeginText ();
    00134 protected:
    00135   void Report (int severity, const char* msg, ...);
    00136
    00137   virtual GlyphCacheData* InternalCacheGlyph (KnownFont* font,
    00138     utf32_char glyph, uint flags);
    00139   virtual void InternalUncacheGlyph (GlyphCacheData* cacheData);
    00140
    00141   void CopyGlyphData (iFont* font, utf32_char glyph, size_t tex,
    00142     const csBitmapMetrics& bmetrics, const csRect& texRect,
    00143     iDataBuffer* bitmapDataBuf, iDataBuffer* alphaDataBuf);
    00144 public:
    00145   csGLFontCache (csGraphics2DGLCommon* G2D);
    00146   virtual ~csGLFontCache ();
    00147
    00149   void Setup();
    00150
    00154   virtual void WriteString (iFont *font, int pen_x, int pen_y,
    00155     int fg, int bg, const void* text, bool isWide, uint flags);
    00156
    00163   void FlushText ();
    00164
    00168   void DumpFontCache (csRefArray<iImage>& pages);
    00169 };
    00170
    00173 #endif // __CS_CANVAS_OPENGLCOMMON_GLFONTCACHE_H__