summaryrefslogtreecommitdiff
path: root/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx
diff options
context:
space:
mode:
authorManolo Gouy <Manolo>2016-03-03 08:32:16 +0000
committerManolo Gouy <Manolo>2016-03-03 08:32:16 +0000
commit8bd3ea6c8ac066002b035f10f3657449f6beadb1 (patch)
treeb4f8a783fc28295b6cc234d008832b5e707aab6f /src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx
parent78a539f69538e621f6e05ba4373508a8767705e8 (diff)
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
Diffstat (limited to 'src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx')
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_image.cxx27
1 files changed, 15 insertions, 12 deletions
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 <FL/Fl.H>
# include <FL/fl_draw.H>
# include <FL/x.H>
+# include <FL/Fl_Image_Surface.H>
# include "../../Fl_XColor.H"
# include "../../flstring.h"
#include <X11/Xregion.h>
@@ -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;
}