From 8bd3ea6c8ac066002b035f10f3657449f6beadb1 Mon Sep 17 00:00:00 2001 From: Manolo Gouy Date: Thu, 3 Mar 2016 08:32:16 +0000 Subject: A hopefully clearer implementation of the fl_XXX_offscreen() functions. The Xlib driver is tricky because it uses two kinds of offscreen buffers. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11277 ea41ed52-d2ee-0310-a9c1-e6b18d33e121 --- src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx') diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx index 069fc925e..f9cc87c82 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx @@ -49,6 +49,7 @@ # include # include # include +# include # include "../../Fl_XColor.H" # include "../../flstring.h" #include @@ -713,18 +714,20 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in return; } if (!img->id_) { - if (img->d() == 1 || img->d() == 3) { - img->id_ = fl_create_offscreen(img->w(), img->h()); - fl_begin_offscreen((Fl_Offscreen)img->id_); - fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d(), img->ld()); - fl_end_offscreen(); - } else if (img->d() == 4 && fl_can_do_alpha_blending()) { - img->id_ = (fl_uintptr_t)fl_create_offscreen_with_alpha(img->w(), img->h()); - fl_begin_offscreen((Fl_Offscreen)img->id_); - fl_draw_image(img->array, 0, 0, img->w(), img->h(), img->d() | FL_IMAGE_WITH_ALPHA, - img->ld()); - fl_end_offscreen(); + Fl_Image_Surface *surface; + int depth = img->d(); + if (depth == 1 || depth == 3) { + surface = new Fl_Image_Surface(img->w(), img->h()); + } else if (depth == 4 && fl_can_do_alpha_blending()) { + Fl_Offscreen pixmap = XCreatePixmap(fl_display, RootWindow(fl_display, fl_screen), img->w(), img->h(), 32); + surface = new Fl_Image_Surface(pixmap, img->w(), img->h()); + depth |= FL_IMAGE_WITH_ALPHA; } + surface->set_current(); + fl_draw_image(img->array, 0, 0, img->w(), img->h(), depth, img->ld()); + surface->end_current(); + img->id_ = surface->get_offscreen_before_delete(); + delete surface; } if (img->id_) { if (img->mask_) { @@ -759,7 +762,7 @@ void Fl_Xlib_Graphics_Driver::draw(Fl_RGB_Image *img, int XP, int YP, int WP, in void Fl_Xlib_Graphics_Driver::uncache(Fl_RGB_Image*, fl_uintptr_t &id_, fl_uintptr_t &mask_) { if (id_) { - fl_delete_offscreen((Fl_Offscreen)id_); + XFreePixmap(fl_display, (Fl_Offscreen)id_); id_ = 0; } -- cgit v1.2.3