Skip to content

Commit

Permalink
Fix offscreen drawing under X11 (STR 3384)
Browse files Browse the repository at this point in the history
- fix undefined 'GC' if no window has been shown/drawn yet
- may still need to call fl_open_display() prior to offscreen-drawing
- improve documentation, add example code
  • Loading branch information
Albrecht Schlosser committed Nov 3, 2020
1 parent 6b8a7b3 commit 0c70362
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 8 deletions.
7 changes: 5 additions & 2 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Bug fixes and other improvements
Note to devs: the following list was created with:
$ git shortlog release-1.3.5.. | sed -e's/^ //' | sed -e's/^/ /'

Albrecht Schlosser (8):
Albrecht Schlosser (10):
Fix Fl::add_timeout() in draw() under Linux (STR 3188)
Fix trailing whitespace in CHANGES
X11: Fix X Input Methods (XIM) (STR 3502, 3192)
Expand All @@ -14,11 +14,13 @@ Bug fixes and other improvements
Fix DND in read-only Fl_Input (Fl_Output) (#113)
Update CHANGES and dependencies
Minor CMake, docs, and test program updates
Fix doxygen warnings
Fix offscreen drawing under X11 (STR 3384)

Greg Ercolano (1):
fixes issue92, added -d debug flag to fluid

ManoloFLTK (13):
ManoloFLTK (14):
X11: add support for copy+paste of image within one app
Windows: add bitmap version of graphics when copying to clipboard
Fix use of Xrender extension with old, 16-bit framebuffers.
Expand All @@ -32,6 +34,7 @@ Bug fixes and other improvements
Have Fl_Pack::draw() call Fl_Group::init_sizes() on its parent group.
CMake support of the Darwin+XQuartz test platform
Add support of macOS "Big Sur" 11.0
Fix when building with SDK 10.15 and running with 11.0 Big Sur

OKAMURA, Yasunobu (1):
Fix JIS Keyboard dead keys
Expand Down
4 changes: 3 additions & 1 deletion FL/x.H
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,12 @@ typedef ulong Fl_Offscreen;
// begin/end are macros that save the old state in local variables:
# define fl_begin_offscreen(pixmap) \
Window _sw=fl_window; fl_window=pixmap; \
GC _sgc = fl_gc; if (!_sgc) fl_gc = XCreateGC(fl_display, pixmap, 0, 0); \
Fl_Surface_Device *_ss = Fl_Surface_Device::surface(); Fl_Display_Device::display_device()->set_current(); \
fl_push_no_clip()
# define fl_end_offscreen() \
fl_pop_clip(); fl_window = _sw; _ss->set_current()
fl_pop_clip(); fl_window = _sw; _ss->set_current(); \
if (!_sgc) XFreeGC(fl_display, fl_gc); fl_gc = _sgc

extern FL_EXPORT void fl_copy_offscreen(int x, int y, int w, int h, Fl_Offscreen pixmap, int srcx, int srcy);
# define fl_delete_offscreen(pixmap) XFreePixmap(fl_display, pixmap)
Expand Down
47 changes: 42 additions & 5 deletions documentation/src/drawing.dox
Original file line number Diff line number Diff line change
Expand Up @@ -1052,9 +1052,48 @@ Sometimes it can be very useful to generate a complex drawing
in memory first and copy it to the screen at a later point in
time. This technique can significantly reduce the amount of
repeated drawing. Offscreen drawing functions are declared in <FL/x.H>.
Fl_Double_Window uses offscreen rendering
to avoid flickering on systems that don't support
double-buffering natively.

Fl_Double_Window uses offscreen rendering to avoid flickering on systems
that don't support double-buffering natively.

FLTK can draw into an offscreen buffer at any time. There is no need to
wait for an Fl_Widget::draw() to occur.

\note The X11 platform requires an open display for offscreen drawing,
i.e. you may need to call fl_open_display() prior to creating and using
offscreen buffers, particularly if no window has been shown yet.

\par
\note In FLTK 1.3.x and earlier versions all offscreen drawing functions
described below are implemented as macros and create certain temporary
variables to save context information. You may need to create local scope
blocks with curly braces { ... } if you use offscreen functions more than
once in a function or method.

Example:
\code
fl_open_display(); // necessary before showing the first window
Fl_Offscreen oscr = fl_create_offscreen(120, 120);
{ // begin block
fl_begin_offscreen(oscr);
fl_color(FL_WHITE);
fl_rectf(0, 0, 120, 120);
fl_end_offscreen();
} // end block
// other code here
{ // begin block
fl_begin_offscreen(oscr);
fl_color(FL_BLACK);
fl_rectf(10, 10, 100, 100);
fl_end_offscreen();
} // end block
// other code here
fl_delete_offscreen(oscr);
\endcode

\note In FLTK 1.4.0 and later neither calling fl_open_display() nor using
local blocks is necessary since the offscreen functions described below
are real functions (not macros as in 1.3.x).

Fl_Offscreen fl_create_offscreen(int w, int h)

Expand All @@ -1070,8 +1109,6 @@ void fl_begin_offscreen(Fl_Offscreen)

\par
Send all subsequent drawing commands to this offscreen buffer.
FLTK can draw into a buffer at any time. There is no need to wait for
an Fl_Widget::draw() to occur.

void fl_end_offscreen()

Expand Down

0 comments on commit 0c70362

Please sign in to comment.