lib/gdi/font.h/cpp: another try to fix top/bottom reordering for arabic language
[enigma2.git] / lib / gdi / font.h
index a38454d11bcda4ae80bf5141ba717dd00ef28d05..7dd9f89a400c22ac3616f586fab5746eb3bb4768 100644 (file)
@@ -1,13 +1,20 @@
 #ifndef __FONT_H
 #define __FONT_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
+#ifdef HAVE_FREETYPE2
+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>
 #include <string>
 #include <lib/base/object.h> 
 
+#include <set>
+
 class FontRenderClass;
 class Font;
 class gDC;
 class gFont;
 class gRGB;
 
+#endif
 class fontRenderClass
 { 
+#ifndef SWIG
        friend class Font;
        friend class eTextPara;
        fbClass *fb;
@@ -43,17 +54,24 @@ class fontRenderClass
        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);
-       std::string AddFont(const std::string &filename, const std::string &name, int scale);
        static fontRenderClass *getInstance();
-       FT_Error FTC_Face_Requester(FTC_FaceID  face_id,
-                                                                                                                       FT_Face*                aface);
+#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
@@ -62,8 +80,10 @@ 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_CANBREAK (GS_ISSPACE|GS_SOFTHYPHEN|GS_HYPHEN)
 
 struct pGlyph
 {
@@ -81,19 +101,23 @@ class eLCD;
 
 class eTextPara: public iObject
 {
-DECLARE_REF(eTextPara);
-private:
-       ePtr<Font> current_font, replacement_font;
+       DECLARE_REF(eTextPara);
+       ePtr<Font> current_font, replacement_font;
        FT_Face current_face, replacement_face;
        int use_kerning;
        int previous;
        static std::string replacement_facename;
+       static std::set<int> forced_replaces;
 
        eRect area;
        ePoint cursor;
        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);
        void newLine(int flags);
@@ -101,20 +125,23 @@ private:
        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);
+
 
-       void clear();
 
        void blit(gDC &dc, const ePoint &offset, const gRGB &background, const gRGB &foreground);
 
@@ -140,30 +167,33 @@ 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:
+#ifdef HAVE_FREETYPE2
+       FTC_ScalerRec scaler;
+#endif
        FTC_Image_Desc font;
        fontRenderClass *renderer;
        FT_Error getGlyphBitmap(FT_ULong glyph_index, FTC_SBit *sbit);
@@ -178,4 +208,6 @@ public:
 
 extern fontRenderClass *font;
 
+#endif  // !SWIG
+
 #endif