From 478cfae7c857ad4a09adc5473440145cd60633ee Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Wed, 27 Nov 2019 20:52:11 +0100 Subject: [PATCH] LibDraw: Support dotted lines in Painter::draw_line() Painter::draw_line() now has an optional "bool dotted" parameter that causes it to only render every other pixel. Note that this only works with horizontal and vertical lines at the moment and we'll assert if called with dotted=true for a diagonal line. --- Libraries/LibDraw/Painter.cpp | 24 ++++++++++++++++++------ Libraries/LibDraw/Painter.h | 2 +- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Libraries/LibDraw/Painter.cpp b/Libraries/LibDraw/Painter.cpp index 24642c715a..3b08c67bc4 100644 --- a/Libraries/LibDraw/Painter.cpp +++ b/Libraries/LibDraw/Painter.cpp @@ -71,7 +71,6 @@ void Painter::clear_rect(const Rect& a_rect, Color color) } } - void Painter::fill_rect(const Rect& a_rect, Color color) { if (color.alpha() == 0) @@ -774,7 +773,7 @@ void Painter::draw_pixel(const Point& position, Color color, int thickness) fill_rect(rect, color); } -void Painter::draw_line(const Point& p1, const Point& p2, Color color, int thickness) +void Painter::draw_line(const Point& p1, const Point& p2, Color color, int thickness, bool dotted) { auto clip_rect = this->clip_rect(); @@ -797,8 +796,13 @@ void Painter::draw_line(const Point& p1, const Point& p2, Color color, int thick return; int min_y = max(point1.y(), clip_rect.top()); int max_y = min(point2.y(), clip_rect.bottom()); - for (int y = min_y; y <= max_y; ++y) - draw_pixel({ x, y }, color, thickness); + if (dotted) { + for (int y = min_y; y <= max_y; y += 2) + draw_pixel({ x, y }, color, thickness); + } else { + for (int y = min_y; y <= max_y; ++y) + draw_pixel({ x, y }, color, thickness); + } return; } @@ -815,11 +819,19 @@ void Painter::draw_line(const Point& p1, const Point& p2, Color color, int thick return; int min_x = max(point1.x(), clip_rect.left()); int max_x = min(point2.x(), clip_rect.right()); - for (int x = min_x; x <= max_x; ++x) - draw_pixel({ x, y }, color, thickness); + if (dotted) { + for (int x = min_x; x <= max_x; x += 2) + draw_pixel({ x, y }, color, thickness); + } else { + for (int x = min_x; x <= max_x; ++x) + draw_pixel({ x, y }, color, thickness); + } return; } + // FIXME: Implement dotted diagonal lines. + ASSERT(!dotted); + const double adx = abs(point2.x() - point1.x()); const double ady = abs(point2.y() - point1.y()); diff --git a/Libraries/LibDraw/Painter.h b/Libraries/LibDraw/Painter.h index 75cdecad6d..1e64557bf6 100644 --- a/Libraries/LibDraw/Painter.h +++ b/Libraries/LibDraw/Painter.h @@ -26,7 +26,7 @@ public: void draw_bitmap(const Point&, const CharacterBitmap&, Color = Color()); void draw_bitmap(const Point&, const GlyphBitmap&, Color = Color()); void set_pixel(const Point&, Color); - void draw_line(const Point&, const Point&, Color, int thickness = 1); + void draw_line(const Point&, const Point&, Color, int thickness = 1, bool dotted = false); void draw_scaled_bitmap(const Rect& dst_rect, const GraphicsBitmap&, const Rect& src_rect); void blit(const Point&, const GraphicsBitmap&, const Rect& src_rect, float opacity = 1.0f); void blit_dimmed(const Point&, const GraphicsBitmap&, const Rect& src_rect);