X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fcanvas%2Fcanvas.cc;h=7f9c8fab597337ca08f71b7bbeb45cae266ee673;hb=8671e109fcc5089226da1e539bc8b7327b2cb5bf;hp=1a14f8bde3989bcde7167e20dd0c7c737036a9e9;hpb=e84e1f74030ad123cd1ba08331b5ef5df1835129;p=ardour.git diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index 1a14f8bde3..7f9c8fab59 100644 --- a/libs/canvas/canvas.cc +++ b/libs/canvas/canvas.cc @@ -18,6 +18,10 @@ */ +#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG +#define OPTIONAL_CAIRO_IMAGE_SURFACE +#endif + /** @file canvas/canvas.cc * @brief Implementation of the main canvas classes. */ @@ -382,6 +386,7 @@ GtkCanvas::GtkCanvas () , _new_current_item (0) , _grabbed_item (0) , _focused_item (0) + , _single_exposure (1) , current_tooltip_item (0) , tooltip_window (0) { @@ -753,12 +758,18 @@ void GtkCanvas::on_size_allocate (Gtk::Allocation& a) { EventBox::on_size_allocate (a); -#ifdef USE_CAIRO_IMAGE_SURFACE +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + if (getenv("ARDOUR_IMAGE_SURFACE")) { +#endif +#if defined USE_CAIRO_IMAGE_SURFACE || defined OPTIONAL_CAIRO_IMAGE_SURFACE /* allocate an image surface as large as the canvas itself */ canvas_image.clear (); canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, a.get_width(), a.get_height()); #endif +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + } +#endif } /** Handler for GDK expose events. @@ -768,7 +779,19 @@ GtkCanvas::on_size_allocate (Gtk::Allocation& a) bool GtkCanvas::on_expose_event (GdkEventExpose* ev) { -#ifdef USE_CAIRO_IMAGE_SURFACE +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + Cairo::RefPtr draw_context; + Cairo::RefPtr window_context; + if (getenv("ARDOUR_IMAGE_SURFACE")) { + if (!canvas_image) { + canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height()); + } + draw_context = Cairo::Context::create (canvas_image); + window_context = get_window()->create_cairo_context (); + } else { + draw_context = get_window()->create_cairo_context (); + } +#elif defined USE_CAIRO_IMAGE_SURFACE if (!canvas_image) { canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height()); } @@ -786,10 +809,26 @@ GtkCanvas::on_expose_event (GdkEventExpose* ev) draw_context->fill (); /* render canvas */ - - render (Rect (ev->area.x, ev->area.y, ev->area.x + ev->area.width, ev->area.y + ev->area.height), draw_context); + if ( _single_exposure ) { + + 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 + } else { + GdkRectangle* rects; + gint nrects; + + gdk_region_get_rectangles (ev->region, &rects, &nrects); + for (gint n = 0; n < nrects; ++n) { + draw_context->set_identity_matrix(); //reset the cairo matrix, just in case someone left it transformed after drawing ( cough ) + render (Rect (rects[n].x, rects[n].y, rects[n].x + rects[n].width, rects[n].y + rects[n].height), draw_context); + } + g_free (rects); + } + +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + if (getenv("ARDOUR_IMAGE_SURFACE")) { +#endif +#if defined USE_CAIRO_IMAGE_SURFACE || defined OPTIONAL_CAIRO_IMAGE_SURFACE /* now blit our private surface back to the GDK one */ window_context->rectangle (ev->area.x, ev->area.y, ev->area.width, ev->area.height); @@ -798,6 +837,9 @@ GtkCanvas::on_expose_event (GdkEventExpose* ev) window_context->set_operator (Cairo::OPERATOR_SOURCE); window_context->paint (); #endif +#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE + } +#endif return true; } @@ -1142,7 +1184,7 @@ GtkCanvas::show_tooltip () tooltip_label = manage (new Gtk::Label); tooltip_label->show (); tooltip_window->add (*tooltip_label); - tooltip_window->set_border_width (6); + tooltip_window->set_border_width (1); tooltip_window->set_name ("tooltip"); } @@ -1175,7 +1217,8 @@ GtkCanvas::show_tooltip () * to get it away from the pointer. */ - tooltip_window_origin.x += 20; + tooltip_window_origin.x += 30; + tooltip_window_origin.y += 45; /* move the tooltip window into position */ @@ -1197,6 +1240,11 @@ GtkCanvas::hide_tooltip () if (tooltip_window) { tooltip_window->hide (); + + // Delete the tooltip window so it'll get re-created + // (i.e. properly re-sized) on the next usage. + delete tooltip_window; + tooltip_window = NULL; } }