X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/a3a94a50132256f3a6524efd6dba0e52e4774087..2d2f681283ecec948254e21180e61aa5152ebc2c:/lib/gdi/font.cpp diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index c438f89b..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);