|
commit d028f0b37d12636f1956ad59843d2dec96b12a91
Author: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
AuthorDate: Sun Sep 11 19:45:48 2022 +0200
Commit: ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>
CommitDate: Sun Sep 11 19:45:48 2022 +0200
Fix fl_read_image() under hybrid Wayland/X11 platform.
Function fl_read_image() obliges to keep a minimal use of global variable fl_window
also under the Wayland platform, even if its type (Window) makes little sense for
the hybrid library because it has its X11 value (given by X11/X.h) which is not
meaningful for the Wayland leg of the hybrid platform.
Virtual member function Fl_Surface_Device::as_image_surface() becomes useless.
FL/Fl_Device.H | 1 -
FL/Fl_Image_Surface.H | 2 --
FL/platform.H | 3 ---
FL/wayland.H | 2 ++
src/CMakeLists.txt | 2 +-
src/Fl_Device.cxx | 5 -----
src/Fl_Image_Surface.cxx | 8 --------
src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx | 2 ++
src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx | 3 ++-
src/fl_read_image.cxx | 9 ++++++---
10 files changed, 13 insertions(+), 24 deletions(-)
diff --git FL/Fl_Device.H FL/Fl_Device.H
index 757aa65..940ada1 100644
--- FL/Fl_Device.H
+++ FL/Fl_Device.H
@@ -92,7 +92,6 @@ public:
}
/** \brief The destructor. */
virtual ~Fl_Surface_Device();
- virtual Fl_Image_Surface *as_image_surface();
static void push_current(Fl_Surface_Device *new_current);
static Fl_Surface_Device *pop_current();
};
diff --git FL/Fl_Image_Surface.H FL/Fl_Image_Surface.H
index b09d7d4..1fea396 100644
--- FL/Fl_Image_Surface.H
+++ FL/Fl_Image_Surface.H
@@ -82,7 +82,6 @@ public:
int printable_rect(int *w, int *h);
Fl_Offscreen offscreen();
void rescale();
- Fl_Image_Surface *as_image_surface();
};
@@ -113,7 +112,6 @@ protected:
virtual void untranslate() = 0;
int printable_rect(int *w, int *h);
virtual Fl_RGB_Image *image() = 0;
- virtual Fl_Image_Surface *as_image_surface();
/** Each platform implements this function its own way.
It returns an object implementing all virtual functions
of class Fl_Image_Surface_Driver for the plaform.
diff --git FL/platform.H FL/platform.H
index 75ec2f8..fbabca2 100644
--- FL/platform.H
+++ FL/platform.H
@@ -39,9 +39,6 @@ class Fl_Window;
# include "mac.H"
# elif defined(FLTK_USE_WAYLAND)
# include "wayland.H"
-# if !FLTK_USE_X11
- typedef struct wld_window *Window;
-# endif
# elif defined(FLTK_USE_X11)
# include "x11.H"
# endif // _WIN32
diff --git FL/wayland.H FL/wayland.H
index 3c16dc2..615d2af 100644
--- FL/wayland.H
+++ FL/wayland.H
@@ -45,6 +45,8 @@ extern FL_EXPORT EGLContext fl_wl_glcontext(GLContext rc);
# if FLTK_USE_X11
// *********** for X11 component ***********
# include "x11.H"
+# else
+ typedef struct wld_window *Window;
# endif
#endif // FL_DOXYGEN
diff --git src/CMakeLists.txt src/CMakeLists.txt
index 86fd019..9376a02 100644
--- src/CMakeLists.txt
+++ src/CMakeLists.txt
@@ -667,7 +667,7 @@ if (OPTION_USE_WAYLAND)
list (APPEND OPTIONAL_LIBS "-lwayland-cursor -lwayland-client -lxkbcommon -ldl -ldbus-1")
if (NOT OPTION_WAYLAND_ONLY)
list (APPEND OPTIONAL_LIBS "-lXcursor -lXrender -lXinerama -lXfixes -lXft -lXext -lX11")
- endif (OPTION_WAYLAND_ONLY)
+ endif (NOT OPTION_WAYLAND_ONLY)
if (GTK_FOUND)
list (APPEND OPTIONAL_LIBS ${GTK_LDFLAGS} )
endif (GTK_FOUND)
diff --git src/Fl_Device.cxx src/Fl_Device.cxx
index d5e1b27..e3ccca9 100644
--- src/Fl_Device.cxx
+++ src/Fl_Device.cxx
@@ -97,11 +97,6 @@ Fl_Surface_Device::~Fl_Surface_Device()
if (surface_ == this) surface_ = NULL;
}
-/** Returns non-NULL if this surface is an Fl_Image_Surface object
- \version 1.4.0
- */
-Fl_Image_Surface *Fl_Surface_Device::as_image_surface() { return NULL; }
-
/** A constructor that sets the graphics driver used by the display */
Fl_Display_Device::Fl_Display_Device(Fl_Graphics_Driver *graphics_driver) : Fl_Surface_Device(graphics_driver) {
this->set_current();
diff --git src/Fl_Image_Surface.cxx src/Fl_Image_Surface.cxx
index 1a5f5ec..d1a19c6 100644
--- src/Fl_Image_Surface.cxx
+++ src/Fl_Image_Surface.cxx
@@ -90,9 +90,6 @@ int Fl_Image_Surface_Driver::printable_rect(int *w, int *h) {
return 0;
}
-Fl_Image_Surface *Fl_Image_Surface_Driver::as_image_surface() {
- return image_surface_;
-}
/**
\}
\endcond
@@ -155,11 +152,6 @@ void Fl_Image_Surface::rescale() {
}
-Fl_Image_Surface *Fl_Image_Surface::as_image_surface() {
- return this;
-}
-
-
// implementation of the fl_XXX_offscreen() functions
static Fl_Image_Surface **offscreen_api_surface = NULL;
diff --git src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
index 4f64434..b3dcc17 100644
--- src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
@@ -60,12 +60,14 @@ void Fl_Wayland_Image_Surface_Driver::set_current() {
((Fl_Wayland_Graphics_Driver*)fl_graphics_driver)->set_buffer((struct fl_wld_buffer*)offscreen);
pre_window = Fl_Wayland_Window_Driver::wld_window;
Fl_Wayland_Window_Driver::wld_window = NULL;
+ fl_window = 0;
}
void Fl_Wayland_Image_Surface_Driver::end_current() {
cairo_surface_t *surf = cairo_get_target(((struct fl_wld_buffer *)offscreen)->cairo_);
cairo_surface_flush(surf);
Fl_Wayland_Window_Driver::wld_window = pre_window;
+ fl_window = (Window)pre_window;
}
void Fl_Wayland_Image_Surface_Driver::translate(int x, int y) {
diff --git src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
index e35cfdd..43c3d3f 100644
--- src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
+++ src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
@@ -51,7 +51,7 @@ extern "C" {
#define fl_min(a,b) ((a) < (b) ? (a) : (b))
#if !FLTK_USE_X11
-Window fl_window = 0; // temporary, until we get rid of this global for wayland
+Window fl_window = 0;
#endif
@@ -362,6 +362,7 @@ void Fl_Wayland_Window_Driver::make_current() {
}
Fl_Wayland_Window_Driver::wld_window = window;
+ fl_window = (Window)window;
float scale = Fl::screen_scale(pWindow->screen_num()) * window->scale;
if (!window->buffer) {
window->buffer = Fl_Wayland_Graphics_Driver::create_shm_buffer(
diff --git src/fl_read_image.cxx src/fl_read_image.cxx
index b345851..181e2a0 100644
--- src/fl_read_image.cxx
+++ src/fl_read_image.cxx
@@ -40,9 +40,12 @@
uchar *fl_read_image(uchar *p, int X, int Y, int w, int h, int alpha) {
uchar *image_data = NULL;
Fl_RGB_Image *img;
- // TODO: strive to remove use of the fl_window global variable in platform-independent code
- //if (Fl_Surface_Device::surface()->as_image_surface()) { // read from off_screen buffer
- if (fl_find(fl_window)==0) { // read from off_screen buffer
+ // Under macOS and Wayland, fl_window == 0 when an Fl_Image_Surface is the current drawing
+ // surface. Otherwise, fl_window corresponds to a mapped Fl_Window.
+ // Under X11 and windows, fl_window is an offscreen buffer when an Fl_Image_Surface
+ // is the current drawing or when fl_read_image() is called inside the draw() of
+ // an Fl_Double_Window.
+ if (fl_find(fl_window) == 0) { // read from offscreen buffer or buffer of an Fl_Double_Window
img = Fl::screen_driver()->read_win_rectangle(X, Y, w, h, 0);
if (!img) {
return NULL;
[ Direct Link to Message ] | |