#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 <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;
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();
#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> font;
FT_ULong glyph_index;
int flags;
eRect bbox;
+ FT_Glyph image, borderimage;
+ pGlyph()
+ {
+ image = NULL;
+ borderimage = NULL;
+ }
};
typedef std::vector<pGlyph> glyphString;
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);
+ 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
{
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;