summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2012-12-01 14:31:16 +0100
committerGravatar waker <wakeroid@gmail.com>2012-12-01 14:31:16 +0100
commite496e7aac44ab305de2ca418eddd1ddb130a95fa (patch)
tree22d98ea6f7187b34b3682e7ed99c455c596fe353
parented02eed49a291a314840802987c6c147adf6b4d4 (diff)
gtkui: drawing spectrum and scope using cairo
-rw-r--r--plugins/gtkui/widgets.c71
1 files changed, 63 insertions, 8 deletions
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c
index 0f53f445..e84ca90b 100644
--- a/plugins/gtkui/widgets.c
+++ b/plugins/gtkui/widgets.c
@@ -30,7 +30,10 @@
#include "parser.h"
#include "trkproperties.h"
#include "coverart.h"
+#undef USE_OPENGL
+#if USE_OPENGL
#include "gtkuigl.h"
+#endif
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
@@ -94,14 +97,18 @@ typedef struct {
ddb_gtkui_widget_t base;
GtkWidget *drawarea;
guint drawtimer;
+#if USE_OPENGL
GdkGLContext *glcontext;
+#endif
} w_scope_t;
typedef struct {
ddb_gtkui_widget_t base;
GtkWidget *drawarea;
guint drawtimer;
+#if USE_OPENGL
GdkGLContext *glcontext;
+#endif
} w_spectrum_t;
typedef struct {
@@ -1916,10 +1923,12 @@ w_scope_destroy (ddb_gtkui_widget_t *w) {
g_source_remove (s->drawtimer);
s->drawtimer = 0;
}
+#if USE_OPENGL
if (s->glcontext) {
gdk_gl_context_destroy (s->glcontext);
s->glcontext = NULL;
}
+#endif
}
gboolean
@@ -1934,17 +1943,20 @@ scope_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) {
ddb_waveformat_t fmt;
float data[DDB_AUDIO_MEMORY_FRAMES];
deadbeef->audio_get_waveform_data (DDB_AUDIO_WAVEFORM, data);
+ GtkAllocation a;
+ gtk_widget_get_allocation (widget, &a);
cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, a.width, a.height);
+ cairo_fill (cr);
cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
cairo_set_line_width (cr, 1);
- GtkAllocation a;
- gtk_widget_get_allocation (widget, &a);
+ cairo_set_source_rgb (cr, 1, 1, 1);
- float incr = (float)DDB_AUDIO_MEMORY_FRAMES / a.width;
+ float incr = a.width / (float)DDB_AUDIO_MEMORY_FRAMES;
float pos = 0;
- for (int x = 0; x < a.width; x++, pos += incr) {
+ for (float x = 0; x < a.width && pos < DDB_AUDIO_MEMORY_FRAMES; x += incr, pos ++) {
float s = data[(int)pos];
- cairo_line_to (cr, x, s * a.height/2 / 0x7fff + a.height/2);
+ cairo_line_to (cr, x, s * a.height/2 + a.height/2);
}
cairo_stroke (cr);
@@ -1953,6 +1965,7 @@ scope_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) {
gboolean
scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data) {
+#if USE_OPENGL
w_scope_t *w = user_data;
float data[DDB_AUDIO_MEMORY_FRAMES];
deadbeef->audio_get_waveform_data (DDB_AUDIO_WAVEFORM, data);
@@ -2009,12 +2022,12 @@ scope_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data
gdk_gl_drawable_gl_end (d);
- return FALSE;
-
+#else
cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget));
gboolean res = scope_draw (widget, cr, user_data);
cairo_destroy (cr);
- return res;
+#endif
+ return FALSE;
}
void
@@ -2024,15 +2037,21 @@ w_scope_init (ddb_gtkui_widget_t *w) {
g_source_remove (s->drawtimer);
s->drawtimer = 0;
}
+#if USE_OPENGL
if (!gtkui_gl_init ()) {
s->drawtimer = g_timeout_add (33, w_scope_draw_cb, w);
}
+#else
+ s->drawtimer = g_timeout_add (33, w_scope_draw_cb, w);
+#endif
}
void
scope_realize (GtkWidget *widget, gpointer data) {
w_scope_t *w = data;
+#if USE_OPENGL
w->glcontext = gtk_widget_create_gl_context (w->drawarea, NULL, TRUE, GDK_GL_RGBA_TYPE);
+#endif
}
ddb_gtkui_widget_t *
@@ -2044,10 +2063,12 @@ w_scope_create (void) {
w->base.init = w_scope_init;
w->base.destroy = w_scope_destroy;
w->drawarea = gtk_drawing_area_new ();
+#if USE_OPENGL
int attrlist[] = {GDK_GL_ATTRIB_LIST_NONE};
GdkGLConfig *conf = gdk_gl_config_new_by_mode ((GdkGLConfigMode)(GDK_GL_MODE_RGB |
GDK_GL_MODE_DOUBLE));
gboolean cap = gtk_widget_set_gl_capability (w->drawarea, conf, NULL, TRUE, GDK_GL_RGBA_TYPE);
+#endif
gtk_widget_show (w->drawarea);
gtk_container_add (GTK_CONTAINER (w->base.widget), w->drawarea);
#if !GTK_CHECK_VERSION(3,0,0)
@@ -2068,10 +2089,12 @@ w_spectrum_destroy (ddb_gtkui_widget_t *w) {
g_source_remove (s->drawtimer);
s->drawtimer = 0;
}
+#if USE_OPENGL
if (s->glcontext) {
gdk_gl_context_destroy (s->glcontext);
s->glcontext = NULL;
}
+#endif
}
gboolean
@@ -2162,6 +2185,7 @@ spectrum_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d
}
}
+#if USE_OPENGL
GdkGLDrawable *d = gtk_widget_get_gl_drawable (widget);
gdk_gl_drawable_gl_begin (d, w->glcontext);
@@ -2197,6 +2221,29 @@ spectrum_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d
gdk_gl_drawable_swap_buffers (d);
gdk_gl_drawable_gl_end (d);
+#else
+ cairo_t *cr = gdk_cairo_create (gtk_widget_get_window (widget));
+ float base_s = (height / 40.f);
+
+ cairo_set_source_rgb (cr, 0, 0, 0);
+ cairo_rectangle (cr, 0, 0, a.width, a.height);
+ cairo_fill (cr);
+
+ for (gint i = 0; i <= bands; i++)
+ {
+ gint x = ((width / bands) * i) + 2;
+ int y = a.height - bars[i] * base_s;
+ cairo_set_source_rgb (cr, 0, 0.5, 1);
+ cairo_rectangle (cr, x+1, y, (width / bands) - 1, a.height);
+ cairo_fill (cr);
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ y = a.height - peaks[i] * base_s;
+ cairo_rectangle (cr, x + 1, y, (width / bands) - 1, 1);
+ cairo_fill (cr);
+ }
+
+ cairo_destroy (cr);
+#endif
return FALSE;
}
@@ -2204,6 +2251,7 @@ spectrum_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_d
void
w_spectrum_init (ddb_gtkui_widget_t *w) {
w_spectrum_t *s = (w_spectrum_t *)w;
+#if USE_OPENGL
gtkui_gl_init ();
if (s->drawtimer) {
g_source_remove (s->drawtimer);
@@ -2212,12 +2260,17 @@ w_spectrum_init (ddb_gtkui_widget_t *w) {
if (!gtkui_gl_init ()) {
s->drawtimer = g_timeout_add (33, w_spectrum_draw_cb, w);
}
+#else
+ s->drawtimer = g_timeout_add (33, w_spectrum_draw_cb, w);
+#endif
}
void
spectrum_realize (GtkWidget *widget, gpointer data) {
w_spectrum_t *w = data;
+#if USE_OPENGL
w->glcontext = gtk_widget_create_gl_context (w->drawarea, NULL, TRUE, GDK_GL_RGBA_TYPE);
+#endif
}
ddb_gtkui_widget_t *
@@ -2229,10 +2282,12 @@ w_spectrum_create (void) {
w->base.init = w_spectrum_init;
w->base.destroy = w_spectrum_destroy;
w->drawarea = gtk_drawing_area_new ();
+#if USE_OPENGL
int attrlist[] = {GDK_GL_ATTRIB_LIST_NONE};
GdkGLConfig *conf = gdk_gl_config_new_by_mode ((GdkGLConfigMode)(GDK_GL_MODE_RGB |
GDK_GL_MODE_DOUBLE));
gboolean cap = gtk_widget_set_gl_capability (w->drawarea, conf, NULL, TRUE, GDK_GL_RGBA_TYPE);
+#endif
gtk_widget_show (w->drawarea);
gtk_container_add (GTK_CONTAINER (w->base.widget), w->drawarea);
#if !GTK_CHECK_VERSION(3,0,0)