X-Git-Url: http://code.vuplus.com/gitweb/?a=blobdiff_plain;f=lib%2Fgdi%2Ffont.h;h=a00a248c6a04c7d570d2a126c98336798038b604;hb=HEAD;hp=0f3bf7145610c5582d52a5a02a53cdf54f43a046;hpb=0e5307c51280792394948716d5e3ecef7d87c295;p=vuplus_dvbapp diff --git a/lib/gdi/font.h b/lib/gdi/font.h index 0f3bf71..a00a248 100644 --- a/lib/gdi/font.h +++ b/lib/gdi/font.h @@ -8,7 +8,12 @@ #include FT_CACHE_H #include FT_CACHE_IMAGE_H #include FT_CACHE_SMALL_BITMAPS_H +#include FT_STROKER_H +typedef FTC_ImageCache FTC_Image_Cache; +typedef FTC_ImageTypeRec FTC_Image_Desc; +typedef FTC_SBitCache FTC_SBit_Cache; #include +#include #include #include @@ -17,6 +22,8 @@ #include #include +#include + class FontRenderClass; class Font; class gDC; @@ -42,10 +49,16 @@ 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(); + ~fontRenderClass(); #endif public: float getLineHeight(const gFont& font); @@ -54,9 +67,9 @@ public: 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, const std::string &face, int size, int tabwidth=-1); -#endif fontRenderClass(); ~fontRenderClass(); +#endif }; #ifndef SWIG @@ -69,16 +82,26 @@ public: #define GS_ISSPACE 1 #define GS_ISFIRST 2 #define GS_USED 4 - #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; FT_ULong glyph_index; int flags; eRect bbox; + FT_Glyph image, borderimage; + pGlyph() + { + image = NULL; + borderimage = NULL; + } }; typedef std::vector glyphString; @@ -88,42 +111,49 @@ class eLCD; class eTextPara: public iObject { -DECLARE_REF(eTextPara); -private: - ePtr current_font, replacement_font; + DECLARE_REF(eTextPara); + ePtr current_font, replacement_font; FT_Face current_face, replacement_face; int use_kerning; int previous; static std::string replacement_facename; + static std::set forced_replaces; eRect area; ePoint cursor; eSize maximum; int left; glyphString glyphs; + std::list lineOffsets; + std::list 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(); static void setReplacementFont(std::string font) { replacement_facename=font; } + static void forceReplacementGlyph(int unicode) { forced_replaces.insert(unicode); } void setFont(const gFont *font); - int renderString(const std::string &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 { @@ -147,33 +177,35 @@ 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; } }; class Font: public iObject { -DECLARE_REF(Font); + DECLARE_REF(Font); public: + FTC_ScalerRec scaler; 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;