X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fguicast%2Fbcwindowdraw.C;h=c81c36963223fa2b91e6ef3faeaaeff3ba71386e;hb=a19a685a46ddc630010788707d9e5b9d2342af46;hp=c5d904ea2b1b58f6c2afadcf7498d09bc9c10d4e;hpb=faf9f1da60357505e88f5be80c0256a64bf2d650;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/guicast/bcwindowdraw.C b/cinelerra-5.1/guicast/bcwindowdraw.C index c5d904ea..c81c3696 100644 --- a/cinelerra-5.1/guicast/bcwindowdraw.C +++ b/cinelerra-5.1/guicast/bcwindowdraw.C @@ -28,16 +28,18 @@ #include "bctimer.h" #include "bcwindowbase.h" #include "clip.h" -#include "colors.h" +#include "bccolors.h" +#include "bctrace.h" #include "cursors.h" #include "fonts.h" #include "vframe.h" #include #include #include +#include "workarounds.h" void BC_WindowBase::copy_area(int x1, int y1, int x2, int y2, int w, int h, BC_Pixmap *pixmap) -{ +{ BT XCopyArea(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, @@ -46,7 +48,7 @@ void BC_WindowBase::copy_area(int x1, int y1, int x2, int y2, int w, int h, BC_P void BC_WindowBase::draw_box(int x, int y, int w, int h, BC_Pixmap *pixmap) -{ +{ BT //if(x == 0) printf("BC_WindowBase::draw_box %d %d %d %d\n", x, y, w, h); XFillRectangle(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, @@ -55,7 +57,7 @@ void BC_WindowBase::draw_box(int x, int y, int w, int h, BC_Pixmap *pixmap) void BC_WindowBase::draw_circle(int x, int y, int w, int h, BC_Pixmap *pixmap) -{ +{ BT XDrawArc(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, top_level->gc, x, y, (w - 1), (h - 2), 0 * 64, 360 * 64); @@ -63,7 +65,7 @@ void BC_WindowBase::draw_circle(int x, int y, int w, int h, BC_Pixmap *pixmap) void BC_WindowBase::draw_arc(int x, int y, int w, int h, int start_angle, int angle_length, BC_Pixmap *pixmap) -{ +{ BT XDrawArc(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, top_level->gc, x, y, (w - 1), (h - 2), start_angle * 64, @@ -71,14 +73,14 @@ void BC_WindowBase::draw_arc(int x, int y, int w, int h, } void BC_WindowBase::draw_disc(int x, int y, int w, int h, BC_Pixmap *pixmap) -{ +{ BT XFillArc(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, top_level->gc, x, y, (w - 1), (h - 2), 0 * 64, 360 * 64); } void BC_WindowBase::clear_box(int x, int y, int w, int h, BC_Pixmap *pixmap) -{ +{ BT set_color(bg_color); Pixmap xpixmap = pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap; XFillRectangle(top_level->display, xpixmap, top_level->gc, x, y, w, h); @@ -93,6 +95,7 @@ void BC_WindowBase::draw_text_line(int x, int y, const char *text, int len, return; } #endif + BT Pixmap xpixmap = pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap; if( get_resources()->use_fontset ) { XFontSet fontset = top_level->get_curr_fontset(); @@ -146,7 +149,7 @@ void BC_WindowBase::draw_text(int x, int y, const char *text, int length, draw_xft_text(x, y, text, length, pixmap); return; } - + BT for(int i = 0, j = 0; i <= length; i++) { if(text[i] == '\n' || text[i] == 0) { if(get_resources()->use_fontset && top_level->get_curr_fontset()) { @@ -183,7 +186,7 @@ void BC_WindowBase::draw_utf8_text(int x, int y, 1); return; } - + BT for(int i = 0, j = 0; i <= length; i++) { if(text[i] == '\n' || text[i] == 0) @@ -232,15 +235,16 @@ void BC_WindowBase::draw_xft_text(int x, int y, { int dy = -1; const wchar_t *wsp = text, *wep = wsp + length; + int font = top_level->current_font; while( wsp < wep ) { const wchar_t *wcp = wsp; while( wcp < wep && *wcp != '\n' ) ++wcp; int len = wcp - wsp; if( len > 0 ) - draw_wtext(x, y, wsp, len, pixmap); + draw_single_text(1, font, x, y, wsp, len, pixmap); if( wcp >= wep ) break; if( dy < 0 ) - dy = get_text_height(top_level->current_font); + dy = get_text_height(font); y += dy; wsp = wcp + 1; } @@ -248,7 +252,7 @@ void BC_WindowBase::draw_xft_text(int x, int y, void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font, int x, int y, const FcChar32 *fc, int len, BC_Pixmap *pixmap) -{ +{ BT Pixmap draw_pixmap = 0; XftDraw *xft_draw = (XftDraw *) (pixmap ? pixmap->opaque_xft_draw : this->pixmap->opaque_xft_draw); @@ -258,146 +262,86 @@ void BC_WindowBase::xft_draw_string(XftColor *xft_color, XftFont *xft_font, if( values.function != GXcopy ) { XSetFunction(top_level->display, top_level->gc, GXcopy); XGlyphInfo info; - XftTextExtents32(top_level->display, xft_font, fc, len, &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, + 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); + 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); + xftDrawDestroy(xft_draw); } } int BC_WindowBase::get_single_text_width(int font, const wchar_t *text, int length) { - if( length < 0 ) - length = wcslen(text); - if( !length ) return 0; - - if( !get_resources()->use_xft ) { - if( !get_font_struct(font) ) return 0; - XChar2b xtext[length], *xp = xtext; - for( int i=0; ibyte1 = (unsigned char) (text[i] >> 8); - xp->byte2 = (unsigned char) (text[i] & 0xff); - } - return XTextWidth16(get_font_struct(font), xtext, length); - } - int x = 0; -#ifdef HAVE_XFT - XftFont *basefont = top_level->get_xft_struct(font); - XftFont *curfont = 0, *altfont = 0; - const wchar_t *up = text, *ubp = up, *uep = ubp + length; - - while( up < uep ) { - XftFont *xft_font = 0; - if( XftCharExists(top_level->display, basefont, *up) ) - xft_font = basefont; - else if( altfont ) { - if( XftCharExists(top_level->display, altfont, *up)) - xft_font = altfont; - else { - XftFontClose(top_level->display, altfont); - altfont = 0; - } - } - if( !xft_font ) { - FcPattern *pattern = BC_Resources::find_similar_font(*up, basefont->pattern); - if( pattern != 0 ) { - double psize = 0; - FcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize); - FcPatternDel(pattern, FC_SCALABLE); - xft_font = altfont = XftFontOpenPattern(top_level->display, pattern); - } - } - if( !xft_font ) - xft_font = basefont; - if( xft_font != curfont ) { - if( curfont && up > ubp ) { - XGlyphInfo extents; - XftTextExtents32(top_level->display, curfont, - (const FcChar32*)ubp, up-ubp, &extents); - x += extents.xOff; - } - ubp = up; curfont = xft_font; - } - ++up; - } - - if( curfont && up > ubp ) { - XGlyphInfo extents; - XftTextExtents32(top_level->display, curfont, - (const FcChar32*)ubp, up-ubp, &extents); - x += extents.xOff; - } - - if( altfont ) - XftFontClose(top_level->display, altfont); -#endif - return x; + return draw_single_text(0, font, 0,0, text, length); } -void BC_WindowBase::draw_wtext(int x, int y, - const wchar_t *text, int length, BC_Pixmap *pixmap) +int BC_WindowBase::draw_single_text(int draw, int font, + int x, int y, const wchar_t *text, int length, BC_Pixmap *pixmap) { if( length < 0 ) length = wcslen(text); - if( !length ) return; + if( !length ) return 0; - int font = top_level->current_font; if( !get_resources()->use_xft ) { - if( !get_font_struct(font) ) return; + BT + if( !get_font_struct(font) ) return 0; XChar2b xtext[length], *xp = xtext; for( int i=0; ibyte1 = (unsigned char) (text[i] >> 8); xp->byte2 = (unsigned char) (text[i] & 0xff); } - XDrawString16(top_level->display, - pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, - top_level->gc, x, y, xtext, length); - return; + if( draw ) { + XDrawString16(top_level->display, + pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, + top_level->gc, x, y, xtext, length); + } + return XTextWidth16(get_font_struct(font), xtext, length); } #ifdef HAVE_XFT - XRenderColor color; - color.red = (top_level->current_color & 0xff0000) >> 16; - color.red |= color.red << 8; - color.green = (top_level->current_color & 0xff00) >> 8; - color.green |= color.green << 8; - color.blue = (top_level->current_color & 0xff); - color.blue |= color.blue << 8; - color.alpha = 0xffff; - XftColor xft_color; - XftColorAllocValue(top_level->display, top_level->vis, top_level->cmap, - &color, &xft_color); + if( draw ) { + XRenderColor color; + color.red = (top_level->current_color & 0xff0000) >> 16; + color.red |= color.red << 8; + color.green = (top_level->current_color & 0xff00) >> 8; + color.green |= color.green << 8; + color.blue = (top_level->current_color & 0xff); + color.blue |= color.blue << 8; + color.alpha = 0xffff; + + xftColorAllocValue(top_level->display, top_level->vis, top_level->cmap, + &color, &xft_color); + } + int x0 = x; XftFont *basefont = top_level->get_xft_struct(font); XftFont *curfont = 0, *altfont = 0; const wchar_t *up = text, *ubp = up, *uep = ubp + length; while( up < uep ) { XftFont *xft_font = 0; - if( XftCharExists(top_level->display, basefont, *up) ) + if( xftCharExists(top_level->display, basefont, *up) ) xft_font = basefont; else if( altfont ) { - if( XftCharExists(top_level->display, altfont, *up)) + if( xftCharExists(top_level->display, altfont, *up)) xft_font = altfont; else { - XftFontClose(top_level->display, altfont); + xftFontClose(top_level->display, altfont); altfont = 0; } } @@ -405,20 +349,22 @@ void BC_WindowBase::draw_wtext(int x, int y, FcPattern *pattern = BC_Resources::find_similar_font(*up, basefont->pattern); if( pattern != 0 ) { double psize = 0; - FcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize); - FcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize); - FcPatternDel(pattern, FC_SCALABLE); - xft_font = altfont = XftFontOpenPattern(top_level->display, pattern); + fcPatternGetDouble(basefont->pattern, FC_PIXEL_SIZE, 0, &psize); + fcPatternAddDouble(pattern, FC_PIXEL_SIZE, psize); + fcPatternDel(pattern, FC_SCALABLE); + xft_font = altfont = xftFontOpenPattern(top_level->display, pattern); } } if( !xft_font ) xft_font = basefont; if( xft_font != curfont ) { if( curfont && up > ubp ) { - xft_draw_string(&xft_color, curfont, x, y, - (const FcChar32*)ubp, up-ubp, pixmap); + if( draw ) { + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, up-ubp, pixmap); + } XGlyphInfo extents; - XftTextExtents32(top_level->display, curfont, + xftTextExtents32(top_level->display, curfont, (const FcChar32*)ubp, up-ubp, &extents); x += extents.xOff; } @@ -428,15 +374,22 @@ void BC_WindowBase::draw_wtext(int x, int y, } if( curfont && up > ubp ) { - xft_draw_string(&xft_color, curfont, x, y, - (const FcChar32*)ubp, up-ubp, pixmap); + if( draw ) { + xft_draw_string(&xft_color, curfont, x, y, + (const FcChar32*)ubp, up-ubp, pixmap); + } + XGlyphInfo extents; + xftTextExtents32(top_level->display, curfont, + (const FcChar32*)ubp, up-ubp, &extents); + x += extents.xOff; } if( altfont ) - XftFontClose(top_level->display, altfont); + xftFontClose(top_level->display, altfont); - XftColorFree(top_level->display, top_level->vis, top_level->cmap, &xft_color); + xftColorFree(top_level->display, top_level->vis, top_level->cmap, &xft_color); #endif + return x - x0; } void BC_WindowBase::truncate_text(char *result, const char *text, int w) @@ -487,7 +440,7 @@ void BC_WindowBase::draw_center_text(int x, int y, const char *text, int length) } void BC_WindowBase::draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap) -{ +{ BT // Some X drivers can't draw 0 length lines if(x1 == x2 && y1 == y2) { @@ -506,7 +459,7 @@ void BC_WindowBase::draw_line(int x1, int y1, int x2, int y2, BC_Pixmap *pixmap) } void BC_WindowBase::draw_polygon(ArrayList *x, ArrayList *y, BC_Pixmap *pixmap) -{ +{ BT int npoints = MIN(x->total, y->total); XPoint *points = new XPoint[npoints]; @@ -527,7 +480,7 @@ void BC_WindowBase::draw_polygon(ArrayList *x, ArrayList *y, BC_Pixmap } void BC_WindowBase::fill_polygon(ArrayList *x, ArrayList *y, BC_Pixmap *pixmap) -{ +{ BT int npoints = MIN(x->total, y->total); XPoint *points = new XPoint[npoints]; @@ -550,7 +503,7 @@ void BC_WindowBase::fill_polygon(ArrayList *x, ArrayList *y, BC_Pixmap void BC_WindowBase::draw_rectangle(int x, int y, int w, int h) -{ +{ BT XDrawRectangle(top_level->display, pixmap->opaque_pixmap, top_level->gc, @@ -718,7 +671,7 @@ void BC_WindowBase::draw_border(char *text, int x, int y, int w, int h) } void BC_WindowBase::draw_triangle_down_flat(int x, int y, int w, int h) -{ +{ BT int x1, y1, x2, y2, x3; XPoint point[3]; @@ -739,7 +692,7 @@ void BC_WindowBase::draw_triangle_down_flat(int x, int y, int w, int h) void BC_WindowBase::draw_triangle_up(int x, int y, int w, int h, int light1, int light2, int middle, int shadow1, int shadow2) -{ +{ BT int x1, y1, x2, y2, x3; XPoint point[3]; @@ -812,7 +765,7 @@ void BC_WindowBase::draw_triangle_down(int x, int y, int w, int h, void BC_WindowBase::draw_triangle_left(int x, int y, int w, int h, int light1, int light2, int middle, int shadow1, int shadow2) -{ +{ BT int x1, y1, x2, y2, y3; XPoint point[3]; @@ -849,7 +802,7 @@ void BC_WindowBase::draw_triangle_left(int x, int y, int w, int h, void BC_WindowBase::draw_triangle_right(int x, int y, int w, int h, int light1, int light2, int middle, int shadow1, int shadow2) -{ +{ BT int x1, y1, x2, y2, y3; XPoint point[3]; @@ -897,7 +850,7 @@ void BC_WindowBase::draw_check(int x, int y) } void BC_WindowBase::draw_tiles(BC_Pixmap *tile, int origin_x, int origin_y, int x, int y, int w, int h) -{ +{ BT if(!tile) { set_color(bg_color); @@ -915,7 +868,7 @@ void BC_WindowBase::draw_tiles(BC_Pixmap *tile, int origin_x, int origin_y, int } void BC_WindowBase::draw_top_tiles(BC_WindowBase *parent_window, int x, int y, int w, int h) -{ +{ BT Window tempwin; int origin_x, origin_y; XTranslateCoordinates(top_level->display, @@ -942,7 +895,7 @@ void BC_WindowBase::draw_top_background(BC_WindowBase *parent_window, int w, int h, BC_Pixmap *pixmap) -{ +{ BT Window tempwin; int top_x, top_y; XLockDisplay(top_level->display); @@ -993,12 +946,11 @@ void BC_WindowBase::draw_bitmap(BC_Bitmap *bitmap, int src_w, int src_h, BC_Pixmap *pixmap) -{ - +{ BT // Hide cursor if video enabled update_video_cursor(); -//printf("BC_WindowBase::draw_bitmap 1\n"); +//printf("BC_WindowBase::draw_bitmap %d dest_y=%d\n", __LINE__, dest_y); if(dest_w <= 0 || dest_h <= 0) { // Use hardware scaling to canvas dimensions if proper color model. @@ -1052,7 +1004,7 @@ void BC_WindowBase::draw_bitmap(BC_Bitmap *bitmap, void BC_WindowBase::draw_pixel(int x, int y, BC_Pixmap *pixmap) -{ +{ BT XDrawPoint(top_level->display, pixmap ? pixmap->opaque_pixmap : this->pixmap->opaque_pixmap, top_level->gc, @@ -1069,7 +1021,7 @@ void BC_WindowBase::draw_pixmap(BC_Pixmap *pixmap, int src_x, int src_y, BC_Pixmap *dst) -{ +{ BT pixmap->write_drawable(dst ? dst->opaque_pixmap : this->pixmap->opaque_pixmap, dest_x, dest_y, @@ -1152,7 +1104,7 @@ void BC_WindowBase::draw_tooltip(const char *text) } void BC_WindowBase::slide_left(int distance) -{ +{ BT if(distance < w) { XCopyArea(top_level->display, @@ -1169,7 +1121,7 @@ void BC_WindowBase::slide_left(int distance) } void BC_WindowBase::slide_right(int distance) -{ +{ BT if(distance < w) { XCopyArea(top_level->display, @@ -1186,7 +1138,7 @@ void BC_WindowBase::slide_right(int distance) } void BC_WindowBase::slide_up(int distance) -{ +{ BT if(distance < h) { XCopyArea(top_level->display, @@ -1211,7 +1163,7 @@ void BC_WindowBase::slide_up(int distance) } void BC_WindowBase::slide_down(int distance) -{ +{ BT if(distance < h) { XCopyArea(top_level->display,