X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/1ea67ee808e72ddeac7e6a01c42a015102664086..6ae5817707cf77c29ff070e76791cc4816946ec4:/lib/gdi/font.cpp diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index 1471aa5e..3948ea98 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -18,7 +18,7 @@ #include #include -//#define HAVE_FRIBIDI +#define HAVE_FRIBIDI // until we have it in the cdk #ifdef HAVE_FRIBIDI @@ -205,12 +205,10 @@ float fontRenderClass::getLineHeight(const gFont& font) return 0; } int linegap=current_face->size->metrics.height-(current_face->size->metrics.ascender+current_face->size->metrics.descender); - float height=(current_face->size->metrics.ascender+current_face->size->metrics.descender+linegap/2.0)/64; - delete fnt; + float height=(current_face->size->metrics.ascender+current_face->size->metrics.descender+linegap)/64.0; return height; } - fontRenderClass::~fontRenderClass() { singleLock s(ftlock); @@ -237,6 +235,13 @@ int fontRenderClass::getFont(ePtr &font, const std::string &face, int size return 0; } +void addFont(const char *filename, const char *alias, int scale_factor, int is_replacement) +{ + fontRenderClass::getInstance()->AddFont(filename, alias, scale_factor); + if (is_replacement) + eTextPara::setReplacementFont(alias); +} + DEFINE_REF(Font); Font::Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tw): tabwidth(tw) @@ -363,7 +368,7 @@ void eTextPara::calc_bbox() boundBox = i->bbox; ++i; - for (i ; i != glyphs.end(); ++i) + for (; i != glyphs.end(); ++i) { if ( i->flags & GS_ISSPACE ) continue; @@ -386,7 +391,7 @@ void eTextPara::newLine(int flags) cursor.setX(left); previous=0; int linegap=current_face->size->metrics.height-(current_face->size->metrics.ascender+current_face->size->metrics.descender); - cursor+=ePoint(0, (current_face->size->metrics.ascender+current_face->size->metrics.descender+linegap*1/2)>>6); + cursor+=ePoint(0, (current_face->size->metrics.ascender+current_face->size->metrics.descender+linegap)>>6); if (maximum.height() eTextPara::forced_replaces; void eTextPara::setFont(Font *fnt, Font *replacement) { @@ -444,7 +450,7 @@ void eTextPara::setFont(Font *fnt, Font *replacement) void shape (std::vector &string, const std::vector &text); -int eTextPara::renderString(const std::string &string, int rflags) +int eTextPara::renderString(const char *string, int rflags) { singleLock s(ftlock); @@ -468,11 +474,12 @@ int eTextPara::renderString(const std::string &string, int rflags) } std::vector uc_string, uc_visual; - uc_string.reserve(string.length()); + if (string) + uc_string.reserve(strlen(string)); - std::string::const_iterator p(string.begin()); + const char *p = string ? string : ""; - while(p != string.end()) + while (*p) { unsigned int unicode=(unsigned char)*p++; @@ -482,28 +489,28 @@ int eTextPara::renderString(const std::string &string, int rflags) { unicode&=0x1F; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; } else if ((unicode & 0xF0)==0xE0) // three bytes { unicode&=0x0F; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; } else if ((unicode & 0xF8)==0xF0) // four bytes { unicode&=0x07; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; unicode<<=6; - if (p != string.end()) + if (*p) unicode|=(*p++)&0x3F; } } @@ -589,9 +596,10 @@ nprint: isprintable=0; } if (isprintable) { - FT_UInt index; - - index=(rflags&RS_DIRECT)? *i : FT_Get_Char_Index(current_face, *i); + FT_UInt index = 0; + + if (forced_replaces.find(*i) == forced_replaces.end()) + index=(rflags&RS_DIRECT)? *i : FT_Get_Char_Index(current_face, *i); if (!index) { @@ -685,89 +693,92 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons int buffer_stride=surface->stride; - for (glyphString::iterator i(glyphs.begin()); i != glyphs.end(); ++i) + for (unsigned int c = 0; c < clip.rects.size(); ++c) { - if (!(i->flags & GS_INVERT)) - { - lookup8 = lookup8_normal; - lookup32 = lookup32_normal; - } else + for (glyphString::iterator i(glyphs.begin()); i != glyphs.end(); ++i) { - lookup8 = lookup8_invert; - lookup32 = lookup32_invert; - } + if (!(i->flags & GS_INVERT)) + { + lookup8 = lookup8_normal; + lookup32 = lookup32_normal; + } else + { + lookup8 = lookup8_invert; + lookup32 = lookup32_invert; + } - static FTC_SBit glyph_bitmap; - if (fontRenderClass::instance->getGlyphBitmap(&i->font->font, i->glyph_index, &glyph_bitmap)) - continue; - int rx=i->x+glyph_bitmap->left + offset.x(); - int ry=i->y-glyph_bitmap->top + offset.y(); + static FTC_SBit glyph_bitmap; + if (fontRenderClass::instance->getGlyphBitmap(&i->font->font, i->glyph_index, &glyph_bitmap)) + continue; + int rx=i->x+glyph_bitmap->left + offset.x(); + int ry=i->y-glyph_bitmap->top + offset.y(); - __u8 *d=(__u8*)(surface->data)+buffer_stride*ry+rx*surface->bypp; - __u8 *s=glyph_bitmap->buffer; - register int sx=glyph_bitmap->width; - int sy=glyph_bitmap->height; - if ((sy+ry) >= clip.extends.bottom()) - sy=clip.extends.bottom()-ry; - if ((sx+rx) >= clip.extends.right()) - sx=clip.extends.right()-rx; - if (rx < clip.extends.left()) - { - int diff=clip.extends.left()-rx; - s+=diff; - sx-=diff; - rx+=diff; - d+=diff*surface->bypp; - } - if (ry < clip.extends.top()) - { - int diff=clip.extends.top()-ry; - s+=diff*glyph_bitmap->pitch; - sy-=diff; - ry+=diff; - d+=diff*buffer_stride; - } - if (sx>0) - for (int ay=0; aydata)+buffer_stride*ry+rx*surface->bypp; + __u8 *s=glyph_bitmap->buffer; + register int sx=glyph_bitmap->width; + int sy=glyph_bitmap->height; + if ((sy+ry) >= clip.rects[c].bottom()) + sy=clip.rects[c].bottom()-ry; + if ((sx+rx) >= clip.rects[c].right()) + sx=clip.rects[c].right()-rx; + if (rx < clip.rects[c].left()) { - if (!opcode) // 4bit lookup to 8bit - { - register __u8 *td=d; - register int ax; - - for (ax=0; ax>4; - if(b) - *td++=lookup8[b]; - else - td++; - } - } else if (opcode == 1) // 8bit direct - { - register __u8 *td=d; - register int ax; - for (ax=0; axbypp; + } + if (ry < clip.rects[c].top()) + { + int diff=clip.rects[c].top()-ry; + s+=diff*glyph_bitmap->pitch; + sy-=diff; + ry+=diff; + d+=diff*buffer_stride; + } + if (sx>0) + for (int ay=0; ay>4; - if(b) - *td++=lookup32[b]; - else - td++; + if (!opcode) // 4bit lookup to 8bit + { + register __u8 *td=d; + register int ax; + + for (ax=0; ax>4; + if(b) + *td++=lookup8[b]; + else + td++; + } + } else if (opcode == 1) // 8bit direct + { + register __u8 *td=d; + register int ax; + for (ax=0; ax>4; + if(b) + *td++=lookup32[b]; + else + td++; + } } + s+=glyph_bitmap->pitch-sx; + d+=buffer_stride; } - s+=glyph_bitmap->pitch-sx; - d+=buffer_stride; - } + } } }