diff options
author | 2013-11-01 21:54:32 +0100 | |
---|---|---|
committer | 2013-11-01 21:54:32 +0100 | |
commit | 5fbaeafd53c761d0b909ee60997bef60bb129977 (patch) | |
tree | 84c01f098d9c2565527dca749590777bf7aafcb3 /plugins | |
parent | 87a915f831fa97cec0e7c061345c6bd1223decd3 (diff) |
gtkui: optimized scope using vlines
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/gtkui/widgets.c | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c index 4a676c4b..97ff4ab1 100644 --- a/plugins/gtkui/widgets.c +++ b/plugins/gtkui/widgets.c @@ -2329,6 +2329,7 @@ scope_wavedata_listener (void *ctx, ddb_audio_data_t *data) { } } +#if 0 // Bresenham's line drawing from http://rosettacode.org static inline void _draw_line (uint8_t *data, int stride, int x0, int y0, int x1, int y1) { @@ -2345,6 +2346,25 @@ _draw_line (uint8_t *data, int stride, int x0, int y0, int x1, int y1) { if (e2 < dy) { err += dx; y0 += sy; } } } +#endif + +static inline void +_draw_vline (uint8_t *data, int stride, int x0, int y0, int y1) { + if (y0 > y1) { + int tmp = y0; + y0 = y1; + y1 = tmp; + y1--; + } + else if (y0 < y1) { + y0++; + } + while (y0 <= y1) { + uint32_t *ptr = (uint32_t*)&data[y0*stride+x0*4]; + *ptr = 0xffffffff; + y0++; + } +} gboolean scope_draw_cairo (GtkWidget *widget, cairo_t *cr, gpointer user_data) { @@ -2396,7 +2416,7 @@ scope_draw_cairo (GtkWidget *widget, cairo_t *cr, gpointer user_data) { if (y >= a.height) { y = a.height-1; } - _draw_line (data, stride, i-1, prev_y, i, y); + _draw_vline (data, stride, i, prev_y, y); prev_y = y; } cairo_surface_mark_dirty (w->surf); |