From dd3485c57a0ef7ffa5e00edc9fb9937004f3ca54 Mon Sep 17 00:00:00 2001 From: Albrecht Schlosser Date: Mon, 3 Feb 2020 16:35:28 +0100 Subject: Fix regression calling fl_font() w/o draw context According to the documentation fl_font(face, size) may be called "outside a draw context if necessary to call fl_width()". This worked in 1.3.5 but did not in 1.4 (so far). I reworded the docs to make clear that other measurement functions can be called as well and refactored the code to make sure that fl_font(face, size) will open the display if necessary. --- FL/fl_draw.H | 11 +++-------- src/Fl_Graphics_Driver.cxx | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/FL/fl_draw.H b/FL/fl_draw.H index 6854bcc7c..04d3b14d6 100644 --- a/FL/fl_draw.H +++ b/FL/fl_draw.H @@ -574,16 +574,11 @@ FL_EXPORT void fl_rescale_offscreen(Fl_Offscreen &ctx); /* NOTE: doxygen comments here to avoid triplication in os-specific sources */ // Fonts: -/** +/* Sets the current font, which is then used in various drawing routines. - You may call this outside a draw context if necessary to call fl_width(), - but on X this will open the display. - - The font is identified by a \p face and a \p size. - The size of the font is measured in pixels and not "points". - Lines should be spaced \p size pixels apart or more. + Implemented and documented in src/Fl_Graphics_Driver.cxx */ -inline void fl_font(Fl_Font face, Fl_Fontsize fsize) { fl_graphics_driver->font(face,fsize); } +void fl_font(Fl_Font face, Fl_Fontsize fsize); /** Returns the \p face set by the most recent call to fl_font(). diff --git a/src/Fl_Graphics_Driver.cxx b/src/Fl_Graphics_Driver.cxx index 0fbe80106..3d1b720cd 100644 --- a/src/Fl_Graphics_Driver.cxx +++ b/src/Fl_Graphics_Driver.cxx @@ -557,6 +557,22 @@ void Fl_Graphics_Driver::rtl_draw(const char *str, int nChars, int x, int y) { /** Returns non-zero if the graphics driver possesses the \p feature */ int Fl_Graphics_Driver::has_feature(driver_feature feature) { return 0; } +/** + Sets the current font, which is then used in various drawing routines. + You may call this outside a draw context if necessary to measure text, + for instance by calling fl_width(), fl_measure(), or fl_text_extents(), + but on X this will open the display. + + The font is identified by a \p face and a \p size. + The size of the font is measured in pixels and not "points". + Lines should be spaced \p size pixels apart or more. +*/ +void fl_font(Fl_Font face, Fl_Fontsize fsize) { + if (!fl_graphics_driver) + fl_open_display(); + fl_graphics_driver->font(face, fsize); +} + /** see fl_font(Fl_Font, Fl_Fontsize) */ void Fl_Graphics_Driver::font(Fl_Font face, Fl_Fontsize fsize) {font_ = face; size_ = fsize;} -- cgit v1.2.3