// Create a Cairo context that can be used on an FLTK drawing surface.
// In this demo we assume that the surface is the "current surface" after
// 'Fl_Surface_Device::push_current(surf)'.
cairo_t *cairo_context(Fl_Widget_Surface *surf, int W, int H) {
cairo_surface_t *cairo_surface = NULL;
cairo_t *cairo_context = NULL;
// Windows
#if defined(_WIN32)
cairo_surface = cairo_win32_surface_create(fl_win32_gc());
cairo_context = cairo_create(cairo_surface);
cairo_surface_destroy(cairo_surface);
return cairo_context;
#endif
// Wayland
#ifdef FLTK_USE_WAYLAND
if (fl_wl_display()) { // to avoid when the hybrid library is in x11 mode
cairo_context = fl_wl_cairo();
return cairo_context;
}
#endif
// X11
#if defined(FLTK_USE_X11)
cairo_surface = cairo_xlib_surface_create(fl_display, fl_window, fl_visual->visual, W, H);
cairo_context = cairo_create(cairo_surface);
cairo_surface_destroy(cairo_surface);
return cairo_context;
#endif
// macOS
#if defined(__APPLE__) && !defined(FLTK_USE_X11)
#include <ApplicationServices/ApplicationServices.h>
#include <cairo-quartz.h>
CGContextRef gc = fl_mac_gc();
cairo_surface = cairo_quartz_surface_create_for_cg_context(gc, W, H);
cairo_context = cairo_create(cairo_surface);
cairo_surface_destroy(cairo_surface);
return cairo_context;
#endif
// remaining platforms (shouldn't be any)
return NULL;
} // cairo_context(Fl_Widget_Surface *surf)