Browse Source

Don't unnecessarily keep a handle to the cairo surface.

tags/v1.3.1000
Jonathan Moore Liles 12 years ago
parent
commit
7d522d5b6d
6 changed files with 19 additions and 39 deletions
  1. +1
    -1
      FL/Fl.H
  2. +0
    -1
      FL/Fl_Cairo.H
  3. +0
    -2
      FL/x.H
  4. +2
    -4
      src/Fl_Cairo.cxx
  5. +9
    -23
      src/Fl_Double_Window.cxx
  6. +7
    -8
      src/Fl_x.cxx

+ 1
- 1
FL/Fl.H View File

@@ -1041,7 +1041,7 @@ public:
static cairo_surface_t * cairo_create_surface ( Window xid, int W, int H ); static cairo_surface_t * cairo_create_surface ( Window xid, int W, int H );


// Cairo support API // Cairo support API
static cairo_t * cairo_make_current( cairo_surface_t *cs, cairo_t *cc );
static cairo_t * cairo_make_current( cairo_t *cc );
/** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true, /** when FLTK_HAVE_CAIRO is defined and cairo_autolink_context() is true,
any current window dc is linked to a current context. any current window dc is linked to a current context.
This is not the default, because it may not be necessary This is not the default, because it may not be necessary


+ 0
- 1
FL/Fl_Cairo.H View File

@@ -46,7 +46,6 @@
# include <cairo/cairo-xlib.h> # include <cairo/cairo-xlib.h>
# endif # endif


FL_EXPORT extern cairo_surface_t *fl_cairo_surface;
FL_EXPORT extern cairo_t *fl_cairo_context; FL_EXPORT extern cairo_t *fl_cairo_context;


cairo_surface_t * cairo_create_surface(void * gc, int W, int H); cairo_surface_t * cairo_create_surface(void * gc, int W, int H);


+ 0
- 2
FL/x.H View File

@@ -156,9 +156,7 @@ public:
Window xid; Window xid;
Window other_xid; /* for double buffering */ Window other_xid; /* for double buffering */
cairo_t *cc; cairo_t *cc;
cairo_surface_t *cs;
cairo_t *other_cc; /* for double buffering */ cairo_t *other_cc; /* for double buffering */
cairo_surface_t *other_cs; /* for double buffering */
Fl_Window *w; Fl_Window *w;
Fl_Region region; Fl_Region region;
Fl_X *next; Fl_X *next;


+ 2
- 4
src/Fl_Cairo.cxx View File

@@ -50,7 +50,6 @@ cairo_surface_t * cairo_create_surface(void * gc, Window w, int W, int H) {
# endif # endif
} }


cairo_surface_t *fl_cairo_surface;
cairo_t *fl_cairo_context; cairo_t *fl_cairo_context;


cairo_surface_t * cairo_surface_t *
@@ -60,9 +59,8 @@ Fl::cairo_create_surface ( Window xid, int W, int H )
} }


