X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/9a23857fd9c6b3dd6a989d865974df96e9fe1828..06d7275867f5737235100f50f3ad7d5ec2f526fc:/lib/gdi/font.cpp diff --git a/lib/gdi/font.cpp b/lib/gdi/font.cpp index f27a8f77..9e175476 100644 --- a/lib/gdi/font.cpp +++ b/lib/gdi/font.cpp @@ -6,16 +6,19 @@ #include #include #include +#include + +#ifndef BYTE_ORDER +#error "no BYTE_ORDER defined!" +#endif // 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 @@ -24,12 +27,7 @@ #include #include -#define HAVE_FRIBIDI -// until we have it in the cdk - -#ifdef HAVE_FRIBIDI #include -#endif #include @@ -37,10 +35,6 @@ fontRenderClass *fontRenderClass::instance; static pthread_mutex_t ftlock=PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP; -#ifndef HAVE_FREETYPE2 -static FTC_Font cache_current_font=0; -#endif - struct fntColorCacheKey { gRGB start, end; @@ -205,12 +199,8 @@ 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 { eDebug("FTC_Manager_Lookup_Size failed!"); return 0; @@ -258,7 +248,6 @@ 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; @@ -267,12 +256,6 @@ Font::Font(fontRenderClass *render, FTC_FaceID faceid, int isize, int tw): tabwi 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; @@ -365,7 +348,7 @@ int eTextPara::appendGlyph(Font *current_font, FT_Face current_face, FT_UInt gly } pGlyph ng; - ng.bbox.setLeft( (flags&GS_ISFIRST|cursor.x()-1)+glyph->left ); + ng.bbox.setLeft( ((flags&GS_ISFIRST)|(cursor.x()-1))+glyph->left ); ng.bbox.setTop( cursor.y() - glyph->top ); ng.bbox.setWidth( glyph->width ); ng.bbox.setHeight( glyph->height ); @@ -469,18 +452,12 @@ 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; @@ -488,24 +465,17 @@ 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); } @@ -520,7 +490,6 @@ int eTextPara::renderString(const char *string, int rflags) if (!current_font) return -1; -#ifdef HAVE_FREETYPE2 if ((FTC_Manager_LookupFace(fontRenderClass::instance->cacheManager, current_font->scaler.face_id, ¤t_face) < 0) || @@ -531,17 +500,6 @@ int eTextPara::renderString(const char *string, int rflags) 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) - { - eDebug("FTC_Manager_Lookup_Size failed!"); - return -1; - } - cache_current_font=¤t_font->font.font; - } -#endif if (!current_face) eFatal("eTextPara::renderString: no current_face"); @@ -605,7 +563,6 @@ int eTextPara::renderString(const char *string, int rflags) // now do the usual logical->visual reordering int size=uc_shape.size(); -#ifdef HAVE_FRIBIDI FriBidiCharType dir=FRIBIDI_TYPE_ON; uc_visual.resize(size); // gaaanz lahm, aber anders geht das leider nicht, sorry. @@ -613,9 +570,6 @@ int eTextPara::renderString(const char *string, int rflags) std::copy(uc_shape.begin(), uc_shape.end(), array); fribidi_log2vis(array, size, &dir, target, 0, 0, 0); uc_visual.assign(target, target+size); -#else - uc_visual=uc_shape; -#endif glyphs.reserve(size); @@ -709,13 +663,11 @@ nprint: isprintable=0; } bboxValid=false; calc_bbox(); -#ifdef HAVE_FRIBIDI if (dir & FRIBIDI_MASK_RTL) { realign(dirRight); doTopBottomReordering=true; } -#endif if (charCount) { @@ -734,7 +686,6 @@ 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) || @@ -745,17 +696,6 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons 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) - { - eDebug("FTC_Manager_Lookup_Size failed!"); - return; - } - cache_current_font=¤t_font->font.font; - } -#endif ePtr target; dc.getPixmap(target); @@ -766,8 +706,9 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons gColor *lookup8, lookup8_invert[16]; gColor *lookup8_normal=0; + __u16 lookup16_normal[16], lookup16_invert[16], *lookup16; __u32 lookup32_normal[16], lookup32_invert[16], *lookup32; - + if (surface->bpp == 8) { if (surface->clut.data) @@ -781,10 +722,33 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons opcode=0; } else opcode=1; + } else if (surface->bpp == 16) + { + opcode=2; + for (int i=0; i<16; ++i) + { +#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) + { + 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 +#if BYTE_ORDER == LITTLE_ENDIAN + lookup16_normal[i] = bswap_16(((db >> 3) << 11) | ((dg >> 2) << 5) | (dr >> 3)); +#else + lookup16_normal[i] = ((db >> 3) << 11) | ((dg >> 2) << 5) | (dr >> 3); +#endif + da ^= 0xFF; + } + for (int i=0; i<16; ++i) + lookup16_invert[i]=lookup16_normal[i^0xF]; } else if (surface->bpp == 32) { opcode=3; - for (int i=0; i<16; ++i) { #define BLEND(y, x, a) (y + (((x-y) * a)>>8)) @@ -809,7 +773,7 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons eWarning("can't render to %dbpp", surface->bpp); return; } - + gRegion area(eRect(0, 0, surface->x, surface->y)); gRegion clip = dc.getClip() & area; @@ -835,10 +799,12 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons if (!(i->flags & GS_INVERT)) { lookup8 = lookup8_normal; + lookup16 = lookup16_normal; lookup32 = lookup32_normal; } else { lookup8 = lookup8_invert; + lookup16 = lookup16_invert; lookup32 = lookup32_invert; } @@ -873,46 +839,76 @@ void eTextPara::blit(gDC &dc, const ePoint &offset, const gRGB &background, cons d+=diff*buffer_stride; } if (sx>0) - for (int ay=0; ay>4; if(b) *td++=lookup8[b]; else td++; } - } else if (opcode == 1) // 8bit direct + s+=glyph_bitmap->pitch-sx; + d+=buffer_stride; + } + break; + case 1: // 8bit direct + for (int ay=0; aypitch-sx; + d+=buffer_stride; + } + break; + case 2: // 16bit + for (int ay=0; ay>4; + if(b) + *td++=lookup16[b]; + else + td++; + } + s+=glyph_bitmap->pitch-sx; + d+=buffer_stride; + } + break; + case 3: // 32bit + for (int ay=0; ay>4; if(b) *td++=lookup32[b]; else td++; } + s+=glyph_bitmap->pitch-sx; + d+=buffer_stride; } - s+=glyph_bitmap->pitch-sx; - d+=buffer_stride; + default: + break; } + } } } }