X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/cdb99d1b59657be0c907836e1a2110939a00e257..da28efe46384a6e23a91e8cb7db726f176bed409:/lib/gdi/font.cpp diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index 6d445ed6..dfac144c 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -10,6 +10,12 @@ // use this for init Freetype... #include #include FT_FREETYPE_H +#ifdef HAVE_FREETYPE2 +#define FTC_Image_Cache_New(a,b) FTC_ImageCache_New(a,b) +#define FTC_Image_Cache_Lookup(a,b,c,d) FTC_ImageCache_Lookup(a,b,c,d,NULL) +#define FTC_SBit_Cache_New(a,b) FTC_SBitCache_New(a,b) +#define FTC_SBit_Cache_Lookup(a,b,c,d) FTC_SBitCache_Lookup(a,b,c,d,NULL) +#endif #include #include @@ -30,9 +36,10 @@ fontRenderClass *fontRenderClass::instance; static pthread_mutex_t ftlock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; -static pthread_mutex_t refcntlck=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; +#ifndef HAVE_FREETYPE2 static FTC_Font cache_current_font=0; +#endif struct fntColorCacheKey { @@ -198,9 +205,13 @@ float fontRenderClass::getLineHeight(const gFont& font) return 0; singleLock s(ftlock); FT_Face current_face; +#ifdef HAVE_FREETYPE2 + if ((FTC_Manager_LookupFace(cacheManager, fnt->scaler.face_id, ¤t_face) < 0) || + (FTC_Manager_LookupSize(cacheManager, &fnt->scaler, &fnt->size) < 0)) +#else if (FTC_Manager_Lookup_Size(cacheManager, &fnt->font.font, ¤t_face, &fnt->size)<0) +#endif { - delete fnt; eDebug("FTC_Manager_Lookup_Size failed!"); return 0; } @@ -247,10 +258,21 @@ DEFINE_REF(Font); Font::Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tw): tabwidth(tw) { renderer=render; +#ifdef HAVE_FREETYPE2 + font.face_id = faceid; + font.width = isize; + font.height = isize; + font.flags = FT_LOAD_DEFAULT; + scaler.face_id = faceid; + scaler.width = isize; + scaler.height = isize; + scaler.pixel = 1; +#else font.font.face_id=faceid; font.font.pix_width = isize; font.font.pix_height = isize; font.image_type = ftc_image_grays; +#endif height=isize; if (tabwidth==-1) tabwidth=8*isize; @@ -438,9 +460,18 @@ void eTextPara::setFont(Font *fnt, Font *replacement) // we ask for replacment_font first becauseof the cache if (replacement_font) { +#ifdef HAVE_FREETYPE2 + if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, + replacement_font->scaler.face_id, + &replacement_face) < 0) || + (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, + &replacement_font->scaler, + &replacement_font->size) < 0)) +#else if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, &replacement_font->font.font, &replacement_face, &replacement_font->size)<0) +#endif { eDebug("FTC_Manager_Lookup_Size failed!"); return; @@ -448,13 +479,24 @@ void eTextPara::setFont(Font *fnt, Font *replacement) } if (current_font) { +#ifdef HAVE_FREETYPE2 + if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, + current_font->scaler.face_id, + ¤t_face) < 0) || + (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, + ¤t_font->scaler, + ¤t_font->size) < 0)) +#else if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) +#endif { eDebug("FTC_Manager_Lookup_Size failed!"); return; } } +#ifndef HAVE_FREETYPE2 cache_current_font=¤t_font->font.font; +#endif previous=0; use_kerning=FT_HAS_KERNING(current_face); } @@ -468,13 +510,19 @@ int eTextPara::renderString(const char *string, int rflags) if (!current_font) return -1; - - if (cursor.y()==-1) + +#ifdef HAVE_FREETYPE2 + if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, + current_font->scaler.face_id, + ¤t_face) < 0) || + (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, + ¤t_font->scaler, + ¤t_font->size) < 0)) { - cursor=ePoint(area.x(), area.y()+(current_face->size->metrics.ascender>>6)); - left=cursor.x(); + eDebug("FTC_Manager_Lookup_Size failed!"); + return -1; } - +#else if (¤t_font->font.font != cache_current_font) { if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) @@ -484,7 +532,19 @@ int eTextPara::renderString(const char *string, int rflags) } cache_current_font=¤t_font->font.font; } - +#endif + + if (!current_face) + eFatal("eTextPara::renderString: no current_face"); + if (!current_face->size) + eFatal("eTextPara::renderString: no current_face->size"); + + if (cursor.y()==-1) + { + cursor=ePoint(area.x(), area.y()+(current_face->size->metrics.ascender>>6)); + left=cursor.x(); + } + std::vector uc_string, uc_visual; if (string) uc_string.reserve(strlen(string)); @@ -656,6 +716,18 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons if (!current_font) return; +#ifdef HAVE_FREETYPE2 + if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, + current_font->scaler.face_id, + ¤t_face) < 0) || + (FTC_Manager_LookupSize(fontRenderClass::instance->cacheManager, + ¤t_font->scaler, + ¤t_font->size) < 0)) + { + eDebug("FTC_Manager_Lookup_Size failed!"); + return; + } +#else if (¤t_font->font.font != cache_current_font) { if (FTC_Manager_Lookup_Size(fontRenderClass::instance->cacheManager, ¤t_font->font.font, ¤t_face, ¤t_font->size)<0) @@ -665,6 +737,7 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons } cache_current_font=¤t_font->font.font; } +#endif ePtr target; dc.getPixmap(target); @@ -693,18 +766,23 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons } else if (surface->bpp == 32) { opcode=3; - if (surface->clut.data) - { - lookup8=getColor(surface->clut, background, foreground).lookup; - for (int i=0; i<16; ++i) - lookup32_normal[i]=((surface->clut.data[lookup8[i]].a<<24)| - (surface->clut.data[lookup8[i]].r<<16)| - (surface->clut.data[lookup8[i]].g<<8)| - (surface->clut.data[lookup8[i]].b))^0xFF000000; - } else + + for (int i=0; i<16; ++i) { - for (int i=0; i<16; ++i) - lookup32_normal[i]=(0x010101*i)|0xFF000000; +#define BLEND(y, x, a) (y + (((x-y) * a)>>8)) + + unsigned char da = background.a, dr = background.r, dg = background.g, db = background.b; + int sa = i * 16; + if (sa < 256) + { + da = BLEND(background.a, foreground.a, sa) & 0xFF; + dr = BLEND(background.r, foreground.r, sa) & 0xFF; + dg = BLEND(background.g, foreground.g, sa) & 0xFF; + db = BLEND(background.b, foreground.b, sa) & 0xFF; + } +#undef BLEND + da ^= 0xFF; + lookup32_normal[i]=db | (dg << 8) | (dr << 16) | (da << 24);; } for (int i=0; i<16; ++i) lookup32_invert[i]=lookup32_normal[i^0xF]; @@ -843,9 +921,6 @@ void eTextPara::realign(int dir) // der code hier ist ein wenig merkwuerdig. num++; } - if (!num) // line mit nur einem space - continue; - switch (dir) { case dirRight: