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;
+ framepos_t start;
+ framepos_t end;
+ Cairo::RefPtr<Cairo::ImageSurface> image;
+
+ CacheEntry(int chan, Coord hght, float amp, Color fcl, framepos_t strt, framepos_t ed, Cairo::RefPtr<Cairo::ImageSurface> img) :
+
+ channel (chan), height (hght), amplitude (amp), fill_color (fcl),
+ start (strt), end (ed), image (img) {}
+ };
+
+ /* final ImageSurface rendered with colours */
+ Cairo::RefPtr<Cairo::ImageSurface> _image;
+
/* Displays a single channel of waveform data for the given Region.
x = 0 in the waveview corresponds to the first waveform datum taken
*/
- WaveView (Group *, boost::shared_ptr<ARDOUR::AudioRegion>);
+ WaveView (Canvas *, boost::shared_ptr<ARDOUR::AudioRegion>);
+ WaveView (Item*, boost::shared_ptr<ARDOUR::AudioRegion>);
~WaveView ();
void render (Rect const & area, Cairo::RefPtr<Cairo::Context>) const;
void set_amplitude_above_axis (double v);
double amplitude_above_axis () const { return _amplitude_above_axis; }
+ static void set_clip_level (double dB);
+ static PBD::Signal0<void> ClipLevelChanged;
+
#ifdef CANVAS_COMPATIBILITY
void*& property_gain_src () {
return _foo_void;
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;
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;
static Shape _global_shape;
static bool _global_show_waveform_clipping;
+ static double _clip_level;
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, bool) const;
+ void draw_image (Cairo::RefPtr<Cairo::ImageSurface>&, ARDOUR::PeakData*, int) const;
};
}