diff --git a/Userland/Libraries/LibGfx/AntiAliasingPainter.cpp b/Userland/Libraries/LibGfx/AntiAliasingPainter.cpp index c16904d07e..4f0a579021 100644 --- a/Userland/Libraries/LibGfx/AntiAliasingPainter.cpp +++ b/Userland/Libraries/LibGfx/AntiAliasingPainter.cpp @@ -18,7 +18,7 @@ namespace Gfx { -template +template void AntiAliasingPainter::draw_anti_aliased_line(FloatPoint actual_from, FloatPoint actual_to, Color color, float thickness, Painter::LineStyle style, Color) { // FIXME: Implement this :P @@ -46,9 +46,11 @@ void AntiAliasingPainter::draw_anti_aliased_line(FloatPoint actual_from, FloatPo // Axis-aligned lines: if (mapped_from.y() == mapped_to.y()) { auto start_point = (mapped_from.x() < mapped_to.x() ? mapped_from : mapped_to).translated(0, -int_thickness / 2); - // FIXME: SVG fill_path() hack: - // SVG asks for 1px scanlines at floating point y values, if they're not rounded to a pixel they look faint. - start_point.set_y(round_to(start_point.y())); + if constexpr (path_hacks == FixmeEnableHacksForBetterPathPainting::Yes) { + // FIXME: SVG fill_path() hack: + // SVG asks for 1px scanlines at floating point y values, if they're not rounded to a pixel they look faint. + start_point.set_y(round_to(start_point.y())); + } return fill_rect(Gfx::FloatRect(start_point, { length, float(int_thickness) }), color); } if (mapped_from.x() == mapped_to.x()) { @@ -56,11 +58,14 @@ void AntiAliasingPainter::draw_anti_aliased_line(FloatPoint actual_from, FloatPo return fill_rect(Gfx::FloatRect(start_point, { float(int_thickness), length }), color); } - // FIXME: SVG stoke_path() hack: - // When painting stokes SVG asks for many thickness * < 1px lines. - // It actually wants a thickness * thickness dot centered at that point. - if (length < 1.0f) - return fill_rect(Gfx::FloatRect::centered_at(mapped_from, { thickness, thickness }), color); + if constexpr (path_hacks == FixmeEnableHacksForBetterPathPainting::Yes) { + // FIXME: SVG stoke_path() hack: + // When painting stokes SVG asks for many thickness * < 1px lines. + // It actually wants a thickness * thickness dot centered at that point. + // (Technically this should be rotated or a circle, but that currently gives worse results) + if (length < 1.0f) + return fill_rect(Gfx::FloatRect::centered_at(mapped_from, { thickness, thickness }), color); + } // The painting only works for the positive XY quadrant (because that is easier). // So flip things around until we're there: @@ -145,9 +150,9 @@ void AntiAliasingPainter::draw_anti_aliased_line(FloatPoint actual_from, FloatPo } } -void AntiAliasingPainter::draw_aliased_line(FloatPoint const& actual_from, FloatPoint const& actual_to, Color color, float thickness, Painter::LineStyle style, Color alternate_color) +void AntiAliasingPainter::draw_line_for_path(FloatPoint const& actual_from, FloatPoint const& actual_to, Color color, float thickness, Painter::LineStyle style, Color alternate_color) { - draw_anti_aliased_line(actual_from, actual_to, color, thickness, style, alternate_color); + draw_anti_aliased_line(actual_from, actual_to, color, thickness, style, alternate_color); } void AntiAliasingPainter::draw_dotted_line(IntPoint point1, IntPoint point2, Color color, int thickness) @@ -196,7 +201,7 @@ void AntiAliasingPainter::draw_line(FloatPoint const& actual_from, FloatPoint co { if (style == Painter::LineStyle::Dotted) return draw_dotted_line(actual_from.to_rounded(), actual_to.to_rounded(), color, static_cast(round(thickness))); - draw_anti_aliased_line(actual_from, actual_to, color, thickness, style, alternate_color); + draw_anti_aliased_line(actual_from, actual_to, color, thickness, style, alternate_color); } void AntiAliasingPainter::fill_path(Path& path, Color color, Painter::WindingRule rule) @@ -263,21 +268,21 @@ void AntiAliasingPainter::stroke_path(Path const& path, Color color, float thick void AntiAliasingPainter::draw_elliptical_arc(FloatPoint const& p1, FloatPoint const& p2, FloatPoint const& center, FloatPoint const& radii, float x_axis_rotation, float theta_1, float theta_delta, Color color, float thickness, Painter::LineStyle style) { Painter::for_each_line_segment_on_elliptical_arc(p1, p2, center, radii, x_axis_rotation, theta_1, theta_delta, [&](FloatPoint const& fp1, FloatPoint const& fp2) { - draw_line(fp1, fp2, color, thickness, style); + draw_line_for_path(fp1, fp2, color, thickness, style); }); } void AntiAliasingPainter::draw_quadratic_bezier_curve(FloatPoint const& control_point, FloatPoint const& p1, FloatPoint const& p2, Color color, float thickness, Painter::LineStyle style) { Painter::for_each_line_segment_on_bezier_curve(control_point, p1, p2, [&](FloatPoint const& fp1, FloatPoint const& fp2) { - draw_line(fp1, fp2, color, thickness, style); + draw_line_for_path(fp1, fp2, color, thickness, style); }); } void AntiAliasingPainter::draw_cubic_bezier_curve(FloatPoint const& control_point_0, FloatPoint const& control_point_1, FloatPoint const& p1, FloatPoint const& p2, Color color, float thickness, Painter::LineStyle style) { Painter::for_each_line_segment_on_cubic_bezier_curve(control_point_0, control_point_1, p1, p2, [&](FloatPoint const& fp1, FloatPoint const& fp2) { - draw_line(fp1, fp2, color, thickness, style); + draw_line_for_path(fp1, fp2, color, thickness, style); }); } diff --git a/Userland/Libraries/LibGfx/AntiAliasingPainter.h b/Userland/Libraries/LibGfx/AntiAliasingPainter.h index 6f3ffef2ce..c5f1324ae9 100644 --- a/Userland/Libraries/LibGfx/AntiAliasingPainter.h +++ b/Userland/Libraries/LibGfx/AntiAliasingPainter.h @@ -20,7 +20,7 @@ public: } void draw_line(FloatPoint const&, FloatPoint const&, Color, float thickness = 1, Painter::LineStyle style = Painter::LineStyle::Solid, Color alternate_color = Color::Transparent); - void draw_aliased_line(FloatPoint const&, FloatPoint const&, Color, float thickness = 1, Painter::LineStyle style = Painter::LineStyle::Solid, Color alternate_color = Color::Transparent); + void draw_line_for_path(FloatPoint const&, FloatPoint const&, Color, float thickness = 1, Painter::LineStyle style = Painter::LineStyle::Solid, Color alternate_color = Color::Transparent); void fill_path(Path&, Color, Painter::WindingRule rule = Painter::WindingRule::Nonzero); void stroke_path(Path const&, Color, float thickness); void draw_quadratic_bezier_curve(FloatPoint const& control_point, FloatPoint const&, FloatPoint const&, Color, float thickness = 1, Painter::LineStyle style = Painter::LineStyle::Solid); @@ -77,11 +77,11 @@ private: void draw_dotted_line(IntPoint, IntPoint, Gfx::Color, int thickness); - enum class AntiAliasPolicy { - OnlyEnds, - Full, + enum class FixmeEnableHacksForBetterPathPainting { + Yes, + No, }; - template + template void draw_anti_aliased_line(FloatPoint, FloatPoint, Color, float thickness, Painter::LineStyle style, Color alternate_color); void stroke_segment_intersection(FloatPoint const& current_line_a, FloatPoint const& current_line_b, FloatLine const& previous_line, Color, float thickness); FloatQuad build_rotated_rectangle(FloatPoint const& direction, float width); diff --git a/Userland/Libraries/LibGfx/FillPathImplementation.h b/Userland/Libraries/LibGfx/FillPathImplementation.h index 192ff85745..238d6906c3 100644 --- a/Userland/Libraries/LibGfx/FillPathImplementation.h +++ b/Userland/Libraries/LibGfx/FillPathImplementation.h @@ -47,8 +47,8 @@ void fill_path(Painter& painter, Path const& path, Color color, Gfx::Painter::Wi using GridCoordinateType = Conditional; using PointType = Point; auto draw_line = [&](auto... args) { - if constexpr (requires { painter.draw_aliased_line(args...); }) - painter.draw_aliased_line(args...); + if constexpr (requires { painter.draw_line_for_path(args...); }) + painter.draw_line_for_path(args...); else painter.draw_line(args...); };