summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
Diffstat (limited to 'libs')
-rw-r--r--libs/canvas/canvas/fill.h6
-rw-r--r--libs/canvas/fill.cc28
2 files changed, 33 insertions, 1 deletions
diff --git a/libs/canvas/canvas/fill.h b/libs/canvas/canvas/fill.h
index fa6b12e9f8..ae87edb2dc 100644
--- a/libs/canvas/canvas/fill.h
+++ b/libs/canvas/canvas/fill.h
@@ -20,6 +20,7 @@
#ifndef __CANVAS_FILL_H__
#define __CANVAS_FILL_H__
+#include <vector>
#include <stdint.h>
#include "canvas/item.h"
@@ -40,12 +41,17 @@ public:
bool fill () const {
return _fill;
}
+
+ typedef std::vector<std::pair<double,Color> > StopList;
+ void set_gradient (StopList const & stops, double height);
+
protected:
void setup_fill_context (Cairo::RefPtr<Cairo::Context>) const;
Color _fill_color;
bool _fill;
+ Cairo::RefPtr<Cairo::LinearGradient> _gradient;
};
}
diff --git a/libs/canvas/fill.cc b/libs/canvas/fill.cc
index da475a9881..339549f8be 100644
--- a/libs/canvas/fill.cc
+++ b/libs/canvas/fill.cc
@@ -59,5 +59,31 @@ Fill::set_fill (bool fill)
void
Fill::setup_fill_context (Cairo::RefPtr<Cairo::Context> context) const
{
- set_source_rgba (context, _fill_color);
+ if (_gradient) {
+ context->set_source (_gradient);
+ } else {
+ set_source_rgba (context, _fill_color);
+ }
+}
+
+void
+Fill::set_gradient (StopList const & stops, double height)
+{
+ begin_visual_change ();
+
+ if (stops.empty()) {
+ _gradient.clear();
+ } else {
+
+ double r, g, b, a;
+
+ _gradient = Cairo::LinearGradient::create (0, 0, 0, height);
+
+ for (StopList::const_iterator s = stops.begin(); s != stops.end(); ++s) {
+ color_to_rgba (s->second, r, g, b, a);
+ _gradient->add_color_stop_rgba (s->first, r, g, b, a);
+ }
+ }
+
+ end_visual_change ();
}