diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2023-01-03 19:40:37 +0100 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2023-01-05 01:06:25 +0100 |
| commit | 4d1a508c7e4d28fd53129da79f068a275d7160bd (patch) | |
| tree | aa34c8312fc197f5bfd18a16b6537ddce380afbc | |
| parent | b5b88d5f0dcb682df1ad80ac8939fcfc1f6671da (diff) | |
Refactor drawing small circles: add fl_draw_circle()
This method can be used to draw small circles as part of the GUI.
It is independent of the current scheme.
Very small circles are approximated by drawing several rectangles.
| -rw-r--r-- | FL/fl_draw.H | 5 | ||||
| -rw-r--r-- | src/Fl_Menu.cxx | 32 | ||||
| -rw-r--r-- | src/fl_draw.cxx | 58 |
3 files changed, 66 insertions, 29 deletions
diff --git a/FL/fl_draw.H b/FL/fl_draw.H index 33c1f716f..2c08fe6c3 100644 --- a/FL/fl_draw.H +++ b/FL/fl_draw.H @@ -1,7 +1,7 @@ // // Portable drawing function header file for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2022 by Bill Spitzak and others. +// Copyright 1998-2023 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -972,6 +972,9 @@ void fl_draw_check(Fl_Rect bb, Fl_Color col); // Draw one or more "arrows" (triangles) FL_EXPORT void fl_draw_arrow(Fl_Rect bb, Fl_Arrow_Type t, Fl_Orientation o, Fl_Color color); +// Draw a potentially small, filled circle +FL_EXPORT void fl_draw_circle(int x0, int y0, int d, Fl_Color color); + // images: /** diff --git a/src/Fl_Menu.cxx b/src/Fl_Menu.cxx index d726a692b..e50393e7a 100644 --- a/src/Fl_Menu.cxx +++ b/src/Fl_Menu.cxx @@ -1,7 +1,7 @@ // // Menu code for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2022 by Bill Spitzak and others. +// Copyright 1998-2023 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -245,34 +245,12 @@ void Fl_Menu_Item::draw(int x, int y, int w, int h, const Fl_Menu_* m, tW --; fl_pie(x + td + 1, y + d + td - 1, tW + 3, tW + 3, 0.0, 360.0); fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.2f)); - } else fl_color(labelcolor_); - - switch (tW) { - // Larger circles draw fine... - default : - fl_pie(x + td + 2, y + d + td, tW, tW, 0.0, 360.0); - break; - - // Small circles don't draw well on many systems... - case 6 : - fl_rectf(x + td + 4, y + d + td, tW - 4, tW); - fl_rectf(x + td + 3, y + d + td + 1, tW - 2, tW - 2); - fl_rectf(x + td + 2, y + d + td + 2, tW, tW - 4); - break; - - case 5 : - case 4 : - case 3 : - fl_rectf(x + td + 3, y + d + td, tW - 2, tW); - fl_rectf(x + td + 2, y + d + td + 1, tW, tW - 2); - break; - - case 2 : - case 1 : - fl_rectf(x + td + 2, y + d + td, tW, tW); - break; + } else { + fl_color(labelcolor_); } + fl_draw_circle(x + td + 2, y + d + td, tW, fl_color()); + if (Fl::is_scheme("gtk+")) { fl_color(fl_color_average(FL_WHITE, FL_SELECTION_COLOR, 0.5)); fl_arc(x + td + 2, y + d + td, tW + 1, tW + 1, 60.0, 180.0); diff --git a/src/fl_draw.cxx b/src/fl_draw.cxx index 7b36d4c75..17a6a24bf 100644 --- a/src/fl_draw.cxx +++ b/src/fl_draw.cxx @@ -1,7 +1,7 @@ // // Label drawing code for the Fast Light Tool Kit (FLTK). // -// Copyright 1998-2022 by Bill Spitzak and others. +// Copyright 1998-2023 by Bill Spitzak and others. // // This library is free software. Distribution and use rights are outlined in // the file "COPYING" which should have been included with this file. If this @@ -587,3 +587,59 @@ void fl_draw_check(Fl_Rect bb, Fl_Color col) { fl_color(saved_color); } // fl_draw_check() + +/** + Draw a potentially small, filled circle as a GUI element. + + This method draws a filled circle, using fl_pie() if the given diameter + \p d is larger than 6 pixels (aka FLTK units). + + If \p d is 6 or smaller it approximates a filled circle by drawing several + filled rectangles, depending on the size because fl_pie() might not draw + well on many systems for smaller sizes. + + \param[in] x0,y0 coordinates of top left of the bounding box + \param[in] d diameter == width and height of the bounding box + \param[in] color drawing color +*/ +void fl_draw_circle(int x0, int y0, int d, Fl_Color color) { + +#define DEBUG_DRAW_CIRCLE (0) // bit 1 = draw bounding box (green) + + Fl_Color saved_color = fl_color(); + +#if (DEBUG_DRAW_CIRCLE & 1) + fl_rectf(x0, y0, d, d, FL_GREEN); +#endif + + // draw the circle + + switch (d) { + // Larger circles draw fine... + default: + fl_pie(x0, y0, d, d, 0.0, 360.0); + break; + + // Small circles don't draw well on many systems... + case 6: + fl_rectf(x0 + 2, y0, d - 4, d); + fl_rectf(x0 + 1, y0 + 1, d - 2, d - 2); + fl_rectf(x0, y0 + 2, d, d - 4); + break; + + case 5: + case 4: + case 3: + fl_rectf(x0 + 1, y0, d - 2, d); + fl_rectf(x0, y0 + 1, d, d - 2); + break; + + case 2: + case 1: + fl_rectf(x0, y0, d, d); + break; + } + + fl_color(saved_color); + +} // fl_draw_circle() |
