[SCM] calf/master: + Framework cache meter background (intermediate commit, before whitespace fix)
js at users.alioth.debian.org
js at users.alioth.debian.org
Tue May 7 15:39:10 UTC 2013
The following commit has been merged in the master branch:
commit f7bf0360db0f7a557d5941496d534a8dcc1fb247
Author: Torben Hohn <torbenh at gmx.de>
Date: Sun Jan 25 12:18:10 2009 +0100
+ Framework cache meter background (intermediate commit, before whitespace fix)
diff --git a/src/calf/custom_ctl.h b/src/calf/custom_ctl.h
index 307e526..cc076c8 100644
--- a/src/calf/custom_ctl.h
+++ b/src/calf/custom_ctl.h
@@ -55,11 +55,12 @@ extern GType calf_line_graph_get_type();
extern void calf_line_graph_set_square(CalfLineGraph *graph, bool is_square);
-#define CALF_TYPE_VUMETER (calf_vumeter_get_type())
-#define CALF_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALF_TYPE_VUMETER, CalfVUMeter))
-#define CALF_IS_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALF_TYPE_VUMETER))
-#define CALF_VUMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALF_TYPE_VUMETER, CalfVUMeterClass))
-#define CALF_IS_VUMETER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALF_TYPE_VUMETER))
+#define CALF_TYPE_VUMETER (calf_vumeter_get_type())
+#define CALF_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CALF_TYPE_VUMETER, CalfVUMeter))
+#define CALF_IS_VUMETER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CALF_TYPE_VUMETER))
+#define CALF_VUMETER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CALF_TYPE_VUMETER, CalfVUMeterClass))
+#define CALF_IS_VUMETER_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), CALF_TYPE_VUMETER))
+#define CALF_VUMETER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CALF_TYPE_VUMETER, CalfVUMeterClass))
enum CalfVUMeterMode
{
@@ -73,6 +74,7 @@ struct CalfVUMeter
GtkDrawingArea parent;
CalfVUMeterMode mode;
float value;
+ cairo_surface_t *cache_surface;
};
struct CalfVUMeterClass
diff --git a/src/custom_ctl.cpp b/src/custom_ctl.cpp
index 6658ad3..87797ff 100644
--- a/src/custom_ctl.cpp
+++ b/src/custom_ctl.cpp
@@ -375,19 +375,26 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
cairo_t *c = gdk_cairo_create(GDK_DRAWABLE(widget->window));
+ if( vu->cache_surface == NULL ) {
+ // looks like its either first call or the widget has been resized.
+ // create the cache_surface.
+ cairo_surface_t *window_surface = cairo_get_target( c );
+ vu->cache_surface = cairo_surface_create_similar( window_surface,
+ CAIRO_CONTENT_COLOR,
+ widget->allocation.width,
+ widget->allocation.height );
+ cairo_t *cache_cr = cairo_create( vu->cache_surface );
GdkColor sc = { 0, 0, 0, 0 };
- gdk_cairo_set_source_color(c, &sc);
- cairo_rectangle(c, ox, oy, sx, sy);
- cairo_fill(c);
- cairo_set_line_width(c, 1);
-
- CalfVUMeterMode mode = vu->mode;
+ gdk_cairo_set_source_color(cache_cr, &sc);
+ cairo_rectangle(cache_cr, ox, oy, sx, sy);
+ cairo_fill(cache_cr);
+ cairo_set_line_width(cache_cr, 1);
for (int x = ox; x <= ox + sx; x += 3)
{
float ts = (x - ox) * 1.0 / sx;
float r = 0.f, g = 0.f, b = 0.f;
- switch(mode)
+ switch(vu->mode)
{
case VU_STANDARD:
default:
@@ -395,29 +402,44 @@ calf_vumeter_expose (GtkWidget *widget, GdkEventExpose *event)
r = ts / 0.75, g = 1, b = 0;
else
r = 1, g = 1 - (ts - 0.75) / 0.25, b = 0;
- if (vu->value < ts || vu->value <= 0)
- r *= 0.5, g *= 0.5, b *= 0.5;
+// if (vu->value < ts || vu->value <= 0)
+// r *= 0.5, g *= 0.5, b *= 0.5;
break;
case VU_MONOCHROME_REVERSE:
r = 1, g = 1, b = 0;
- if (!(vu->value < ts) || vu->value >= 1.0)
- r *= 0.5, g *= 0.5, b *= 0.5;
+// if (!(vu->value < ts) || vu->value >= 1.0)
+// r *= 0.5, g *= 0.5, b *= 0.5;
break;
case VU_MONOCHROME:
r = 1, g = 1, b = 0;
- if (vu->value < ts || vu->value <= 0)
- r *= 0.5, g *= 0.5, b *= 0.5;
+// if (vu->value < ts || vu->value <= 0)
+// r *= 0.5, g *= 0.5, b *= 0.5;
break;
}
GdkColor sc2 = { 0, (guint16)(65535 * r), (guint16)(65535 * g), (guint16)(65535 * b) };
- gdk_cairo_set_source_color(c, &sc2);
- cairo_move_to(c, x, oy);
- cairo_line_to(c, x, oy + sy + 1);
- cairo_move_to(c, x, oy + sy);
- cairo_line_to(c, x, oy );
- cairo_stroke(c);
+ gdk_cairo_set_source_color(cache_cr, &sc2);
+ cairo_move_to(cache_cr, x, oy);
+ cairo_line_to(cache_cr, x, oy + sy + 1);
+ cairo_move_to(cache_cr, x, oy + sy);
+ cairo_line_to(cache_cr, x, oy );
+ cairo_stroke(cache_cr);
+ }
+ cairo_destroy( cache_cr );
}
+ cairo_set_source_surface( c, vu->cache_surface, 0,0 );
+ cairo_paint( c );
+ cairo_set_source_rgba( c, 0,0,0, 0.5 );
+
+ if( vu->mode == VU_MONOCHROME_REVERSE )
+ cairo_rectangle( c, vu->value * (sx-ox),oy, sx-ox, sy-oy );
+ else
+ cairo_rectangle( c, ox,oy, vu->value * (sx-ox), sy-oy );
+
+ cairo_fill( c );
+
+
+
cairo_destroy(c);
gtk_paint_shadow(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_IN, NULL, widget, NULL, ox - 1, oy - 1, sx + 2, sy + 2);
@@ -441,8 +463,15 @@ calf_vumeter_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
g_assert(CALF_IS_VUMETER(widget));
+ CalfVUMeter *vu = CALF_VUMETER(widget);
- widget->allocation = *allocation;
+ GtkWidgetClass *parent_class = (GtkWidgetClass *) g_type_class_peek_parent( CALF_VUMETER_GET_CLASS( vu ) );
+
+ parent_class->size_allocate( widget, allocation );
+
+ if( vu->cache_surface )
+ cairo_surface_destroy( vu->cache_surface );
+ vu->cache_surface = NULL;
}
static void
@@ -451,7 +480,7 @@ calf_vumeter_class_init (CalfVUMeterClass *klass)
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
widget_class->expose_event = calf_vumeter_expose;
widget_class->size_request = calf_vumeter_size_request;
- //widget_class->size_allocate = calf_vumeter_size_allocate;
+ widget_class->size_allocate = calf_vumeter_size_allocate;
}
static void
@@ -462,6 +491,7 @@ calf_vumeter_init (CalfVUMeter *self)
widget->requisition.width = 50;
widget->requisition.height = 15;
self->value = 0.5;
+ self->cache_surface = NULL;
}
GtkWidget *
--
calf audio plugins packaging
More information about the pkg-multimedia-commits
mailing list