Cache entries are now region colour aware.
[ardour.git] / libs / canvas / canvas / wave_view.h
index b80ae5183da5519b3bad7d301917e5ebf1595bb9..c98c62c7a3f731e9d637eb2827126cd973d6d165 100644 (file)
@@ -45,14 +45,33 @@ class WaveViewTest;
        
 namespace ArdourCanvas {
 
-class LIBCANVAS_API WaveView : virtual public Item, public Outline, public Fill
+class LIBCANVAS_API WaveView : public Item
 {
 public:
+
         enum Shape { 
                Normal,
-               Rectified,
+               Rectified
         };
-
+       
+       struct CacheEntry {
+               int channel;
+               Coord height;
+               float amplitude;
+               Color fill_color;
+               Color outline_color;
+               framepos_t start;
+               framepos_t end;
+               Cairo::RefPtr<Cairo::ImageSurface> image;
+       CacheEntry() : 
+               channel (0), height (0), amplitude(0), fill_color (0), 
+                       outline_color (0), start (0), end (0), image (0) {} 
+       CacheEntry(int chan, Coord hght, float amp, Color fcol, Color ocol, 
+                  framepos_t strt, framepos_t ed, Cairo::RefPtr<Cairo::ImageSurface> img) :
+               channel (chan), height (hght), amplitude (amp), fill_color (fcol),
+                       outline_color (ocol), start (strt), end (ed), image (img) {} 
+       };
+       
     /* Displays a single channel of waveform data for the given Region.
 
        x = 0 in the waveview corresponds to the first waveform datum taken
@@ -72,7 +91,8 @@ public:
     */
 
 
-       WaveView (Group *, boost::shared_ptr<ARDOUR::AudioRegion>);
+       WaveView (Canvas *, boost::shared_ptr<ARDOUR::AudioRegion>);
+       WaveView (Group*, boost::shared_ptr<ARDOUR::AudioRegion>);
        ~WaveView ();
 
        void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
@@ -132,13 +152,14 @@ private:
 
         friend class ::WaveViewTest;
 
-       void invalidate_image ();
+       static std::map <boost::shared_ptr<ARDOUR::AudioSource>, std::vector <CacheEntry> > _image_cache;
+       void consolidate_image_cache () const;
+       void invalidate_image_cache ();
 
        boost::shared_ptr<ARDOUR::AudioRegion> _region;
        int    _channel;
        double _samples_per_pixel;
        Coord  _height;
-       Color  _wave_color;
         bool   _show_zero;
         Color  _zero_color;
         Color  _clip_color;
@@ -149,18 +170,14 @@ private:
         bool   _logscaled_independent;
         bool   _gradient_depth_independent;
         double _amplitude_above_axis;
+       float  _region_amplitude;
 
        /** The `start' value to use for the region; we can't use the region's
         *  value as the crossfade editor needs to alter it.
         */
        ARDOUR::frameoffset_t _region_start;
-    
-    
-        mutable ARDOUR::framepos_t _sample_start; 
-        mutable ARDOUR::framepos_t _sample_end; 
-        mutable Cairo::RefPtr<Cairo::ImageSurface> _image;
 
-        PBD::ScopedConnection invalidation_connection;
+        PBD::ScopedConnectionList invalidation_connection;
 
         static double _global_gradient_depth;
         static bool   _global_logscaled;
@@ -171,10 +188,12 @@ private:
         static PBD::Signal0<void> VisualPropertiesChanged;
 
         void handle_visual_property_change ();
+        void handle_clip_level_change ();
+
+       void get_image (Cairo::RefPtr<Cairo::ImageSurface>& image, framepos_t start, framepos_t end, double& image_offset) const;
 
-        void ensure_cache (ARDOUR::framepos_t sample_start, ARDOUR::framepos_t sample_end) const;
-        ArdourCanvas::Coord position (double) const;
-        void draw_image (ARDOUR::PeakData*, int npeaks) const;
+        ArdourCanvas::Coord y_extent (double) const;
+       void draw_image (Cairo::RefPtr<Cairo::ImageSurface>&, ARDOUR::PeakData*, int) const;
 };
 
 }