mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-16 11:46:25 +01:00
gfx-card & performance testing
This commit is contained in:
parent
8f333acb80
commit
198c4d1d88
2 changed files with 59 additions and 6 deletions
|
|
@ -18,6 +18,10 @@
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
|
||||||
|
#define OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
#endif
|
||||||
|
|
||||||
/** @file canvas/canvas.cc
|
/** @file canvas/canvas.cc
|
||||||
* @brief Implementation of the main canvas classes.
|
* @brief Implementation of the main canvas classes.
|
||||||
*/
|
*/
|
||||||
|
|
@ -754,12 +758,18 @@ void
|
||||||
GtkCanvas::on_size_allocate (Gtk::Allocation& a)
|
GtkCanvas::on_size_allocate (Gtk::Allocation& a)
|
||||||
{
|
{
|
||||||
EventBox::on_size_allocate (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 */
|
/* allocate an image surface as large as the canvas itself */
|
||||||
|
|
||||||
canvas_image.clear ();
|
canvas_image.clear ();
|
||||||
canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, a.get_width(), a.get_height());
|
canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, a.get_width(), a.get_height());
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Handler for GDK expose events.
|
/** Handler for GDK expose events.
|
||||||
|
|
@ -769,7 +779,19 @@ GtkCanvas::on_size_allocate (Gtk::Allocation& a)
|
||||||
bool
|
bool
|
||||||
GtkCanvas::on_expose_event (GdkEventExpose* ev)
|
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) {
|
if (!canvas_image) {
|
||||||
canvas_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
|
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);
|
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 */
|
/* 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);
|
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->set_operator (Cairo::OPERATOR_SOURCE);
|
||||||
window_context->paint ();
|
window_context->paint ();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,9 @@
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
#if !defined USE_CAIRO_IMAGE_SURFACE && !defined NDEBUG
|
||||||
|
#define OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "gtkmm2ext/cairo_widget.h"
|
#include "gtkmm2ext/cairo_widget.h"
|
||||||
#include "gtkmm2ext/gui_thread.h"
|
#include "gtkmm2ext/gui_thread.h"
|
||||||
|
|
@ -65,7 +68,17 @@ CairoWidget::on_button_press_event (GdkEventButton*)
|
||||||
bool
|
bool
|
||||||
CairoWidget::on_expose_event (GdkEventExpose *ev)
|
CairoWidget::on_expose_event (GdkEventExpose *ev)
|
||||||
{
|
{
|
||||||
#ifdef USE_CAIRO_IMAGE_SURFACE
|
#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
|
||||||
|
|
||||||
if (!image_surface) {
|
if (!image_surface) {
|
||||||
image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
|
image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, get_width(), get_height());
|
||||||
|
|
@ -95,7 +108,10 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
|
||||||
|
|
||||||
render (cr->cobj(), &expose_area);
|
render (cr->cobj(), &expose_area);
|
||||||
|
|
||||||
#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
|
||||||
image_surface->flush();
|
image_surface->flush();
|
||||||
/* now blit our private surface back to the GDK one */
|
/* now blit our private surface back to the GDK one */
|
||||||
|
|
||||||
|
|
@ -107,6 +123,9 @@ CairoWidget::on_expose_event (GdkEventExpose *ev)
|
||||||
cairo_context->set_operator (Cairo::OPERATOR_SOURCE);
|
cairo_context->set_operator (Cairo::OPERATOR_SOURCE);
|
||||||
cairo_context->paint ();
|
cairo_context->paint ();
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -130,9 +149,15 @@ CairoWidget::on_size_allocate (Gtk::Allocation& alloc)
|
||||||
{
|
{
|
||||||
Gtk::EventBox::on_size_allocate (alloc);
|
Gtk::EventBox::on_size_allocate (alloc);
|
||||||
|
|
||||||
#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
|
||||||
image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, alloc.get_width(), alloc.get_height());
|
image_surface = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, alloc.get_width(), alloc.get_height());
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef OPTIONAL_CAIRO_IMAGE_SURFACE
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
set_dirty ();
|
set_dirty ();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue