diff options
author | Neil <nyamatongwe@gmail.com> | 2021-03-25 10:07:29 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2021-03-25 10:07:29 +1100 |
commit | 6ca286d41a1ca8e6d948d131fdaaf8b8199c905e (patch) | |
tree | 417cd9fa371dac8432198aed2005a96ae6f3a6c3 /gtk/PlatGTK.cxx | |
parent | 216fca2d218c3e0dcb5cdb4273cfb609da06cbd2 (diff) | |
download | scintilla-mirror-6ca286d41a1ca8e6d948d131fdaaf8b8199c905e.tar.gz |
Use FillStroke for parameters to Polygon, RectangleDraw, RoundedRectangle, and
Ellipse.
Diffstat (limited to 'gtk/PlatGTK.cxx')
-rwxr-xr-x | gtk/PlatGTK.cxx | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx index b1079a31a..b71689007 100755 --- a/gtk/PlatGTK.cxx +++ b/gtk/PlatGTK.cxx @@ -162,17 +162,21 @@ public: void MoveTo(int x_, int y_) override; void LineTo(int x_, int y_) override; void Polygon(Point *pts, size_t npts, ColourDesired fore, ColourDesired back) override; + void Polygon(const Point *pts, size_t npts, FillStroke fillStroke) override; void RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) override; + void RectangleDraw(PRectangle rc, FillStroke fillStroke) override; void FillRectangle(PRectangle rc, ColourDesired back) override; void FillRectangle(PRectangle rc, Fill fill) override; void FillRectangle(PRectangle rc, Surface &surfacePattern) override; void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override; + void RoundedRectangle(PRectangle rc, FillStroke fillStroke) override; void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill, ColourDesired outline, int alphaOutline, int flags) override; void AlphaRectangle(PRectangle rc, XYPOSITION cornerSize, FillStroke fillStroke) override; void GradientRectangle(PRectangle rc, const std::vector<ColourStop> &stops, GradientOptions options) override; void DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) override; void Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back) override; + void Ellipse(PRectangle rc, FillStroke fillStroke) override; void Copy(PRectangle rc, Point from, Surface &surfaceSource) override; std::unique_ptr<IScreenLineLayout> Layout(const IScreenLine *screenLine) override; @@ -494,6 +498,20 @@ void SurfaceImpl::Polygon(Point *pts, size_t npts, ColourDesired fore, cairo_stroke(context); } +void SurfaceImpl::Polygon(const Point *pts, size_t npts, FillStroke fillStroke) { + PLATFORM_ASSERT(context); + PenColourAlpha(fillStroke.fill.colour); + cairo_move_to(context, pts[0].x, pts[0].y); + for (size_t i = 1; i < npts; i++) { + cairo_line_to(context, pts[i].x, pts[i].y); + } + cairo_close_path(context); + cairo_fill_preserve(context); + PenColourAlpha(fillStroke.stroke.colour); + cairo_set_line_width(context, fillStroke.stroke.width); + cairo_stroke(context); +} + void SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired back) { if (context) { cairo_rectangle(context, rc.left + 0.5, rc.top + 0.5, @@ -505,6 +523,17 @@ void SurfaceImpl::RectangleDraw(PRectangle rc, ColourDesired fore, ColourDesired } } +void SurfaceImpl::RectangleDraw(PRectangle rc, FillStroke fillStroke) { + if (context) { + CairoRectangle(rc.Inset(fillStroke.stroke.width / 2)); + PenColourAlpha(fillStroke.fill.colour); + cairo_fill_preserve(context); + PenColourAlpha(fillStroke.stroke.colour); + cairo_set_line_width(context, fillStroke.stroke.width); + cairo_stroke(context); + } +} + void SurfaceImpl::FillRectangle(PRectangle rc, ColourDesired back) { PenColour(back); if (context && (rc.left < maxCoordinate)) { // Protect against out of range @@ -553,6 +582,25 @@ void SurfaceImpl::RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesi } } +void SurfaceImpl::RoundedRectangle(PRectangle rc, FillStroke fillStroke) { + if (((rc.right - rc.left) > 4) && ((rc.bottom - rc.top) > 4)) { + // Approximate a round rect with some cut off corners + Point pts[] = { + Point(rc.left + 2, rc.top), + Point(rc.right - 2, rc.top), + Point(rc.right, rc.top + 2), + Point(rc.right, rc.bottom - 2), + Point(rc.right - 2, rc.bottom), + Point(rc.left + 2, rc.bottom), + Point(rc.left, rc.bottom - 2), + Point(rc.left, rc.top + 2), + }; + Polygon(pts, std::size(pts), fillStroke); + } else { + RectangleDraw(rc, fillStroke); + } +} + static void PathRoundRectangle(cairo_t *context, double left, double top, double width, double height, double radius) noexcept { constexpr double degrees = kPi / 180.0; @@ -680,6 +728,17 @@ void SurfaceImpl::Ellipse(PRectangle rc, ColourDesired fore, ColourDesired back) cairo_stroke(context); } +void SurfaceImpl::Ellipse(PRectangle rc, FillStroke fillStroke) { + PLATFORM_ASSERT(context); + PenColourAlpha(fillStroke.fill.colour); + cairo_arc(context, (rc.left + rc.right) / 2, (rc.top + rc.bottom) / 2, + (std::min(rc.Width(), rc.Height()) - fillStroke.stroke.width) / 2, 0, 2*kPi); + cairo_fill_preserve(context); + PenColourAlpha(fillStroke.stroke.colour); + cairo_set_line_width(context, fillStroke.stroke.width); + cairo_stroke(context); +} + void SurfaceImpl::Copy(PRectangle rc, Point from, Surface &surfaceSource) { SurfaceImpl &surfi = static_cast<SurfaceImpl &>(surfaceSource); const bool canDraw = surfi.psurf != nullptr; |