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
/******************************************************************/