aboutsummaryrefslogtreecommitdiffhomepage
path: root/gtk/PlatGTK.cxx
diff options
context:
space:
mode:
authormitchell <unknown>2018-05-25 17:44:28 -0400
committermitchell <unknown>2018-05-25 17:44:28 -0400
commitfba451a1d76be9b6945c9d5d7e219f7d7d1a4260 (patch)
tree0e1aa6f197c34e6c1a9782e264359c220ed014a7 /gtk/PlatGTK.cxx
parent9f00df4e57e917035d2f939ce70ccf2ee83a9725 (diff)
downloadscintilla-mirror-fba451a1d76be9b6945c9d5d7e219f7d7d1a4260.tar.gz
Backport: Add GradientRectangle method to Surface to draw rectangles with vertical or horizontal gradients.
Backport of changeset 6965:90c71d69e3b6.
Diffstat (limited to 'gtk/PlatGTK.cxx')
-rw-r--r--gtk/PlatGTK.cxx27
1 files changed, 27 insertions, 0 deletions
diff --git a/gtk/PlatGTK.cxx b/gtk/PlatGTK.cxx
index 539402b01..26e1b5f58 100644
--- a/gtk/PlatGTK.cxx
+++ b/gtk/PlatGTK.cxx
@@ -160,6 +160,7 @@ public:
void RoundedRectangle(PRectangle rc, ColourDesired fore, ColourDesired back) override;
void AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fill, int alphaFill,
ColourDesired outline, int alphaOutline, int flags) 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 Copy(PRectangle rc, Point from, Surface &surfaceSource) override;
@@ -544,6 +545,32 @@ void SurfaceImpl::AlphaRectangle(PRectangle rc, int cornerSize, ColourDesired fi
}
}
+void SurfaceImpl::GradientRectangle(PRectangle rc, const std::vector<ColourStop> &stops, GradientOptions options) {
+ if (context) {
+ cairo_pattern_t *pattern;
+ switch (options) {
+ case GradientOptions::leftToRight:
+ pattern = cairo_pattern_create_linear(rc.left, rc.top, rc.right, rc.top);
+ break;
+ case GradientOptions::topToBottom:
+ default:
+ pattern = cairo_pattern_create_linear(rc.left, rc.top, rc.left, rc.bottom);
+ break;
+ }
+ for (const ColourStop &stop : stops) {
+ cairo_pattern_add_color_stop_rgba(pattern, stop.position,
+ stop.colour.GetRedComponent(),
+ stop.colour.GetGreenComponent(),
+ stop.colour.GetBlueComponent(),
+ stop.colour.GetAlphaComponent());
+ }
+ cairo_rectangle(context, rc.left, rc.top, rc.Width(), rc.Height());
+ cairo_set_source(context, pattern);
+ cairo_fill(context);
+ cairo_pattern_destroy(pattern);
+ }
+}
+
void SurfaceImpl::DrawRGBAImage(PRectangle rc, int width, int height, const unsigned char *pixelsImage) {
PLATFORM_ASSERT(context);
if (rc.Width() > width)