+ cairo_rectangle_t expose_area;
+ expose_area.width = ev->area.width;
+ expose_area.height = ev->area.height;
+
+#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_CAIRO_WIDGET
+ Cairo::RefPtr<Cairo::Context> cr;
+ if (get_visible_window ()) {
+ expose_area.x = 0;
+ expose_area.y = 0;
+ if (!_image_surface) {
+ _image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+ }
+ cr = Cairo::Context::create (_image_surface);
+ } else {
+ expose_area.x = ev->area.x;
+ expose_area.y = ev->area.y;
+ cr = get_window()->create_cairo_context ();
+ }
+#else
+ expose_area.x = ev->area.x;
+ expose_area.y = ev->area.y;
+ Cairo::RefPtr<Cairo::Context> cr = get_window()->create_cairo_context ();
+#endif
+
+ cr->rectangle (expose_area.x, expose_area.y, expose_area.width, expose_area.height);
+ cr->clip ();
+
+ /* paint expose area the color of the parent window bg
+ */
+
+ if (get_visible_window ()) {
+ Gdk::Color bg (get_parent_bg());
+ cr->rectangle (expose_area.x, expose_area.y, expose_area.width, expose_area.height);
+ cr->set_source_rgb (bg.get_red_p(), bg.get_green_p(), bg.get_blue_p());
+ cr->fill ();
+ }
+
+ render (cr->cobj(), &expose_area);
+
+#ifdef USE_CAIRO_IMAGE_SURFACE_FOR_CAIRO_WIDGET
+ if(get_visible_window ()) {
+ _image_surface->flush();
+ /* 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 (_image_surface, ev->area.x, ev->area.y);
+ cairo_context->set_operator (Cairo::OPERATOR_OVER);
+ cairo_context->paint ();
+ }
+#endif
+
+ Gtk::Widget* child = get_child ();
+
+ if (child) {
+ propagate_expose (*child, ev);
+ }
+
+ return true;
+}
+
+#else
+
+/* Ardour mainline: not using Tracks code features.
+
+ Tracks Developers: please do not modify this version of
+ ::on_expose_event(). The version used by Tracks is before the preceding
+ #else and contains hacks required for the Tracks GUI to work.
+*/
+
+bool
+CairoWidget::on_expose_event (GdkEventExpose *ev)
+{
+#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
+ Cairo::RefPtr<Cairo::Context> cr;
+ if (getenv("ARDOUR_IMAGE_SURFACE")) {
+ if (!image_surface) {
+ image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
+ }
+ cr = Cairo::Context::create (image_surface);
+ } else {
+ cr = get_window()->create_cairo_context ();
+ }
+#elif defined USE_CAIRO_IMAGE_SURFACE