Support turbo2.
[vuplus_dvbapp] / lib / gdi / font.h
index 41d51dd..a00a248 100644 (file)
@@ -8,12 +8,12 @@
 #include FT_CACHE_H
 #include FT_CACHE_IMAGE_H
 #include FT_CACHE_SMALL_BITMAPS_H
-#ifdef HAVE_FREETYPE2
+#include FT_STROKER_H
 typedef FTC_ImageCache FTC_Image_Cache;
 typedef FTC_ImageTypeRec FTC_Image_Desc;
 typedef FTC_SBitCache FTC_SBit_Cache;
-#endif
 #include <vector>
+#include <list>
 
 #include <lib/gdi/fb.h>
 #include <lib/gdi/esize.h>
@@ -49,9 +49,12 @@ class fontRenderClass
        FTC_Manager                     cacheManager;                           /* the cache manager                                                     */
        FTC_Image_Cache imageCache;                                     /* the glyph image cache                                         */
        FTC_SBit_Cache   sbitsCache;                            /* the glyph small bitmaps cache         */
+       FT_Stroker stroker;
+       int strokerRadius;
 
        FTC_FaceID getFaceID(const std::string &face);
        FT_Error getGlyphBitmap(FTC_Image_Desc *font, FT_ULong glyph_index, FTC_SBit *sbit);
+       FT_Error getGlyphImage(FTC_Image_Desc *font, FT_ULong glyph_index, FT_Glyph *glyph, FT_Glyph *borderglyph, int bordersize);
        static fontRenderClass *instance;
 #else
        fontRenderClass();
@@ -82,15 +85,23 @@ public:
 #define GS_INVERT   8
 #define GS_SOFTHYPHEN 16
 #define GS_HYPHEN   32
+#define GS_COLORCHANGE 64
 #define GS_CANBREAK (GS_ISSPACE|GS_SOFTHYPHEN|GS_HYPHEN)
 
 struct pGlyph
 {
        int x, y, w;
+       unsigned long newcolor;
        ePtr<Font> font;
        FT_ULong glyph_index;
        int flags;
        eRect bbox;
+       FT_Glyph image, borderimage;
+       pGlyph()
+       {
+               image = NULL;
+               borderimage = NULL;
+       }
 };
 
 typedef std::vector<pGlyph> glyphString;
@@ -113,17 +124,23 @@ class eTextPara: public iObject
        eSize maximum;
        int left;
        glyphString glyphs;
+       std::list<int> lineOffsets;
+       std::list<int> lineChars;
+       int charCount;
+       bool doTopBottomReordering;
 
-       int appendGlyph(Font *current_font, FT_Face current_face, FT_UInt glyphIndex, int flags, int rflags);
+       int appendGlyph(Font *current_font, FT_Face current_face, FT_UInt glyphIndex, int flags, int rflags, int border, bool activate_newcolor, unsigned long newcolor);
        void newLine(int flags);
        void setFont(Font *font, Font *replacement_font);
        eRect boundBox;
        void calc_bbox();
        int bboxValid;
+       void clear();
 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()), bboxValid(0)
+               :current_font(0), replacement_font(0), current_face(0), replacement_face(0)
+               ,area(area), cursor(start), maximum(0, 0), left(start.x()), charCount(0)
+               ,doTopBottomReordering(false), bboxValid(0)
        {
        }
        virtual ~eTextPara();
@@ -132,11 +149,11 @@ public:
        static void forceReplacementGlyph(int unicode) { forced_replaces.insert(unicode); }
 
        void setFont(const gFont *font);
-       int renderString(const char *string, int flags=0);
+       int renderString(const char *string, int flags=0, int border=0);
+
 
-       void clear();
 
-       void blit(gDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground);
+       void blit(gDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground, bool border = false);
 
        enum
        {
@@ -160,22 +177,22 @@ public:
 
        const eRect& getGlyphBBox(int num) const
        {
-               assert(num >= 0);
-               assert(num < (int)glyphs.size());
+               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());
+               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());
+               ASSERT(g >= 0);
+               ASSERT(g < (int)glyphs.size());
                glyphs[g].flags |= f;
        }
 };
@@ -184,12 +201,11 @@ class Font: public iObject
 {
        DECLARE_REF(Font);
 public:
-#ifdef HAVE_FREETYPE2
        FTC_ScalerRec scaler;
-#endif
        FTC_Image_Desc font;
        fontRenderClass *renderer;
        FT_Error getGlyphBitmap(FT_ULong glyph_index, FTC_SBit *sbit);
+       FT_Error getGlyphImage(FT_ULong glyph_index, FT_Glyph *glyph, FT_Glyph *borderglyph, int bordersize);
        FT_Face face;
        FT_Size size;