Skip to content

Commit

Permalink
Fix fl_read_image() under hybrid Wayland/X11 platform.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
ManoloFLTK committed Sep 11, 2022
1 parent 98d8a5d commit d028f0b
Show file tree
Hide file tree
Showing 10 changed files with 13 additions and 24 deletions.
1 change: 0 additions & 1 deletion FL/Fl_Device.H
Expand Up @@ -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();
};
Expand Down
2 changes: 0 additions & 2 deletions FL/Fl_Image_Surface.H
Expand Up @@ -82,7 +82,6 @@ public:
int printable_rect(int *w, int *h);
Fl_Offscreen offscreen();
void rescale();
Fl_Image_Surface *as_image_surface();
};


Expand Down Expand Up @@ -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.
Expand Down
3 changes: 0 additions & 3 deletions FL/platform.H
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions FL/wayland.H
Expand Up @@ -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
2 changes: 1 addition & 1 deletion src/CMakeLists.txt
Expand Up @@ -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)
Expand Down
5 changes: 0 additions & 5 deletions src/Fl_Device.cxx
Expand Up @@ -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();
Expand Down
8 changes: 0 additions & 8 deletions src/Fl_Image_Surface.cxx
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions src/drivers/Wayland/Fl_Wayland_Image_Surface_Driver.cxx
Expand Up @@ -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) {
Expand Down
3 changes: 2 additions & 1 deletion src/drivers/Wayland/Fl_Wayland_Window_Driver.cxx
Expand Up @@ -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


Expand Down Expand Up @@ -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(
Expand Down
9 changes: 6 additions & 3 deletions src/fl_read_image.cxx
Expand Up @@ -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;
Expand Down

0 comments on commit d028f0b

Please sign in to comment.