Adding gap parameter to fl_draw(...)

This allows the user to define the spacing between a
possible imge and the text.
This commit is contained in:
Matthias Melcher 2024-08-14 00:35:55 +02:00
parent 9f04497d6e
commit 325ac336c7
2 changed files with 23 additions and 17 deletions

View File

@ -975,10 +975,12 @@ inline void fl_rtl_draw(const char *str, int n, int x, int y) {
fl_graphics_driver->rtl_draw(str, n, x, y); fl_graphics_driver->rtl_draw(str, n, x, y);
} }
FL_EXPORT void fl_measure(const char *str, int &x, int &y, int draw_symbols = 1); FL_EXPORT void fl_measure(const char *str, int &x, int &y, int draw_symbols = 1);
FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align align, Fl_Image *img = 0, FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h,
int draw_symbols = 1); Fl_Align align, Fl_Image *img = 0,
int draw_symbols = 1, int gap = 0);
FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align align, FL_EXPORT void fl_draw(const char *str, int x, int y, int w, int h, Fl_Align align,
void (*callthis)(const char *, int, int, int), Fl_Image *img = 0, int draw_symbols = 1); void (*callthis)(const char *, int, int, int),
Fl_Image *img = 0, int draw_symbols = 1, int gap = 0);
// boxtypes: // boxtypes:

View File

