/********************************************************************** Audacity: A Digital Audio Editor TrackArtist.h Dominic Mazzoni This singleton class handles the actual rendering of WaveTracks (both waveforms and spectra), NoteTracks, and LabelTracks. It's actually a little harder than it looks, because for waveforms at least it needs to cache the samples that are currently on-screen. **********************************************************************/ #ifndef __AUDACITY_TRACKARTIST__ #define __AUDACITY_TRACKARTIST__ #include #include #include "Experimental.h" #include "audacity/Types.h" class wxDC; class wxRect; class wxHashTable; class Track; class WaveDisplay; class WaveTrack; class WaveTrackCache; class WaveClip; class NoteTrack; class LabelTrack; class TimeTrack; class TrackList; class Ruler; class SelectedRegion; class ZoomInfo; #ifndef uchar typedef unsigned char uchar; #endif class AUDACITY_DLL_API TrackArtist { public: TrackArtist(); ~TrackArtist(); void SetColours(); void DrawTracks(TrackList *tracks, Track *start, wxDC & dc, wxRegion & reg, wxRect & rect, wxRect & clip, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders); void DrawTrack(const Track *t, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool hasSolo); void DrawVRuler(Track *t, wxDC *dc, wxRect & rect); void UpdateVRuler(Track *t, wxRect & rect); void SetInset(int left, int top, int right, int bottom); void UpdatePrefs(); void SetBackgroundBrushes(wxBrush unselectedBrush, wxBrush selectedBrush, wxPen unselectedPen, wxPen selectedPen) { this->unselectedBrush = unselectedBrush; this->selectedBrush = selectedBrush; this->unselectedPen = unselectedPen; this->selectedPen = selectedPen; } // Helper: draws the "sync-locked" watermark tiled to a rectangle static void DrawSyncLockTiles(wxDC *dc, wxRect rect); // Helper: draws background with selection rect static void DrawBackgroundWithSelection(wxDC *dc, const wxRect &rect, Track *track, wxBrush &selBrush, wxBrush &unselBrush, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); private: // // Lower-level drawing functions // void DrawWaveform(WaveTrack *track, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool muted); void DrawSpectrum(WaveTrack *track, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); #ifdef USE_MIDI int GetBottom(NoteTrack *t, const wxRect &rect); void DrawNoteBackground(NoteTrack *track, wxDC &dc, const wxRect &rect, const wxRect &sel, const ZoomInfo &zoomInfo, const wxBrush &wb, const wxPen &wp, const wxBrush &bb, const wxPen &bp, const wxPen &mp); void DrawNoteTrack(NoteTrack *track, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool muted); #endif // USE_MIDI void DrawLabelTrack(LabelTrack *track, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); void DrawTimeTrack(TimeTrack *track, wxDC & dc, const wxRect & rect, const ZoomInfo &zoomInfo); void DrawTimeSlider(wxDC & dc, const wxRect & rect, bool rightwards); void DrawClipWaveform(WaveTrack *track, WaveClip *clip, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool dB, bool muted); void DrawClipSpectrum(WaveTrackCache &cache, WaveClip *clip, wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); // Waveform utility functions void DrawWaveformBackground(wxDC & dc, int leftOffset, const wxRect &rect, const double env[], float zoomMin, float zoomMax, bool dB, float dBRange, double t0, double t1, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bIsSyncLockSelected); void DrawMinMaxRMS(wxDC &dc, const wxRect & rect, const double env[], float zoomMin, float zoomMax, bool dB, float dBRange, const float *min, const float *max, const float *rms, const int *bl, bool /* showProgress */, bool muted #ifdef EXPERIMENTAL_OUTPUT_DISPLAY , const float gain #endif ); void DrawIndividualSamples(wxDC & dc, int leftOffset, const wxRect & rect, float zoomMin, float zoomMax, bool dB, float dBRange, WaveClip *clip, const ZoomInfo &zoomInfo, bool bigPoints, bool showPoints, bool muted); void DrawNegativeOffsetTrackArrows(wxDC & dc, const wxRect & rect); void DrawEnvelope(wxDC & dc, const wxRect & rect, const double env[], float zoomMin, float zoomMax, bool dB, float dBRange); void DrawEnvLine(wxDC & dc, const wxRect & rect, int x0, int y0, int cy, bool top); // Preference values float mdBrange; // "/GUI/EnvdBRange" long mShowClipping; // "/GUI/ShowClipping" bool mbShowTrackNameInWaveform; // "/GUI/ShowTrackNameInWaveform" int mInsetLeft; int mInsetTop; int mInsetRight; int mInsetBottom; wxBrush blankBrush; wxBrush unselectedBrush; wxBrush selectedBrush; wxBrush sampleBrush; wxBrush selsampleBrush; wxBrush dragsampleBrush;// for samples which are draggable. wxBrush muteSampleBrush; wxBrush blankSelectedBrush; wxPen blankPen; wxPen unselectedPen; wxPen selectedPen; wxPen samplePen; wxPen rmsPen; wxPen muteRmsPen; wxPen selsamplePen; wxPen muteSamplePen; wxPen odProgressNotYetPen; wxPen odProgressDonePen; wxPen shadowPen; wxPen clippedPen; wxPen muteClippedPen; wxPen blankSelectedPen; Ruler *vruler; #ifdef EXPERIMENTAL_FFT_Y_GRID bool fftYGridOld; #endif //EXPERIMENTAL_FFT_Y_GRID #ifdef EXPERIMENTAL_FIND_NOTES bool fftFindNotesOld; int findNotesMinAOld; int findNotesNOld; bool findNotesQuantizeOld; #endif }; extern int GetWaveYPos(float value, float min, float max, int height, bool dB, bool outer, float dBr, bool clip); extern float FromDB(float value, double dBRange); extern float ValueOfPixel(int yy, int height, bool offset, bool dB, double dBRange, float zoomMin, float zoomMax); #endif // define __AUDACITY_TRACKARTIST__