summaryrefslogtreecommitdiff
path: root/libs/canvas/canvas.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-11-10 10:35:10 -0500
committerPaul Davis <paul@linuxaudiosystems.com>2014-11-10 10:43:25 -0500
commitef56948d4acaa55f76ca6bde3eba3faec168ffdb (patch)
treebf552749aed1f01228eb591b51bb054fe8972693 /libs/canvas/canvas.cc
parent9cf5b23392e076eb1a0e48eb372a8f6b2f2080aa (diff)
add background color property to Canvas::Canvas ; rearrange expose handling and include background fill
Conflicts: libs/canvas/canvas.cc libs/canvas/canvas/canvas.h
Diffstat (limited to 'libs/canvas/canvas.cc')
-rw-r--r--libs/canvas/canvas.cc78
1 files changed, 40 insertions, 38 deletions
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc
index 85c87a39f0..975dcf84ef 100644
--- a/libs/canvas/canvas.cc
+++ b/libs/canvas/canvas.cc
@@ -35,6 +35,7 @@
#include "canvas/debug.h"
#include "canvas/line.h"
#include "canvas/scroll_group.h"
+#include "canvas/utils.h"
using namespace std;
using namespace ArdourCanvas;
@@ -44,6 +45,7 @@ uint32_t Canvas::tooltip_timeout_msecs = 750;
/** Construct a new Canvas */
Canvas::Canvas ()
: _root (this)
+ , _bg_color (rgba_to_color (0, 1.0, 0.0, 1.0))
{
set_epoch ();
}
@@ -341,6 +343,18 @@ Canvas::set_tooltip_timeout (uint32_t msecs)
}
void
+Canvas::set_background_color (Color c)
+{
+ _bg_color = c;
+
+ boost::optional<Rect> r = _root.bounding_box();
+
+ if (r) {
+ request_redraw (_root.item_to_window (r.get()));
+ }
+}
+
+void
GtkCanvas::re_enter ()
{
DEBUG_TRACE (PBD::DEBUG::CanvasEnterLeave, "re-enter canvas by request\n");
@@ -743,47 +757,35 @@ GtkCanvas::on_expose_event (GdkEventExpose* ev)
if (!canvas_image) {
canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
}
+ Cairo::RefPtr<Cairo::Context> draw_context = Cairo::Context::create (canvas_image);
+ Cairo::RefPtr<Cairo::Context> window_context = get_window()->create_cairo_context ();
+#else
+ Cairo::RefPtr<Cairo::Context> draw_context = get_window()->create_cairo_context ();
+#endif
- {
- /* scope for image_context */
- Cairo::RefPtr<Cairo::Context> image_context = Cairo::Context::create (canvas_image);
-
- /* clear expose area */
-
- image_context->save ();
- image_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
- image_context->clip ();
- image_context->set_operator (Cairo::OPERATOR_SOURCE);
- // TODO get canvas backround see CairoWidget::get_parent_bg
- // also subscribe to parent's signal_style_changed()
- // ..until new canvas color-theme API is in place, hardcode some values.
- image_context->set_source_rgba (84./255., 85./255., 93./255., 1.0);
- image_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
- image_context->fill ();
- image_context->restore ();
-
- /* render into image surface */
-
- render (Rect (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height), image_context);
-
- /* image surface is flushed when image_context goes out of scope */
- }
-
+ /* draw background color */
+
+ draw_context->save ();
+ draw_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ draw_context->clip ();
+ draw_context->set_operator (Cairo::OPERATOR_SOURCE);
+ set_source_rgba (draw_context, _bg_color);
+ draw_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ draw_context->fill ();
+ draw_context->restore ();
+
+ /* render canvas */
+
+ render (Rect (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height), draw_context);
+
+#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_GTK_CANVAS
/* now blit our private surface back to the GDK one */
- Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
-
- cairo_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
- cairo_context->clip ();
- cairo_context->set_source (canvas_image, 0, 0);
- cairo_context->set_operator (Cairo::OPERATOR_SOURCE);
- cairo_context->paint ();
-
-#else
-
- Cairo::RefPtr<Cairo::Context> cairo_context = get_window()->create_cairo_context ();
- render (Rect (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height), cairo_context);
-
+ window_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height);
+ window_context->clip ();
+ window_context->set_source (canvas_image, 0, 0);
+ window_context->set_operator (Cairo::OPERATOR_SOURCE);
+ window_context->paint ();
#endif
return true;