@ -202,14 +202,14 @@ fl_expand_text(const char* from, char* buf, int maxbuf, double maxw, int& n,
\param[in] img pointer to image \param[in] img pointer to image
\param[in] draw_symbols if true, interprete leading and trailing '@sym' \param[in] draw_symbols if true, interprete leading and trailing '@sym'
as graphical symbols as graphical symbols
\param[in] text_to_image_spacing spacing between text and image \param[in] gap spacing between text and image
*/ */
void fl_draw( void fl_draw(
const char* str, // the (multi-line) string const char* str, // the (multi-line) string
int x, int y, int w, int h, // bounding box int x, int y, int w, int h, // bounding box
Fl_Align align, Fl_Align align,
void (*callthis)(const char*,int,int,int), void (*callthis)(const char*,int,int,int),
Fl_Image* img, int draw_symbols) Fl_Image* img, int draw_symbols, int gap)
{ {
char *linebuf = NULL; // Pointer to a buffer managed by expand_text_ char *linebuf = NULL; // Pointer to a buffer managed by expand_text_
const char* p; // Scratch pointer into text, multiple use const char* p; // Scratch pointer into text, multiple use
@ -228,7 +228,7 @@ void fl_draw(
int height = fl_height(); // Height of a line of text int height = fl_height(); // Height of a line of text
// Ff the image is set as a backdrop, ignore it in this function // If the image is set as a backdrop, ignore it in this function
if (img && (align & FL_ALIGN_IMAGE_BACKDROP)) img = 0; if (img && (align & FL_ALIGN_IMAGE_BACKDROP)) img = 0;
symbol[0][0] = '\0'; symbol[0][0] = '\0';
@ -258,7 +258,7 @@ void fl_draw(
// Width and height of both symbols combined // Width and height of both symbols combined
symtotal = symwidth[0] + symwidth[1]; symtotal = symwidth[0] + symwidth[1];
// Image width if image is to the left or right of the text, else 0 // Image width if image is to the left or right of the text, else 0
imgtotal = (img && (align&FL_ALIGN_IMAGE_NEXT_TO_TEXT)) ? img->w() : 0; imgtotal = (img && (align&FL_ALIGN_IMAGE_NEXT_TO_TEXT)) ? img->w() + gap : 0;
int strw = 0; // Width of text only without symbols int strw = 0; // Width of text only without symbols
int strh; // Height of text only without symbols int strh; // Height of text only without symbols
@ -289,7 +289,7 @@ void fl_draw(
// Figure out vertical position of the first element // Figure out vertical position of the first element
int xpos; // Position of image or text int xpos; // Position of image or text
int ypos; // Position of image or text int ypos; // Position of image or text
int imgh = img && imgvert ? img->h() : 0; // Height of image if image is above or below text int imgh = img && imgvert ? img->h() + gap : 0; // Height of image if image is above or below text
int imgw[2] = {0, 0}; // Width of image on the left and right side of the text int imgw[2] = {0, 0}; // Width of image on the left and right side of the text
symoffset = 0; symoffset = 0;
@ -316,14 +316,14 @@ void fl_draw(
} }
img->draw(xpos, ypos - height); img->draw(xpos, ypos - height);
ypos += img->h(); ypos += img->h() + gap;
} }
// Draw the image if either on the *left* or *right* side of the text // Draw the image if either on the *left* or *right* side of the text
if (img && !imgvert) { if (img && !imgvert) {
if (align & FL_ALIGN_TEXT_OVER_IMAGE) { if (align & FL_ALIGN_TEXT_OVER_IMAGE) {
// Image is to the right of the text // Image is to the right of the text
imgw[1] = img->w(); imgw[1] = img->w() + gap;
// Find the horizontal position of the image // Find the horizontal position of the image
if (align & FL_ALIGN_LEFT) { if (align & FL_ALIGN_LEFT) {
xpos = x + symwidth[0] + strw + 1; xpos = x + symwidth[0] + strw + 1;
@ -332,9 +332,10 @@ void fl_draw(
} else { } else {
xpos = x + (w - strw - symtotal - imgw[1]) / 2 + symwidth[0] + strw + 1; xpos = x + (w - strw - symtotal - imgw[1]) / 2 + symwidth[0] + strw + 1;
} }
xpos += gap;
} else { } else {
// Image is to the left of the text // Image is to the left of the text
imgw[0] = img->w(); imgw[0] = img->w() + gap;
// Find the horizontal position of the image // Find the horizontal position of the image
if (align & FL_ALIGN_LEFT) { if (align & FL_ALIGN_LEFT) {
xpos = x + symwidth[0] - 1; xpos = x + symwidth[0] - 1;
@ -361,10 +362,12 @@ void fl_draw(
if (str) { if (str) {
int desc = fl_descent(); int desc = fl_descent();
for (p=str; ; ypos += height) { for (p=str; ; ypos += height) {
if (lines>1) if (lines>1) {
e = expand_text_(p, linebuf, 0, w - symtotal - imgtotal, buflen, e = expand_text_(p, linebuf, 0, w - symtotal - imgtotal, buflen,
width, align&FL_ALIGN_WRAP, draw_symbols); width, align&FL_ALIGN_WRAP, draw_symbols);
else e = ""; } else {
e = "";
}
if (width > symoffset) symoffset = (int)(width + 0.5); if (width > symoffset) symoffset = (int)(width + 0.5);
@ -398,7 +401,7 @@ void fl_draw(
xpos = x + (w - img->w() - symtotal) / 2 + symwidth[0]; xpos = x + (w - img->w() - symtotal) / 2 + symwidth[0];
} }
img->draw(xpos, ypos); img->draw(xpos, ypos + gap);
} }
// Draw the symbols, if any... // Draw the symbols, if any...
@ -465,20 +468,21 @@ void fl_draw(
\param[in] img pointer to image \param[in] img pointer to image
\param[in] draw_symbols if true, interprete leading and trailing '@sym' \param[in] draw_symbols if true, interprete leading and trailing '@sym'
as graphical symbols as graphical symbols
\param[in] text_to_image_spacing spacing between text and image \param[in] gap spacing between text and image
*/ */
void fl_draw( void fl_draw(
const char* str, const char* str,
int x, int y, int w, int h, int x, int y, int w, int h,
Fl_Align align, Fl_Align align,
Fl_Image* img, Fl_Image* img,
int draw_symbols) int draw_symbols,
int gap)
{ {
if ((!str || !*str) && !img) return; if ((!str || !*str) && !img) return;
if (w && h && !fl_not_clipped(x, y, w, h) && (align & FL_ALIGN_INSIDE)) return; if (w && h && !fl_not_clipped(x, y, w, h) && (align & FL_ALIGN_INSIDE)) return;
if (align & FL_ALIGN_CLIP) if (align & FL_ALIGN_CLIP)
fl_push_clip(x, y, w, h); fl_push_clip(x, y, w, h);
fl_draw(str, x, y, w, h, align, fl_draw, img, draw_symbols); fl_draw(str, x, y, w, h, align, fl_draw, img, draw_symbols, gap);
if (align & FL_ALIGN_CLIP) if (align & FL_ALIGN_CLIP)
fl_pop_clip(); fl_pop_clip();
} }