diff --git a/src/Envelope.cpp b/src/Envelope.cpp index 8e241fcb8..8a596b79e 100644 --- a/src/Envelope.cpp +++ b/src/Envelope.cpp @@ -311,11 +311,15 @@ static void DrawPoint(wxDC & dc, const wxRect & r, int x, int y, bool top) } } +#include "TrackPanelDrawingContext.h" + /// TODO: This should probably move to track artist. -void Envelope::DrawPoints(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo, - bool dB, double dBRange, - float zoomMin, float zoomMax, bool mirrored) const +void Envelope::DrawPoints +(TrackPanelDrawingContext &context, const wxRect & r, const ZoomInfo &zoomInfo, + bool dB, double dBRange, + float zoomMin, float zoomMax, bool mirrored) const { + auto &dc = context.dc; dc.SetPen(AColor::envelopePen); dc.SetBrush(*wxWHITE_BRUSH); diff --git a/src/Envelope.h b/src/Envelope.h index 3108c3dea..1662d640a 100644 --- a/src/Envelope.h +++ b/src/Envelope.h @@ -73,6 +73,7 @@ private: }; typedef std::vector EnvArray; +struct TrackPanelDrawingContext; class Envelope final : public XMLTagHandler { public: @@ -117,7 +118,9 @@ public: XMLTagHandler *HandleXMLChild(const wxChar *tag) override; void WriteXML(XMLWriter &xmlFile) const /* not override */; - void DrawPoints(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo, + void DrawPoints( + TrackPanelDrawingContext &context, + const wxRect & r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin, float zoomMax, bool mirrored) const; diff --git a/src/LabelTrack.cpp b/src/LabelTrack.cpp index ab204904c..26d519fdc 100644 --- a/src/LabelTrack.cpp +++ b/src/LabelTrack.cpp @@ -773,13 +773,17 @@ namespace { } } +#include "TrackPanelDrawingContext.h" + /// Draw calls other functions to draw the LabelTrack. /// @param dc the device context /// @param r the LabelTrack rectangle. -void LabelTrack::Draw(wxDC & dc, const wxRect & r, - const SelectedRegion &selectedRegion, - const ZoomInfo &zoomInfo) const +void LabelTrack::Draw +(TrackPanelDrawingContext &context, const wxRect & r, + const SelectedRegion &selectedRegion, + const ZoomInfo &zoomInfo) const { + auto &dc = context.dc; auto pHit = findHit(); if(msFont.Ok()) diff --git a/src/LabelTrack.h b/src/LabelTrack.h index 99660af30..cd981a481 100644 --- a/src/LabelTrack.h +++ b/src/LabelTrack.h @@ -40,6 +40,7 @@ class ZoomInfo; struct LabelTrackHit; +struct TrackPanelDrawingContext; class LabelStruct { @@ -147,7 +148,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track static wxFont GetFont(const wxString &faceName, int size = DefaultFontSize); static void ResetFont(); - void Draw(wxDC & dc, const wxRect & r, + void Draw(TrackPanelDrawingContext &context, const wxRect & r, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo) const; diff --git a/src/Printing.cpp b/src/Printing.cpp index 860b9d845..cafc61a2a 100644 --- a/src/Printing.cpp +++ b/src/Printing.cpp @@ -32,6 +32,8 @@ #include "Experimental.h" +#include "TrackPanelDrawingContext.h" + // Globals, so that we remember settings from session to session wxPrintData &gPrintData() { @@ -97,7 +99,9 @@ bool AudacityPrintout::OnPrintPage(int WXUNUSED(page)) r.width = width; r.height = (int)(n->GetHeight() * scale); - artist.DrawTrack(n, *dc, r, SelectedRegion(), zoomInfo, false, false, false, false); + TrackPanelDrawingContext context{ *dc, {}, {} }; + artist.DrawTrack( + context, n, r, SelectedRegion(), zoomInfo, false, false, false, false); dc->SetPen(*wxBLACK_PEN); AColor::Line(*dc, 0, r.y, width, r.y); diff --git a/src/TimeTrack.cpp b/src/TimeTrack.cpp index 55ec5b346..d01c39843 100644 --- a/src/TimeTrack.cpp +++ b/src/TimeTrack.cpp @@ -257,8 +257,13 @@ void TimeTrack::WriteXML(XMLWriter &xmlFile) const xmlFile.EndTag(wxT("timetrack")); } -void TimeTrack::Draw(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo) const +#include "TrackPanelDrawingContext.h" + +void TimeTrack::Draw +(TrackPanelDrawingContext &context, const wxRect & r, const ZoomInfo &zoomInfo) const { + auto &dc = context.dc; + double min = zoomInfo.PositionToTime(0); double max = zoomInfo.PositionToTime(r.width); if (min > max) diff --git a/src/TimeTrack.h b/src/TimeTrack.h index 81b8ba8b4..7dde3c494 100644 --- a/src/TimeTrack.h +++ b/src/TimeTrack.h @@ -22,6 +22,7 @@ class wxDC; class Envelope; class Ruler; class ZoomInfo; +struct TrackPanelDrawingContext; class EnvelopeHandle; @@ -67,7 +68,9 @@ class TimeTrack final : public Track { double GetStartTime() const override { return 0.0; } double GetEndTime() const override { return 0.0; } - void Draw(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo) const; + void Draw + (TrackPanelDrawingContext &context, + const wxRect & r, const ZoomInfo &zoomInfo) const; // XMLTagHandler callback methods for loading and saving diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index 04763d32d..fe5443bea 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -183,6 +183,8 @@ audio tracks. #include "Theme.h" #include "AllThemeResources.h" #include "Experimental.h" +#include "TrackPanelDrawingContext.h" + #undef PROFILE_WAVEFORM #ifdef PROFILE_WAVEFORM @@ -315,9 +317,9 @@ void TrackArtist::SetMargins(int left, int top, int right, int bottom) mMarginBottom = bottom; } -void TrackArtist::DrawTracks(TrackList * tracks, +void TrackArtist::DrawTracks(TrackPanelDrawingContext &context, + TrackList * tracks, Track * start, - wxDC & dc, const wxRegion & reg, const wxRect & rect, const wxRect & clip, @@ -409,7 +411,7 @@ void TrackArtist::DrawTracks(TrackList * tracks, rr.y += mMarginTop; rr.width -= (mMarginLeft + mMarginRight); rr.height -= (mMarginTop + mMarginBottom); - DrawTrack(t, dc, rr, + DrawTrack(context, t, rr, selectedRegion, zoomInfo, drawEnvelope, bigPoints, drawSliders, hasSolo); } @@ -438,8 +440,8 @@ void TrackArtist::DrawTracks(TrackList * tracks, } } -void TrackArtist::DrawTrack(const Track * t, - wxDC & dc, +void TrackArtist::DrawTrack(TrackPanelDrawingContext &context, + const Track * t, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -448,6 +450,7 @@ void TrackArtist::DrawTrack(const Track * t, bool drawSliders, bool hasSolo) { + auto &dc = context.dc; switch (t->GetKind()) { case Track::Wave: { @@ -466,7 +469,7 @@ void TrackArtist::DrawTrack(const Track * t, switch (wt->GetDisplay()) { case WaveTrack::Waveform: - DrawWaveform(wt, dc, rect, selectedRegion, zoomInfo, + DrawWaveform(context, wt, rect, selectedRegion, zoomInfo, drawEnvelope, bigPoints, drawSliders, muted); break; case WaveTrack::Spectrum: @@ -503,16 +506,18 @@ void TrackArtist::DrawTrack(const Track * t, } #endif // USE_MIDI case Track::Label: - DrawLabelTrack((LabelTrack *)t, dc, rect, selectedRegion, zoomInfo); + DrawLabelTrack(context, (LabelTrack *)t, rect, selectedRegion, zoomInfo); break; case Track::Time: - DrawTimeTrack((TimeTrack *)t, dc, rect, zoomInfo); + DrawTimeTrack(context, (TimeTrack *)t, rect, zoomInfo); break; } } -void TrackArtist::DrawVRuler(const Track *t, wxDC * dc, wxRect & rect) +void TrackArtist::DrawVRuler +(TrackPanelDrawingContext &context, const Track *t, wxRect & rect) { + auto dc = &context.dc; int kind = t->GetKind(); // Label and Time tracks do not have a vruler @@ -1468,8 +1473,8 @@ void TrackArtist::DrawEnvLine(wxDC &dc, const wxRect &rect, int x0, int y0, int } } -void TrackArtist::DrawWaveform(const WaveTrack *track, - wxDC & dc, +void TrackArtist::DrawWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -1478,13 +1483,14 @@ void TrackArtist::DrawWaveform(const WaveTrack *track, bool drawSliders, bool muted) { + auto &dc = context.dc; const bool dB = !track->GetWaveformSettings().isLinear(); DrawBackgroundWithSelection(&dc, rect, track, blankSelectedBrush, blankBrush, selectedRegion, zoomInfo); for (const auto &clip: track->GetClips()) - DrawClipWaveform(track, clip.get(), dc, rect, selectedRegion, zoomInfo, + DrawClipWaveform(context, track, clip.get(), rect, selectedRegion, zoomInfo, drawEnvelope, bigPoints, dB, muted); @@ -1737,9 +1743,9 @@ void FindWavePortions } } -void TrackArtist::DrawClipWaveform(const WaveTrack *track, +void TrackArtist::DrawClipWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const WaveClip *clip, - wxDC & dc, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, @@ -1748,6 +1754,7 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track, bool dB, bool muted) { + auto &dc = context.dc; #ifdef PROFILE_WAVEFORM Profiler profiler; #endif @@ -1954,7 +1961,8 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track, if (drawEnvelope) { DrawEnvelope(dc, mid, env, zoomMin, zoomMax, dB, dBRange); - clip->GetEnvelope()->DrawPoints(dc, rect, zoomInfo, dB, dBRange, zoomMin, zoomMax, true); + clip->GetEnvelope()->DrawPoints + (context, rect, zoomInfo, dB, dBRange, zoomMin, zoomMax, true); } // Draw arrows on the left side if the track extends to the left of the @@ -3188,8 +3196,8 @@ void TrackArtist::DrawNoteTrack(const NoteTrack *track, #endif // USE_MIDI -void TrackArtist::DrawLabelTrack(const LabelTrack *track, - wxDC & dc, +void TrackArtist::DrawLabelTrack(TrackPanelDrawingContext &context, + const LabelTrack *track, const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo) @@ -3200,15 +3208,15 @@ void TrackArtist::DrawLabelTrack(const LabelTrack *track, if (!track->GetSelected() && !track->IsSyncLockSelected()) sel0 = sel1 = 0.0; - track->Draw(dc, rect, SelectedRegion(sel0, sel1), zoomInfo); + track->Draw(context, rect, SelectedRegion(sel0, sel1), zoomInfo); } -void TrackArtist::DrawTimeTrack(const TimeTrack *track, - wxDC & dc, +void TrackArtist::DrawTimeTrack(TrackPanelDrawingContext &context, + const TimeTrack *track, const wxRect & rect, const ZoomInfo &zoomInfo) { - track->Draw(dc, rect, zoomInfo); + track->Draw(context, rect, zoomInfo); wxRect envRect = rect; envRect.height -= 2; double lower = track->GetRangeLower(), upper = track->GetRangeUpper(); @@ -3217,8 +3225,9 @@ void TrackArtist::DrawTimeTrack(const TimeTrack *track, lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / mdBrange + 1.0; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / mdBrange + 1.0; } - track->GetEnvelope()->DrawPoints(dc, envRect, zoomInfo, - track->GetDisplayLog(), mdBrange, lower, upper, false); + track->GetEnvelope()->DrawPoints + (context, envRect, zoomInfo, + track->GetDisplayLog(), mdBrange, lower, upper, false); } void TrackArtist::UpdatePrefs() diff --git a/src/TrackArtist.h b/src/TrackArtist.h index 3bb0b5a3b..30e841696 100644 --- a/src/TrackArtist.h +++ b/src/TrackArtist.h @@ -41,6 +41,8 @@ class Ruler; class SelectedRegion; class ZoomInfo; +struct TrackPanelDrawingContext; + #ifndef uchar typedef unsigned char uchar; #endif @@ -52,19 +54,22 @@ class AUDACITY_DLL_API TrackArtist { ~TrackArtist(); void SetColours(); - void DrawTracks(TrackList *tracks, Track *start, - wxDC & dc, const wxRegion & reg, + void DrawTracks(TrackPanelDrawingContext &context, + TrackList *tracks, Track *start, + const wxRegion & reg, const wxRect & rect, const wxRect & clip, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders); - void DrawTrack(const Track *t, - wxDC & dc, const wxRect & rect, + void DrawTrack(TrackPanelDrawingContext &context, + const Track *t, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool hasSolo); - void DrawVRuler(const Track *t, wxDC *dc, wxRect & rect); + void DrawVRuler(TrackPanelDrawingContext &context, + const Track *t, wxRect & rect); void UpdateVRuler(const Track *t, wxRect & rect); @@ -94,8 +99,9 @@ class AUDACITY_DLL_API TrackArtist { // Lower-level drawing functions // - void DrawWaveform(const WaveTrack *track, - wxDC & dc, const wxRect & rect, + void DrawWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool drawSliders, bool muted); @@ -117,18 +123,21 @@ class AUDACITY_DLL_API TrackArtist { bool muted); #endif // USE_MIDI - void DrawLabelTrack(const LabelTrack *track, - wxDC & dc, const wxRect & rect, + void DrawLabelTrack(TrackPanelDrawingContext &context, + const LabelTrack *track, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); - void DrawTimeTrack(const TimeTrack *track, - wxDC & dc, const wxRect & rect, const ZoomInfo &zoomInfo); + void DrawTimeTrack(TrackPanelDrawingContext &context, + const TimeTrack *track, + const wxRect & rect, const ZoomInfo &zoomInfo); void DrawTimeSlider(wxDC & dc, const wxRect & rect, bool rightwards); - void DrawClipWaveform(const WaveTrack *track, const WaveClip *clip, - wxDC & dc, const wxRect & rect, + void DrawClipWaveform(TrackPanelDrawingContext &context, + const WaveTrack *track, const WaveClip *clip, + const wxRect & rect, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, bool drawEnvelope, bool bigPoints, bool dB, bool muted); diff --git a/src/TrackPanel.cpp b/src/TrackPanel.cpp index d4a383386..58c7b4185 100644 --- a/src/TrackPanel.cpp +++ b/src/TrackPanel.cpp @@ -1718,26 +1718,28 @@ void TrackPanel::DrawTracks(wxDC * dc) bool bigPointsFlag = pTtb->IsDown(drawTool) || bMultiToolDown; bool sliderFlag = bMultiToolDown; + TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState }; + // The track artist actually draws the stuff inside each track auto first = GetProject()->GetFirstVisible(); - mTrackArtist->DrawTracks(GetTracks(), first.get(), - *dc, region, tracksRect, clip, + mTrackArtist->DrawTracks(context, GetTracks(), first.get(), + region, tracksRect, clip, mViewInfo->selectedRegion, *mViewInfo, envelopeFlag, bigPointsFlag, sliderFlag); - DrawEverythingElse(dc, region, clip); + DrawEverythingElse(context, region, clip); } /// Draws 'Everything else'. In particular it draws: /// - Drop shadow for tracks and vertical rulers. /// - Zooming Indicators. /// - Fills in space below the tracks. -void TrackPanel::DrawEverythingElse(wxDC * dc, +void TrackPanel::DrawEverythingElse(TrackPanelDrawingContext &context, const wxRegion ®ion, const wxRect & clip) { // We draw everything else - + auto dc = &context.dc; wxRect focusRect(-1, -1, 0, 0); wxRect trackRect = clip; trackRect.height = 0; // for drawing background in no tracks case. @@ -1787,7 +1789,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, if (mAx->IsFocused(t)) { focusRect = borderRect; } - DrawOutside(borderTrack, dc, borderRect); + DrawOutside(context, borderTrack, borderRect); } // Believe it or not, we can speed up redrawing if we don't @@ -1806,7 +1808,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, rect.y += kTopMargin; rect.width = GetVRulerWidth(); rect.height -= (kTopMargin + kBottomMargin); - mTrackArtist->DrawVRuler(t, dc, rect); + mTrackArtist->DrawVRuler(context, t, rect); } #ifdef EXPERIMENTAL_OUTPUT_DISPLAY @@ -1819,7 +1821,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc, rect.y += kTopMargin; rect.width = GetVRulerWidth(); rect.height -= (kTopMargin + kBottomMargin); - mTrackArtist->DrawVRuler(t, dc, rect); + mTrackArtist->DrawVRuler(context, t, rect); } } #endif @@ -2279,15 +2281,18 @@ void TrackInfo::Status2DrawFunction StatusDrawFunction( s, dc, rect ); } -void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) +void TrackPanel::DrawOutside +(TrackPanelDrawingContext &context, + Track * t, const wxRect & rec) { + auto dc = &context.dc; bool bIsWave = (t->GetKind() == Track::Wave); // Draw things that extend right of track control panel { // Start with whole track rect wxRect rect = rec; - DrawOutsideOfTrack(t, dc, rect); + DrawOutsideOfTrack(context, t, rect); // Now exclude left, right, and top insets rect.x += kLeftInset; @@ -2319,7 +2324,6 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) rect.y += kTopMargin; rect.height -= (kBottomMargin + kTopMargin); - TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState }; TrackInfo::DrawItems( context, rect, *t ); //mTrackInfo.DrawBordersWithin( dc, rect, *t ); @@ -2329,8 +2333,11 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec) // Paint the inset areas left, top, and right in a background color // If linked to a following channel, also paint the separator area, which // overlaps the next track rectangle's top -void TrackPanel::DrawOutsideOfTrack(Track * t, wxDC * dc, const wxRect & rect) +void TrackPanel::DrawOutsideOfTrack +(TrackPanelDrawingContext &context, Track * t, const wxRect & rect) { + auto dc = &context.dc; + // Fill in area outside of the track AColor::TrackPanelBackground(dc, false); wxRect side; diff --git a/src/TrackPanel.h b/src/TrackPanel.h index 85ed67a6f..11a7e03bc 100644 --- a/src/TrackPanel.h +++ b/src/TrackPanel.h @@ -171,7 +171,6 @@ public: void DrawBackground(wxDC * dc, const wxRect & rect, bool bSelected, bool bHasMuteSolo, const int labelw, const int vrul) const; void DrawBordersWithin(wxDC * dc, const wxRect & rect, const Track &track ) const; - void DrawVRuler(wxDC * dc, const wxRect & rect, Track * t) const; static void GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest ); static void GetCloseBoxRect(const wxRect & rect, wxRect &dest); @@ -412,14 +411,19 @@ public: protected: void DrawTracks(wxDC * dc); - void DrawEverythingElse(wxDC *dc, const wxRegion & region, + void DrawEverythingElse(TrackPanelDrawingContext &context, + const wxRegion & region, const wxRect & clip); - void DrawOutside(Track *t, wxDC *dc, const wxRect & rec); + void DrawOutside + (TrackPanelDrawingContext &context, + Track *t, const wxRect & rec); void HighlightFocusedTrack (wxDC* dc, const wxRect &rect); void DrawShadow (Track *t, wxDC* dc, const wxRect & rect); void DrawBordersAroundTrack(Track *t, wxDC* dc, const wxRect & rect, const int labelw, const int vrul); - void DrawOutsideOfTrack (Track *t, wxDC* dc, const wxRect & rect); + void DrawOutsideOfTrack + (TrackPanelDrawingContext &context, + Track *t, const wxRect & rect); public: // Set the object that performs catch-all event handling when the pointer diff --git a/src/effects/Equalization.cpp b/src/effects/Equalization.cpp index 3feee2c24..5a3c4c21b 100644 --- a/src/effects/Equalization.cpp +++ b/src/effects/Equalization.cpp @@ -2871,6 +2871,7 @@ void EqualizationPanel::OnSize(wxSizeEvent & WXUNUSED(event)) Refresh( false ); } +#include "TrackPanelDrawingContext.h" void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event)) { wxPaintDC dc(this); @@ -3038,8 +3039,10 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event)) memDC.SetPen(*wxBLACK_PEN); if( mEffect->mDraw->GetValue() ) { - mEffect->mEnvelope->DrawPoints(memDC, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0, - mEffect->mdBMin, mEffect->mdBMax, false); + TrackPanelDrawingContext context{ memDC, {}, {} }; + mEffect->mEnvelope->DrawPoints( + context, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0, + mEffect->mdBMin, mEffect->mdBMax, false); } dc.Blit(0, 0, mWidth, mHeight, &memDC, 0, 0, wxCOPY, FALSE);