display spinner after 2 seconds, not 500ms.
[enigma2.git] / lib / gdi / font.h
index ac55c884fe335bad9fc7792dd3ca79b3c56faa32..6cc238d788307009c2b254a87ba55991c6d4795a 100644 (file)
@@ -1,35 +1,40 @@
 #ifndef __FONT_H
 #define __FONT_H
 
-#include <freetype/freetype.h>
-#include <freetype/ftcache.h>
-#include <freetype/cache/ftcglyph.h>
-#include <freetype/cache/ftcimage.h>
-#include <freetype/cache/ftcmanag.h>
-#include <freetype/cache/ftcsbits.h>
-#include <freetype/cache/ftlru.h>
+#ifndef SWIG
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_CACHE_H
+#include FT_CACHE_IMAGE_H
+#include FT_CACHE_SMALL_BITMAPS_H
 #include <vector>
 
 #include <lib/gdi/fb.h>
 #include <lib/gdi/esize.h>
 #include <lib/gdi/epoint.h>
 #include <lib/gdi/erect.h>
-#include <lib/base/estring.h>
+#include <string>
+#include <lib/base/object.h> 
+
+#include <set>
 
 class FontRenderClass;
 class Font;
-class gPixmapDC;
+class gDC;
 class gFont;
 class gRGB;
 
+#endif
 class fontRenderClass
 { 
+#ifndef SWIG
        friend class Font;
        friend class eTextPara;
        fbClass *fb;
        struct fontListEntry
        {
-               eString filename, face;
+               std::string filename, face;
                int scale; // 100 is 1:1
                fontListEntry *next;
                ~fontListEntry();
@@ -40,20 +45,27 @@ class fontRenderClass
        FTC_Image_Cache imageCache;                                     /* the glyph image cache                                         */
        FTC_SBit_Cache   sbitsCache;                            /* the glyph small bitmaps cache         */
 
-       FTC_FaceID getFaceID(const eString &face);
+       FTC_FaceID getFaceID(const std::string &face);
        FT_Error getGlyphBitmap(FTC_Image_Desc *font, FT_ULong glyph_index, FTC_SBit *sbit);
        static fontRenderClass *instance;
+#else
+       fontRenderClass();
+       ~fontRenderClass();
+#endif
 public:
        float getLineHeight(const gFont& font);
-       eString AddFont(const eString &filename, const eString &name, int scale);
        static fontRenderClass *getInstance();
-       FT_Error FTC_Face_Requester(FTC_FaceID  face_id,
-                                                                                                                       FT_Face*                aface);
-       Font *getFont(const eString &face, int size, int tabwidth=-1);
+#ifndef SWIG
+       std::string AddFont(const std::string &filename, const std::string &name, int scale);
+       FT_Error FTC_Face_Requester(FTC_FaceID  face_id, FT_Face* aface);
+       int getFont(ePtr<Font> &font, const std::string &face, int size, int tabwidth=-1);
        fontRenderClass();
        ~fontRenderClass();
+#endif
 };
 
+#ifndef SWIG
+
 #define RS_WRAP                1
 #define RS_DOT         2
 #define RS_DIRECT      4
@@ -63,10 +75,12 @@ public:
 #define GS_ISFIRST  2
 #define GS_USED                        4
 
+#define GS_INVERT   8
+
 struct pGlyph
 {
        int x, y, w;
-       Font *font;
+       ePtr<Font> font;
        FT_ULong glyph_index;
        int flags;
        eRect bbox;
@@ -77,20 +91,22 @@ typedef std::vector<pGlyph> glyphString;
 class Font;
 class eLCD;
 
-class eTextPara
+class eTextPara: public iObject
 {
-       Font *current_font, *replacement_font;
+DECLARE_REF(eTextPara);
+private:
+       ePtr<Font> current_font, replacement_font;
        FT_Face current_face, replacement_face;
        int use_kerning;
        int previous;
-       static eString replacement_facename;
+       static std::string replacement_facename;
+       static std::set<int> forced_replaces;
 
        eRect area;
        ePoint cursor;
        eSize maximum;
        int left;
        glyphString glyphs;
-       int refcnt;
 
        int appendGlyph(Font *current_font, FT_Face current_face, FT_UInt glyphIndex, int flags, int rflags);
        void newLine(int flags);
@@ -101,22 +117,20 @@ class eTextPara
 public:
        eTextPara(eRect area, ePoint start=ePoint(-1, -1))
                : current_font(0), replacement_font(0), current_face(0), replacement_face(0),
-                       area(area), cursor(start), maximum(0, 0), left(start.x()), refcnt(0), bboxValid(0)
+                       area(area), cursor(start), maximum(0, 0), left(start.x()), bboxValid(0)
        {
        }
-       ~eTextPara();
+       virtual ~eTextPara();
        
-       static void setReplacementFont(eString font) { replacement_facename=font; }
+       static void setReplacementFont(std::string font) { replacement_facename=font; }
+       static void forceReplacementGlyph(int unicode) { forced_replaces.insert(unicode); }
 
-       void destroy();
-       eTextPara *grab();
-
-       void setFont(const gFont &font);
-       int renderString(const eString &string, int flags=0);
+       void setFont(const gFont *font);
+       int renderString(const char *string, int flags=0);
 
        void clear();
 
-       void blit(gPixmapDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground);
+       void blit(gDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground);
 
        enum
        {
@@ -132,19 +146,40 @@ public:
 
                return boundBox;
        }
+       
+       const int size() const
+       {
+               return glyphs.size();
+       }
 
        const eRect& getGlyphBBox(int num) const
        {
+               assert(num >= 0);
+               assert(num < (int)glyphs.size());
                return glyphs[num].bbox;
        }
+       
+       void setGlyphFlag(int g, int f)
+       {
+               assert(g >= 0);
+               assert(g < (int)glyphs.size());
+               glyphs[g].flags |= f;
+       }
+
+       void clearGlyphFlag(int g, int f)
+       {
+               assert(g >= 0);
+               assert(g < (int)glyphs.size());
+               glyphs[g].flags |= f;
+       }
 };
 
-class Font
+class Font: public iObject
 {
+DECLARE_REF(Font);
 public:
        FTC_Image_Desc font;
        fontRenderClass *renderer;
-       int ref;
        FT_Error getGlyphBitmap(FT_ULong glyph_index, FTC_SBit *sbit);
        FT_Face face;
        FT_Size size;
@@ -152,12 +187,11 @@ public:
        int tabwidth;
        int height;
        Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tabwidth);
-       ~Font();
-       
-       void lock();
-       void unlock();  // deletes if ref==0
+       virtual ~Font();
 };
 
 extern fontRenderClass *font;
 
+#endif  // !SWIG
+
 #endif