X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fguicast%2Fbcwindowdraw.C;h=61865c50e19a576702f1d0b11bb536c7e7e2f697;hb=26fe9e12d6d42ae8f7087ac7f08242769d77a84a;hp=635679ea43a7670e607bd0fddedbd069ea0408c9;hpb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcwindowdraw.C b/cinelerra-5.1/guicast/bcwindowdraw.C index 635679ea..61865c50 100644 --- a/cinelerra-5.1/guicast/bcwindowdraw.C +++ b/cinelerra-5.1/guicast/bcwindowdraw.C @@ -216,7 +216,7 @@ void BC_WindowBase::draw_utf8_text(int x, int y, } } -void BC_WindowBase::draw_xft_text(int x, int y, +void BC_WindowBase::draw_xft_text(int x, int y, const char *text, int length, BC_Pixmap *pixmap, int is_utf8) { int l = length + 1; @@ -246,39 +246,42 @@ void BC_WindowBase::draw_xft_text(int x, int y, } } -int BC_WindowBase::wcharpos(const wchar_t *text, XftFont *font, int length, - int *charpos) +void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font, + int x, int y, const FcChar32 *fc, int len, BC_Pixmap *pixmap) { - XGlyphInfo extents; - - if(charpos) - { - int bpos = charpos[-1]; - - for(int i = 0; i < length; i++) - { - XftTextExtents32(top_level->display, - font, - (const FcChar32*)text, - i + 1, - &extents); - charpos[i] = extents.xOff + bpos; - } - return charpos[length - 1] - bpos; - } - else - { - XftTextExtents32(top_level->display, - font, - (const FcChar32*)text, - length, - &extents); - return extents.xOff; + Pixmap draw_pixmap = 0; + XftDraw *xft_draw = (XftDraw *) + (pixmap ? pixmap->opaque_xft_draw : this->pixmap->opaque_xft_draw); + int src_x = x, src_y = y, src_w = 0, src_h = 0; + XGCValues values; + XGetGCValues(top_level->display, top_level->gc, GCFunction, &values); + if( values.function != GXcopy ) { + XSetFunction(top_level->display, top_level->gc, GXcopy); + XGlyphInfo info; + XftTextExtents32(top_level->display, xft_font, fc, len, &info); + src_w = info.width; src_h = info.height; + draw_pixmap = XCreatePixmap(top_level->display, top_level->win, + src_w, src_h, top_level->default_depth); + int color = get_color(); set_color(0); + XFillRectangle(top_level->display, draw_pixmap, top_level->gc, 0, 0, src_w, src_h); + set_color(color); + xft_draw = XftDrawCreate(top_level->display, draw_pixmap, + top_level->vis, top_level->cmap); + src_x = info.x; src_y = info.y; + } + XftDrawString32(xft_draw, xft_color, xft_font, src_x, src_y, fc, len); + if( values.function != GXcopy ) { + XSetFunction(top_level->display, top_level->gc, values.function); + Pixmap xpixmap = pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap; + XCopyArea(top_level->display, draw_pixmap, xpixmap, + top_level->gc, 0, 0, src_w, src_h, x, y); + XFreePixmap(top_level->display, draw_pixmap); + XftDrawDestroy(xft_draw); } } void BC_WindowBase::draw_wtext(int x, int y, - const wchar_t *text, int length, BC_Pixmap *pixmap, int *charpos) + const wchar_t *text, int length, BC_Pixmap *pixmap) { if( !get_resources()->use_xft ) { if( !get_font_struct(current_font) ) return; @@ -295,15 +298,13 @@ void BC_WindowBase::draw_wtext(int x, int y, XRenderColor color; XftColor xft_color; const wchar_t *up, *ubp; - int l, *cp; + int l; FcPattern *newpat; XftFont *curfont, *nextfont, *altfont, *basefont; if(length < 0) length = wcslen(text); - if(charpos) - charpos[0] = 0; if(!length) return; @@ -325,7 +326,6 @@ void BC_WindowBase::draw_wtext(int x, int y, curfont = nextfont = basefont; altfont = 0; - cp = 0; ubp = text; for(up = text; up < &text[length]; up++) @@ -360,18 +360,14 @@ void BC_WindowBase::draw_wtext(int x, int y, if(nextfont != curfont) { l = up - ubp; - XftDrawString32((XftDraw*)(pixmap ? pixmap->opaque_xft_draw : this->pixmap->opaque_xft_draw), - &xft_color, - curfont, - x, - y, - (const FcChar32*)ubp, - l); + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, l, pixmap); - if(charpos) - cp = &charpos[ubp - text + 1]; + XGlyphInfo extents; + XftTextExtents32(top_level->display, curfont, + (const FcChar32*)ubp, l, &extents); + x += extents.xOff; - x += wcharpos(ubp, curfont, l, cp); ubp = up; curfont = nextfont; } @@ -379,15 +375,8 @@ void BC_WindowBase::draw_wtext(int x, int y, if(up > ubp) { - XftDrawString32((XftDraw*)(pixmap ? pixmap->opaque_xft_draw : this->pixmap->opaque_xft_draw), - &xft_color, - curfont, - x, - y, - (const FcChar32*)ubp, - up - ubp); - if(charpos) - wcharpos(ubp, curfont, up - ubp, &charpos[ubp - text + 1]); + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, up - ubp, pixmap); } if(altfont) @@ -1093,9 +1082,11 @@ void BC_WindowBase::draw_vframe(VFrame *frame, pixmap); } -void BC_WindowBase::draw_tooltip() +void BC_WindowBase::draw_tooltip(const char *text) { - if(tooltip_popup && tooltip_text) + if( !text ) + text = tooltip_text; + if(tooltip_popup && text) { int w = tooltip_popup->get_w(), h = tooltip_popup->get_h(); tooltip_popup->set_color(get_resources()->tooltip_bg_color); @@ -1105,7 +1096,7 @@ void BC_WindowBase::draw_tooltip() tooltip_popup->set_font(MEDIUMFONT); tooltip_popup->draw_text(TOOLTIP_MARGIN, get_text_ascent(MEDIUMFONT) + TOOLTIP_MARGIN, - tooltip_text); + text); } }