FLTK logo

[master] d028f0b - Fix fl_read_image() under hybrid Wayland/X11 platform.

FLTK matrix user chat room
(using Element browser app)   FLTK gitter user chat room   GitHub FLTK Project   FLTK News RSS Feed  
  FLTK Apps      FLTK Library      Forums      Links     Login 
 All Forums  |  Back to fltk.commit  ]
 
Previous Message ]Next Message ]

[master] d028f0b - Fix fl_read_image() under hybrid Wayland/X11 platform. "ManoloFLTK" Sep 11, 2022  
 
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 ]
 
     
Previous Message ]Next Message ]
 
 

Comments are owned by the poster. All other content is copyright 1998-2024 by Bill Spitzak and others. This project is hosted by The FLTK Team. Please report site problems to 'erco@seriss.com'.