workaround/hack/fix for cairo pattern gradient space exceeding 2^16 size limit
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 27 Jun 2013 14:41:00 +0000 (10:41 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 27 Jun 2013 14:41:00 +0000 (10:41 -0400)
gtk2_ardour/time_axis_view_item.cc
libs/canvas/canvas/fill.h
libs/canvas/fill.cc
libs/canvas/rectangle.cc
libs/canvas/text.cc

index 24a1c711ba36de5bfa66b18386413af3e0212b2d..bdfb0951092ed67a7e013f40d46f8c4c1f6e4e45 100644 (file)
@@ -879,7 +879,7 @@ TimeAxisViewItem::set_frame_gradient ()
        ArdourCanvas::Color darker = ArdourCanvas::hsv_to_color (h, s, v, a);
        stops.push_back (std::make_pair (1.0, darker));
        
-       frame->set_gradient (stops, _height);
+       frame->set_gradient (stops, true);
 }
 
 /**
index ae87edb2dc1c6899618d115f1ce18dc3432167f9..f52260c571367c689cf5a97a0353a40d6805a5ad 100644 (file)
@@ -44,14 +44,16 @@ public:
 
         typedef std::vector<std::pair<double,Color> > StopList;
        
-        void set_gradient (StopList const & stops, double height);
+        void set_gradient (StopList const & stops, bool is_vertical);
 
 protected:
        void setup_fill_context (Cairo::RefPtr<Cairo::Context>) const;
-       
+        void setup_gradient_context (Cairo::RefPtr<Cairo::Context>, Rect const &, Duple const &) const;
+               
        Color _fill_color;
        bool _fill;
-        Cairo::RefPtr<Cairo::LinearGradient> _gradient;
+        StopList _stops;
+        bool _vertical_gradient;
 };
 
 }
index e33c5d2bc063cf5cf990610fd4beb2d7222f4780..8a16f4f794099d6250f054ced93b98928efee98d 100644 (file)
@@ -59,37 +59,39 @@ Fill::set_fill (bool fill)
 void
 Fill::setup_fill_context (Cairo::RefPtr<Cairo::Context> context) const
 {
-       if (_gradient) {
-               Cairo::Matrix m;
-
-               Duple origin = item_to_window (Duple (0, 0));
-
-               context->translate (origin.x, origin.y);
-               context->set_source (_gradient);
-               context->translate (-origin.x, -origin.y);
+       set_source_rgba (context, _fill_color);
+}
 
+void
+Fill::setup_gradient_context (Cairo::RefPtr<Cairo::Context> context, Rect const & self, Duple const & draw_origin) const
+{
+       Cairo::RefPtr<Cairo::LinearGradient> _gradient;
+       
+       if (_vertical_gradient) {
+               _gradient = Cairo::LinearGradient::create (draw_origin.x, self.y0, draw_origin.x, self.y1);
        } else {
-               set_source_rgba (context, _fill_color);
+               _gradient = Cairo::LinearGradient::create (self.x0, draw_origin.y, self.x1, draw_origin.y);
        }
+       
+       for (StopList::const_iterator s = _stops.begin(); s != _stops.end(); ++s) {
+               double r, g, b, a;
+               color_to_rgba (s->second, r, g, b, a);
+               _gradient->add_color_stop_rgba (s->first, r, g, b, a);
+       }
+       
+       context->set_source (_gradient);
 }
 
 void
-Fill::set_gradient (StopList const & stops, double height)
+Fill::set_gradient (StopList const & stops, bool vertical)
 {
        begin_visual_change ();
 
        if (stops.empty()) {
-               _gradient.clear();
+               _stops.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);
-               }
+               _stops = stops;
+               _vertical_gradient = vertical;
        }
 
        end_visual_change ();
index 9512b69417ffd4bfa7ce5b13ec824ee7cd872758..2207ea80a12dd3908003436dd10933516cccc8e0 100644 (file)
@@ -72,7 +72,11 @@ Rectangle::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) con
        Rect stroke_rect = fill_rect.expand (0.5);
 
        if (_fill) {
-               setup_fill_context (context);
+               if (_stops.empty()) {
+                       setup_fill_context (context);
+               } else {
+                       setup_gradient_context (context, self, Duple (draw.x0, draw.y0));
+               }
                context->rectangle (fill_rect.x0, fill_rect.y0, fill_rect.width(), fill_rect.height());
                context->fill ();
        }
index 511bf6e62969579b4bbd29f8683c476f7923a1fb..7143f2aca704257547c5a1fe06671af79405b7f9 100644 (file)
@@ -151,8 +151,7 @@ Text::compute_bounding_box () const
                        Pango::Rectangle const r = layout->get_ink_extents ();
                        
                        _bounding_box = Rect (
-                               r.get_x() / Pango::SCALE,
-                               r.get_y() / Pango::SCALE,
+                               0, 0, 
                                (r.get_x() + r.get_width()) / Pango::SCALE,
                                (r.get_y() + r.get_height()) / Pango::SCALE
                                );