diff options
| author | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-11-29 12:28:31 +0100 |
|---|---|---|
| committer | ManoloFLTK <41016272+ManoloFLTK@users.noreply.github.com> | 2022-11-29 12:28:31 +0100 |
| commit | 00884f28e2610e266dc653a34b45da1af2613e31 (patch) | |
| tree | 550c7a50bd94071205e3734065851d5681325edd /src/fl_symbols.cxx | |
| parent | 7a42a80caf870a4b199887e766b3df4e71b49f7e (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/fl_symbols.cxx')
| -rw-r--r-- | src/fl_symbols.cxx | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/src/fl_symbols.cxx b/src/fl_symbols.cxx index 2f86c2394..e6ebb4199 100644 --- a/src/fl_symbols.cxx +++ b/src/fl_symbols.cxx @@ -238,8 +238,15 @@ static void draw_search(Fl_Color col) static void draw_arrow1(Fl_Color col) { fl_color(col); - BP; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,-0.4); EP; - BP; vv(0.0,0.8); vv(0.8,0.0); vv(0.0,-0.8); vv(0.0,-0.4); vv(0.0,0.4); EP; + if (fl_graphics_driver->can_fill_non_convex_polygon()) { + // draw the arrow as a 7-vertex filled polygon + BP; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,0.8); vv(0.8,0.0); + vv(0.0,-0.8); vv(0.0,-0.4); EP; + } else { + // draw the arrow as a rectangle plus a triangle + BP; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,-0.4); EP; + BP; vv(0.0,0.8); vv(0.8,0.0); vv(0.0,-0.8); vv(0.0,-0.4); vv(0.0,0.4); EP; + } set_outline_color(col); BC; vv(-0.8,-0.4); vv(-0.8,0.4); vv(0.0,0.4); vv(0.0,0.8); vv(0.8,0.0); vv(0.0,-0.8); vv(0.0,-0.4); EC; |
