On Fri, 15 Apr 2005, Tomasz Motylewski wrote:

> Could you quantify this "considerably"?
>
> I am interested in doing the same for gerbv which also suffers from this
> problem under windows.

About 2-3x in my case, but maybe more as I haven't benchmarked it.
Sample code attached.

My guess is that it takes forever for either the gdk->GDI translation
layer or GDI layer itself to switch graphics contexts and by combining
draws you're using the same GDI ROP (or whatever it's called).

-t
/******************************************************************/

/*
 * gtk_draw_line() acceleration for win32 by doing draw combining
 */
#if defined __MINGW32__ || defined _MSC_VER

#define WAVE_SEG_BUF_CNT 1024

static int seg_trans_cnt=0, seg_low_cnt=0, seg_high_cnt=0, seg_mid_cnt=0;
static GdkSegment seg_trans[WAVE_SEG_BUF_CNT], seg_low[WAVE_SEG_BUF_CNT], 
seg_high[WAVE_SEG_BUF_CNT], seg_mid[WAVE_SEG_BUF_CNT];


static void wave_gdk_draw_line(GdkDrawable *drawable, GdkGC *gc, gint x1, gint 
y1, gint x2, gint y2)
{
GdkSegment *seg;
int *seg_cnt;

if(gc==gc_trans)        { seg = seg_trans; seg_cnt = &seg_trans_cnt; }
else if(gc==gc_low)     { seg = seg_low; seg_cnt = &seg_low_cnt; }
else if(gc==gc_high)    { seg = seg_high; seg_cnt = &seg_high_cnt; }
else if(gc==gc_mid)     { seg = seg_mid; seg_cnt = &seg_mid_cnt; }
else                    { gdk_draw_line(drawable, gc, x1, y1, x2, y2); return; }

seg[*seg_cnt].x1 = x1;
seg[*seg_cnt].y1 = y1;
seg[*seg_cnt].x2 = x2;
seg[*seg_cnt].y2 = y2;
(*seg_cnt)++;
if(*seg_cnt == WAVE_SEG_BUF_CNT)
        {
        gdk_draw_segments(drawable, gc, seg, *seg_cnt);
        *seg_cnt = 0;
        }
}

static void wave_gdk_draw_line_flush(GdkDrawable *drawable)
{
if(seg_mid)
        {
        gdk_draw_segments(drawable, gc_mid, seg_mid, seg_mid_cnt);
        seg_mid_cnt = 0;
        }

if(seg_high)
        {
        gdk_draw_segments(drawable, gc_high, seg_high, seg_high_cnt);
        seg_high_cnt = 0;
        }

if(seg_low)
        {
        gdk_draw_segments(drawable, gc_low, seg_low, seg_low_cnt);
        seg_low_cnt = 0;
        }

if(seg_trans)
        {
        gdk_draw_segments(drawable, gc_trans, seg_trans, seg_trans_cnt);
        seg_trans_cnt = 0;
        }
}

#else

/* completely unnecessary for linux */

#define wave_gdk_draw_line(a,b,c,d,e,f) gdk_draw_line(a,b,c,d,e,f)
#define wave_gdk_draw_line_flush(x)

#endif

/******************************************************************/

Reply via email to