diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/canvas/canvas/fill.h | 6 | ||||
-rw-r--r-- | libs/canvas/fill.cc | 28 |
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 (); } |