summaryrefslogtreecommitdiff
path: root/src/drivers/Xlib
diff options
context:
space:
mode:
authorManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-11-29 12:28:31 +0100
committerManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com>2022-11-29 12:28:31 +0100
commit00884f28e2610e266dc653a34b45da1af2613e31 (patch)
tree550c7a50bd94071205e3734065851d5681325edd /src/drivers/Xlib
parent7a42a80caf870a4b199887e766b3df4e71b49f7e (diff)
Fix for issue [Cairo]: Arrows have a "gap" (#561)
The problem to fix is that the arrow drawn by draw_arrow1() in src/fl_symbols.cxx displays a faint clear line between the stem and head of the arrow with the Cairo graphics driver. This occurs because draw_arrow1() draws the arrow in 2 steps (a rectangle + a triangle) and the Cairo driver is configured to use antialiasing when filling polygons. The antialiasing produces the faint line between stem and head. Why does draw_arrow1() draw a rectangle + a triangle rather than a 7-vertex polygon? That's because the X11 graphics driver fails with its polygon- drawing function when the polygon is also rotated: the polygon is drawn empty. We want to keep using antialiasing under Cairo for polygons because the result is better with non horizontal/vertical polygon edges. This implementation changes function draw_arrow1() which draws the arrow as a 7-vertex filled polygon except when the graphics driver returns false for its virtual member function can_fill_non_convex_polygon(). In that situation, draw_arrow1() draws, as before, a rectangle + a triangle. The new, virtual member function can_fill_non_convex_polygon() returns true except for the X11 graphics driver. Therefore, draw_arrow1() is effectively unchanged under the X11 driver.
Diffstat (limited to 'src/drivers/Xlib')
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H1
-rw-r--r--src/drivers/Xlib/Fl_Xlib_Graphics_Driver_vertex.cxx4
2 files changed, 5 insertions, 0 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H
index 899d39819..016ace499 100644
--- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H
+++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver.H
@@ -193,6 +193,7 @@ protected:
void end_loop();
void end_polygon();
void end_complex_polygon();
+ bool can_fill_non_convex_polygon();
void gap();
virtual void ellipse_unscaled(double xt, double yt, double rx, double ry);
virtual void arc_unscaled(int x, int y, int w, int h, double a1, double a2);
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_vertex.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_vertex.cxx
index 3b43a360a..1b6e7b430 100644
--- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_vertex.cxx
+++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_vertex.cxx
@@ -76,6 +76,10 @@ void Fl_Xlib_Graphics_Driver::end_complex_polygon() {
if (n>2) XFillPolygon(fl_display, fl_window, gc_, short_point, n, 0, 0);
}
+bool Fl_Xlib_Graphics_Driver::can_fill_non_convex_polygon() {
+ return false;
+}
+
// shortcut the closed circles so they use XDrawArc:
// warning: these do not draw rotated ellipses correctly!
// See fl_arc.c for portable version.