asset menu size fixups, new picons+prefs, more timecode del, stretch scrollbars,...
[goodguy/history.git] / cinelerra-5.1 / guicast / bcwindowdraw.C
index 635679ea43a7670e607bd0fddedbd069ea0408c9..61865c50e19a576702f1d0b11bb536c7e7e2f697 100644 (file)
@@ -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);
        }
 }