diff options
author | Robin Gareus <robin@gareus.org> | 2015-05-02 04:54:59 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-05-02 04:54:59 +0200 |
commit | 198c4d1d8899296da19daff08de2395d13494fc1 (patch) | |
tree | 73ca2d901eb7e88bc6a9d1bbef40a32b54e4b5f1 /libs/canvas | |
parent | 8f333acb8033318700134e9ae8fe05bc2173d232 (diff) |
gfx-card & performance testing
Diffstat (limited to 'libs/canvas')
-rw-r--r-- | libs/canvas/canvas.cc | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/libs/canvas/canvas.cc b/libs/canvas/canvas.cc index 72acbd4021..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. */ @@ -754,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. @@ -769,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<Cairo::Context> draw_context; + Cairo::RefPtr<Cairo::Context> 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()); } @@ -803,7 +825,10 @@ GtkCanvas::on_expose_event (GdkEventExpose* ev) g_free (rects); } -#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 /* 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); @@ -812,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; } |