cairo_t * cairo_t *
Fl::cairo_make_current( cairo_surface_t *cs, cairo_t *cc ) {

fl_cairo_surface = cs;
Fl::cairo_make_current( cairo_t *cc )
{
fl_cairo_context = cc; fl_cairo_context = cc;


return cc; return cc;


+ 9
- 23
src/Fl_Double_Window.cxx View File

@@ -325,16 +325,16 @@ void Fl_Double_Window::flush(int eraseoverlay) {
#else #else
# error unsupported platform # error unsupported platform
#endif #endif
myi->other_cs = Fl::cairo_create_surface( myi->other_xid, w(), h() );
myi->other_cc = cairo_create( myi->other_cs );
cairo_surface_t *cs = Fl::cairo_create_surface( myi->other_xid, w(), h() );
myi->other_cc = cairo_create( cs );
cairo_surface_destroy( cs );
} }
fl_clip_region(myi->region); fl_clip_region(myi->region);


if (damage() & ~FL_DAMAGE_EXPOSE) { if (damage() & ~FL_DAMAGE_EXPOSE) {


Fl::cairo_make_current( myi->other_cs, myi->other_cc );
Fl::cairo_make_current( myi->other_cc );
#ifdef WIN32 #ifdef WIN32
HDC _sgc = fl_gc; HDC _sgc = fl_gc;
@@ -363,15 +363,11 @@ void Fl_Double_Window::flush(int eraseoverlay) {


draw(); draw();


#if FLTK_HAVE_CAIRO
cairo_surface_flush( myi->other_cs );
#endif
/* cairo_surface_flush( myi->other_cs ); */


fl_window = myi->xid; fl_window = myi->xid;


#if FLTK_HAVE_CAIRO
Fl::cairo_make_current( myi->cs, myi->cc );
#endif
Fl::cairo_make_current( myi->cc );


// fl_restore_clip(); // fl_restore_clip();
fl_clip_region(myi->region); fl_clip_region(myi->region);
@@ -388,10 +384,8 @@ void Fl_Double_Window::flush(int eraseoverlay) {
// the current clip region: // the current clip region:


#if 1 // FLTK_USE_CAIRO #if 1 // FLTK_USE_CAIRO
cairo_set_source_surface( myi->cc, myi->other_cs, 0, 0 );
cairo_set_source_surface( myi->cc, cairo_get_target( myi->other_cc ), 0, 0 );
cairo_set_operator( myi->cc, CAIRO_OPERATOR_SOURCE ); cairo_set_operator( myi->cc, CAIRO_OPERATOR_SOURCE );
/* cairo_rectangle( myi->cc, 0, 0, w(), h() ); */
/* cairo_fill( myi->cc ); */
cairo_paint( myi->cc ); cairo_paint( myi->cc );
cairo_set_operator( myi->cc, CAIRO_OPERATOR_OVER ); cairo_set_operator( myi->cc, CAIRO_OPERATOR_OVER );
#else #else
@@ -415,13 +409,10 @@ void Fl_Double_Window::resize(int X,int Y,int W,int H) {
Fl_Window::resize(X,Y,W,H); Fl_Window::resize(X,Y,W,H);
Fl_X* myi = Fl_X::i(this); Fl_X* myi = Fl_X::i(this);
if (myi && myi->other_xid && (ow != w() || oh != h())) { if (myi && myi->other_xid && (ow != w() || oh != h())) {
#if FLTK_HAVE_CAIRO
if ( myi->other_cs )
if ( myi->other_cc )
{ {
cairo_destroy( myi->other_cc ); myi->other_cc = 0; cairo_destroy( myi->other_cc ); myi->other_cc = 0;
cairo_surface_destroy( myi->other_cs ); myi->other_cs = 0;
} }
#endif
fl_delete_offscreen(myi->other_xid); fl_delete_offscreen(myi->other_xid);
myi->other_xid = 0; myi->other_xid = 0;
} }
@@ -430,13 +421,8 @@ void Fl_Double_Window::resize(int X,int Y,int W,int H) {
void Fl_Double_Window::hide() { void Fl_Double_Window::hide() {
Fl_X* myi = Fl_X::i(this); Fl_X* myi = Fl_X::i(this);
if (myi && myi->other_xid) { if (myi && myi->other_xid) {
#if FLTK_HAVE_CAIRO
if ( myi->other_cs )
{
if ( myi->other_cc )
cairo_destroy( myi->other_cc ); myi->other_cc = 0; cairo_destroy( myi->other_cc ); myi->other_cc = 0;
cairo_surface_destroy( myi->other_cs ); myi->other_cs = 0;
}
#endif
fl_delete_offscreen(myi->other_xid); fl_delete_offscreen(myi->other_xid);
myi->other_xid = 0; myi->other_xid = 0;
} }


+ 7
- 8
src/Fl_x.cxx View File

@@ -1618,11 +1618,11 @@ Fl_X* Fl_X::set_xid(Fl_Window* win, Window winxid) {
Fl_X* xp = new Fl_X; Fl_X* xp = new Fl_X;
xp->xid = winxid; xp->xid = winxid;
xp->other_xid = 0; xp->other_xid = 0;
xp->cs = Fl::cairo_create_surface( winxid, win->w(), win->h() );
xp->cc = cairo_create( xp->cs );
cairo_surface_t *cs = Fl::cairo_create_surface( winxid, win->w(), win->h() );
xp->cc = cairo_create( cs );
cairo_surface_destroy( cs );
xp->cairo_surface_invalid = 0; xp->cairo_surface_invalid = 0;
xp->other_cc = 0; xp->other_cc = 0;
xp->other_cs = 0;
xp->setwindow(win); xp->setwindow(win);
xp->next = Fl_X::first; xp->next = Fl_X::first;
xp->region = 0; xp->region = 0;
@@ -1983,17 +1983,16 @@ void Fl_Window::make_current() {
if ( i->cairo_surface_invalid && i->cc ) if ( i->cairo_surface_invalid && i->cc )
{ {
cairo_destroy( i->cc ); i->cc = 0; cairo_destroy( i->cc ); i->cc = 0;
cairo_surface_destroy( i->cs ); i->cs = 0;
} }


if ( ! i->cc ) if ( ! i->cc )
{ {
i->cs = Fl::cairo_create_surface( i->xid, w(), h() );
i->cc = cairo_create( i->cs );
cairo_surface_t *cs = Fl::cairo_create_surface( i->xid, w(), h() );
i->cc = cairo_create( cs );
cairo_surface_destroy( cs );
} }



Fl::cairo_make_current( i->cs, i->cc );
Fl::cairo_make_current( i->cc );
current_ = this; current_ = this;




Loading…
Cancel
Save