1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-09-19 17:40:51 +02:00

Pass more context information into drawing routines

This commit is contained in:
Paul Licameli 2017-06-23 19:28:38 -04:00
parent f09a7be3dc
commit ada4b6307d
12 changed files with 121 additions and 65 deletions

View File

@ -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. /// TODO: This should probably move to track artist.
void Envelope::DrawPoints(wxDC & dc, const wxRect & r, const ZoomInfo &zoomInfo, void Envelope::DrawPoints
(TrackPanelDrawingContext &context, const wxRect & r, const ZoomInfo &zoomInfo,
bool dB, double dBRange, bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored) const float zoomMin, float zoomMax, bool mirrored) const
{ {
auto &dc = context.dc;
dc.SetPen(AColor::envelopePen); dc.SetPen(AColor::envelopePen);
dc.SetBrush(*wxWHITE_BRUSH); dc.SetBrush(*wxWHITE_BRUSH);

View File

@ -73,6 +73,7 @@ private:
}; };
typedef std::vector<EnvPoint> EnvArray; typedef std::vector<EnvPoint> EnvArray;
struct TrackPanelDrawingContext;
class Envelope final : public XMLTagHandler { class Envelope final : public XMLTagHandler {
public: public:
@ -117,7 +118,9 @@ public:
XMLTagHandler *HandleXMLChild(const wxChar *tag) override; XMLTagHandler *HandleXMLChild(const wxChar *tag) override;
void WriteXML(XMLWriter &xmlFile) const /* not 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, bool dB, double dBRange,
float zoomMin, float zoomMax, bool mirrored) const; float zoomMin, float zoomMax, bool mirrored) const;

View File

@ -773,13 +773,17 @@ namespace {
} }
} }
#include "TrackPanelDrawingContext.h"
/// Draw calls other functions to draw the LabelTrack. /// Draw calls other functions to draw the LabelTrack.
/// @param dc the device context /// @param dc the device context
/// @param r the LabelTrack rectangle. /// @param r the LabelTrack rectangle.
void LabelTrack::Draw(wxDC & dc, const wxRect & r, void LabelTrack::Draw
(TrackPanelDrawingContext &context, const wxRect & r,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo) const const ZoomInfo &zoomInfo) const
{ {
auto &dc = context.dc;
auto pHit = findHit(); auto pHit = findHit();
if(msFont.Ok()) if(msFont.Ok())

View File

@ -40,6 +40,7 @@ class ZoomInfo;
struct LabelTrackHit; struct LabelTrackHit;
struct TrackPanelDrawingContext;
class LabelStruct class LabelStruct
{ {
@ -147,7 +148,7 @@ class AUDACITY_DLL_API LabelTrack final : public Track
static wxFont GetFont(const wxString &faceName, int size = DefaultFontSize); static wxFont GetFont(const wxString &faceName, int size = DefaultFontSize);
static void ResetFont(); static void ResetFont();
void Draw(wxDC & dc, const wxRect & r, void Draw(TrackPanelDrawingContext &context, const wxRect & r,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo) const; const ZoomInfo &zoomInfo) const;

View File

@ -32,6 +32,8 @@
#include "Experimental.h" #include "Experimental.h"
#include "TrackPanelDrawingContext.h"
// Globals, so that we remember settings from session to session // Globals, so that we remember settings from session to session
wxPrintData &gPrintData() wxPrintData &gPrintData()
{ {
@ -97,7 +99,9 @@ bool AudacityPrintout::OnPrintPage(int WXUNUSED(page))
r.width = width; r.width = width;
r.height = (int)(n->GetHeight() * scale); 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); dc->SetPen(*wxBLACK_PEN);
AColor::Line(*dc, 0, r.y, width, r.y); AColor::Line(*dc, 0, r.y, width, r.y);

View File

@ -257,8 +257,13 @@ void TimeTrack::WriteXML(XMLWriter &xmlFile) const
xmlFile.EndTag(wxT("timetrack")); 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 min = zoomInfo.PositionToTime(0);
double max = zoomInfo.PositionToTime(r.width); double max = zoomInfo.PositionToTime(r.width);
if (min > max) if (min > max)

View File

@ -22,6 +22,7 @@ class wxDC;
class Envelope; class Envelope;
class Ruler; class Ruler;
class ZoomInfo; class ZoomInfo;
struct TrackPanelDrawingContext;
class EnvelopeHandle; class EnvelopeHandle;
@ -67,7 +68,9 @@ class TimeTrack final : public Track {
double GetStartTime() const override { return 0.0; } double GetStartTime() const override { return 0.0; }
double GetEndTime() 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 // XMLTagHandler callback methods for loading and saving

View File

@ -183,6 +183,8 @@ audio tracks.
#include "Theme.h" #include "Theme.h"
#include "AllThemeResources.h" #include "AllThemeResources.h"
#include "Experimental.h" #include "Experimental.h"
#include "TrackPanelDrawingContext.h"
#undef PROFILE_WAVEFORM #undef PROFILE_WAVEFORM
#ifdef PROFILE_WAVEFORM #ifdef PROFILE_WAVEFORM
@ -315,9 +317,9 @@ void TrackArtist::SetMargins(int left, int top, int right, int bottom)
mMarginBottom = bottom; mMarginBottom = bottom;
} }
void TrackArtist::DrawTracks(TrackList * tracks, void TrackArtist::DrawTracks(TrackPanelDrawingContext &context,
TrackList * tracks,
Track * start, Track * start,
wxDC & dc,
const wxRegion & reg, const wxRegion & reg,
const wxRect & rect, const wxRect & rect,
const wxRect & clip, const wxRect & clip,
@ -409,7 +411,7 @@ void TrackArtist::DrawTracks(TrackList * tracks,
rr.y += mMarginTop; rr.y += mMarginTop;
rr.width -= (mMarginLeft + mMarginRight); rr.width -= (mMarginLeft + mMarginRight);
rr.height -= (mMarginTop + mMarginBottom); rr.height -= (mMarginTop + mMarginBottom);
DrawTrack(t, dc, rr, DrawTrack(context, t, rr,
selectedRegion, zoomInfo, selectedRegion, zoomInfo,
drawEnvelope, bigPoints, drawSliders, hasSolo); drawEnvelope, bigPoints, drawSliders, hasSolo);
} }
@ -438,8 +440,8 @@ void TrackArtist::DrawTracks(TrackList * tracks,
} }
} }
void TrackArtist::DrawTrack(const Track * t, void TrackArtist::DrawTrack(TrackPanelDrawingContext &context,
wxDC & dc, const Track * t,
const wxRect & rect, const wxRect & rect,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo, const ZoomInfo &zoomInfo,
@ -448,6 +450,7 @@ void TrackArtist::DrawTrack(const Track * t,
bool drawSliders, bool drawSliders,
bool hasSolo) bool hasSolo)
{ {
auto &dc = context.dc;
switch (t->GetKind()) { switch (t->GetKind()) {
case Track::Wave: case Track::Wave:
{ {
@ -466,7 +469,7 @@ void TrackArtist::DrawTrack(const Track * t,
switch (wt->GetDisplay()) { switch (wt->GetDisplay()) {
case WaveTrack::Waveform: case WaveTrack::Waveform:
DrawWaveform(wt, dc, rect, selectedRegion, zoomInfo, DrawWaveform(context, wt, rect, selectedRegion, zoomInfo,
drawEnvelope, bigPoints, drawSliders, muted); drawEnvelope, bigPoints, drawSliders, muted);
break; break;
case WaveTrack::Spectrum: case WaveTrack::Spectrum:
@ -503,16 +506,18 @@ void TrackArtist::DrawTrack(const Track * t,
} }
#endif // USE_MIDI #endif // USE_MIDI
case Track::Label: case Track::Label:
DrawLabelTrack((LabelTrack *)t, dc, rect, selectedRegion, zoomInfo); DrawLabelTrack(context, (LabelTrack *)t, rect, selectedRegion, zoomInfo);
break; break;
case Track::Time: case Track::Time:
DrawTimeTrack((TimeTrack *)t, dc, rect, zoomInfo); DrawTimeTrack(context, (TimeTrack *)t, rect, zoomInfo);
break; 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(); int kind = t->GetKind();
// Label and Time tracks do not have a vruler // 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, void TrackArtist::DrawWaveform(TrackPanelDrawingContext &context,
wxDC & dc, const WaveTrack *track,
const wxRect & rect, const wxRect & rect,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo, const ZoomInfo &zoomInfo,
@ -1478,13 +1483,14 @@ void TrackArtist::DrawWaveform(const WaveTrack *track,
bool drawSliders, bool drawSliders,
bool muted) bool muted)
{ {
auto &dc = context.dc;
const bool dB = !track->GetWaveformSettings().isLinear(); const bool dB = !track->GetWaveformSettings().isLinear();
DrawBackgroundWithSelection(&dc, rect, track, blankSelectedBrush, blankBrush, DrawBackgroundWithSelection(&dc, rect, track, blankSelectedBrush, blankBrush,
selectedRegion, zoomInfo); selectedRegion, zoomInfo);
for (const auto &clip: track->GetClips()) for (const auto &clip: track->GetClips())
DrawClipWaveform(track, clip.get(), dc, rect, selectedRegion, zoomInfo, DrawClipWaveform(context, track, clip.get(), rect, selectedRegion, zoomInfo,
drawEnvelope, bigPoints, drawEnvelope, bigPoints,
dB, muted); 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, const WaveClip *clip,
wxDC & dc,
const wxRect & rect, const wxRect & rect,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo, const ZoomInfo &zoomInfo,
@ -1748,6 +1754,7 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track,
bool dB, bool dB,
bool muted) bool muted)
{ {
auto &dc = context.dc;
#ifdef PROFILE_WAVEFORM #ifdef PROFILE_WAVEFORM
Profiler profiler; Profiler profiler;
#endif #endif
@ -1954,7 +1961,8 @@ void TrackArtist::DrawClipWaveform(const WaveTrack *track,
if (drawEnvelope) { if (drawEnvelope) {
DrawEnvelope(dc, mid, env, zoomMin, zoomMax, dB, dBRange); 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 // 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 #endif // USE_MIDI
void TrackArtist::DrawLabelTrack(const LabelTrack *track, void TrackArtist::DrawLabelTrack(TrackPanelDrawingContext &context,
wxDC & dc, const LabelTrack *track,
const wxRect & rect, const wxRect & rect,
const SelectedRegion &selectedRegion, const SelectedRegion &selectedRegion,
const ZoomInfo &zoomInfo) const ZoomInfo &zoomInfo)
@ -3200,15 +3208,15 @@ void TrackArtist::DrawLabelTrack(const LabelTrack *track,
if (!track->GetSelected() && !track->IsSyncLockSelected()) if (!track->GetSelected() && !track->IsSyncLockSelected())
sel0 = sel1 = 0.0; 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, void TrackArtist::DrawTimeTrack(TrackPanelDrawingContext &context,
wxDC & dc, const TimeTrack *track,
const wxRect & rect, const wxRect & rect,
const ZoomInfo &zoomInfo) const ZoomInfo &zoomInfo)
{ {
track->Draw(dc, rect, zoomInfo); track->Draw(context, rect, zoomInfo);
wxRect envRect = rect; wxRect envRect = rect;
envRect.height -= 2; envRect.height -= 2;
double lower = track->GetRangeLower(), upper = track->GetRangeUpper(); double lower = track->GetRangeLower(), upper = track->GetRangeUpper();
@ -3217,7 +3225,8 @@ void TrackArtist::DrawTimeTrack(const TimeTrack *track,
lower = LINEAR_TO_DB(std::max(1.0e-7, lower)) / mdBrange + 1.0; 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; upper = LINEAR_TO_DB(std::max(1.0e-7, upper)) / mdBrange + 1.0;
} }
track->GetEnvelope()->DrawPoints(dc, envRect, zoomInfo, track->GetEnvelope()->DrawPoints
(context, envRect, zoomInfo,
track->GetDisplayLog(), mdBrange, lower, upper, false); track->GetDisplayLog(), mdBrange, lower, upper, false);
} }

View File

@ -41,6 +41,8 @@ class Ruler;
class SelectedRegion; class SelectedRegion;
class ZoomInfo; class ZoomInfo;
struct TrackPanelDrawingContext;
#ifndef uchar #ifndef uchar
typedef unsigned char uchar; typedef unsigned char uchar;
#endif #endif
@ -52,19 +54,22 @@ class AUDACITY_DLL_API TrackArtist {
~TrackArtist(); ~TrackArtist();
void SetColours(); void SetColours();
void DrawTracks(TrackList *tracks, Track *start, void DrawTracks(TrackPanelDrawingContext &context,
wxDC & dc, const wxRegion & reg, TrackList *tracks, Track *start,
const wxRegion & reg,
const wxRect & rect, const wxRect & clip, const wxRect & rect, const wxRect & clip,
const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo,
bool drawEnvelope, bool bigPoints, bool drawSliders); bool drawEnvelope, bool bigPoints, bool drawSliders);
void DrawTrack(const Track *t, void DrawTrack(TrackPanelDrawingContext &context,
wxDC & dc, const wxRect & rect, const Track *t,
const wxRect & rect,
const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo,
bool drawEnvelope, bool bigPoints, bool drawSliders, bool drawEnvelope, bool bigPoints, bool drawSliders,
bool hasSolo); 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); void UpdateVRuler(const Track *t, wxRect & rect);
@ -94,8 +99,9 @@ class AUDACITY_DLL_API TrackArtist {
// Lower-level drawing functions // Lower-level drawing functions
// //
void DrawWaveform(const WaveTrack *track, void DrawWaveform(TrackPanelDrawingContext &context,
wxDC & dc, const wxRect & rect, const WaveTrack *track,
const wxRect & rect,
const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo,
bool drawEnvelope, bool bigPoints, bool drawSliders, bool drawEnvelope, bool bigPoints, bool drawSliders,
bool muted); bool muted);
@ -117,18 +123,21 @@ class AUDACITY_DLL_API TrackArtist {
bool muted); bool muted);
#endif // USE_MIDI #endif // USE_MIDI
void DrawLabelTrack(const LabelTrack *track, void DrawLabelTrack(TrackPanelDrawingContext &context,
wxDC & dc, const wxRect & rect, const LabelTrack *track,
const wxRect & rect,
const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo); const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo);
void DrawTimeTrack(const TimeTrack *track, void DrawTimeTrack(TrackPanelDrawingContext &context,
wxDC & dc, const wxRect & rect, const ZoomInfo &zoomInfo); const TimeTrack *track,
const wxRect & rect, const ZoomInfo &zoomInfo);
void DrawTimeSlider(wxDC & dc, const wxRect & rect, void DrawTimeSlider(wxDC & dc, const wxRect & rect,
bool rightwards); bool rightwards);
void DrawClipWaveform(const WaveTrack *track, const WaveClip *clip, void DrawClipWaveform(TrackPanelDrawingContext &context,
wxDC & dc, const wxRect & rect, const WaveTrack *track, const WaveClip *clip,
const wxRect & rect,
const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo, const SelectedRegion &selectedRegion, const ZoomInfo &zoomInfo,
bool drawEnvelope, bool bigPoints, bool drawEnvelope, bool bigPoints,
bool dB, bool muted); bool dB, bool muted);

View File

@ -1718,26 +1718,28 @@ void TrackPanel::DrawTracks(wxDC * dc)
bool bigPointsFlag = pTtb->IsDown(drawTool) || bMultiToolDown; bool bigPointsFlag = pTtb->IsDown(drawTool) || bMultiToolDown;
bool sliderFlag = bMultiToolDown; bool sliderFlag = bMultiToolDown;
TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState };
// The track artist actually draws the stuff inside each track // The track artist actually draws the stuff inside each track
auto first = GetProject()->GetFirstVisible(); auto first = GetProject()->GetFirstVisible();
mTrackArtist->DrawTracks(GetTracks(), first.get(), mTrackArtist->DrawTracks(context, GetTracks(), first.get(),
*dc, region, tracksRect, clip, region, tracksRect, clip,
mViewInfo->selectedRegion, *mViewInfo, mViewInfo->selectedRegion, *mViewInfo,
envelopeFlag, bigPointsFlag, sliderFlag); envelopeFlag, bigPointsFlag, sliderFlag);
DrawEverythingElse(dc, region, clip); DrawEverythingElse(context, region, clip);
} }
/// Draws 'Everything else'. In particular it draws: /// Draws 'Everything else'. In particular it draws:
/// - Drop shadow for tracks and vertical rulers. /// - Drop shadow for tracks and vertical rulers.
/// - Zooming Indicators. /// - Zooming Indicators.
/// - Fills in space below the tracks. /// - Fills in space below the tracks.
void TrackPanel::DrawEverythingElse(wxDC * dc, void TrackPanel::DrawEverythingElse(TrackPanelDrawingContext &context,
const wxRegion &region, const wxRegion &region,
const wxRect & clip) const wxRect & clip)
{ {
// We draw everything else // We draw everything else
auto dc = &context.dc;
wxRect focusRect(-1, -1, 0, 0); wxRect focusRect(-1, -1, 0, 0);
wxRect trackRect = clip; wxRect trackRect = clip;
trackRect.height = 0; // for drawing background in no tracks case. trackRect.height = 0; // for drawing background in no tracks case.
@ -1787,7 +1789,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc,
if (mAx->IsFocused(t)) { if (mAx->IsFocused(t)) {
focusRect = borderRect; focusRect = borderRect;
} }
DrawOutside(borderTrack, dc, borderRect); DrawOutside(context, borderTrack, borderRect);
} }
// Believe it or not, we can speed up redrawing if we don't // 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.y += kTopMargin;
rect.width = GetVRulerWidth(); rect.width = GetVRulerWidth();
rect.height -= (kTopMargin + kBottomMargin); rect.height -= (kTopMargin + kBottomMargin);
mTrackArtist->DrawVRuler(t, dc, rect); mTrackArtist->DrawVRuler(context, t, rect);
} }
#ifdef EXPERIMENTAL_OUTPUT_DISPLAY #ifdef EXPERIMENTAL_OUTPUT_DISPLAY
@ -1819,7 +1821,7 @@ void TrackPanel::DrawEverythingElse(wxDC * dc,
rect.y += kTopMargin; rect.y += kTopMargin;
rect.width = GetVRulerWidth(); rect.width = GetVRulerWidth();
rect.height -= (kTopMargin + kBottomMargin); rect.height -= (kTopMargin + kBottomMargin);
mTrackArtist->DrawVRuler(t, dc, rect); mTrackArtist->DrawVRuler(context, t, rect);
} }
} }
#endif #endif
@ -2279,15 +2281,18 @@ void TrackInfo::Status2DrawFunction
StatusDrawFunction( s, dc, rect ); 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); bool bIsWave = (t->GetKind() == Track::Wave);
// Draw things that extend right of track control panel // Draw things that extend right of track control panel
{ {
// Start with whole track rect // Start with whole track rect
wxRect rect = rec; wxRect rect = rec;
DrawOutsideOfTrack(t, dc, rect); DrawOutsideOfTrack(context, t, rect);
// Now exclude left, right, and top insets // Now exclude left, right, and top insets
rect.x += kLeftInset; rect.x += kLeftInset;
@ -2319,7 +2324,6 @@ void TrackPanel::DrawOutside(Track * t, wxDC * dc, const wxRect & rec)
rect.y += kTopMargin; rect.y += kTopMargin;
rect.height -= (kBottomMargin + kTopMargin); rect.height -= (kBottomMargin + kTopMargin);
TrackPanelDrawingContext context{ *dc, Target(), mLastMouseState };
TrackInfo::DrawItems( context, rect, *t ); TrackInfo::DrawItems( context, rect, *t );
//mTrackInfo.DrawBordersWithin( dc, 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 // Paint the inset areas left, top, and right in a background color
// If linked to a following channel, also paint the separator area, which // If linked to a following channel, also paint the separator area, which
// overlaps the next track rectangle's top // 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 // Fill in area outside of the track
AColor::TrackPanelBackground(dc, false); AColor::TrackPanelBackground(dc, false);
wxRect side; wxRect side;

View File

@ -171,7 +171,6 @@ public:
void DrawBackground(wxDC * dc, const wxRect & rect, bool bSelected, bool bHasMuteSolo, const int labelw, const int vrul) const; 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 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 GetCloseBoxHorizontalBounds( const wxRect & rect, wxRect &dest );
static void GetCloseBoxRect(const wxRect & rect, wxRect &dest); static void GetCloseBoxRect(const wxRect & rect, wxRect &dest);
@ -412,14 +411,19 @@ public:
protected: protected:
void DrawTracks(wxDC * dc); void DrawTracks(wxDC * dc);
void DrawEverythingElse(wxDC *dc, const wxRegion & region, void DrawEverythingElse(TrackPanelDrawingContext &context,
const wxRegion & region,
const wxRect & clip); 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 HighlightFocusedTrack (wxDC* dc, const wxRect &rect);
void DrawShadow (Track *t, 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 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: public:
// Set the object that performs catch-all event handling when the pointer // Set the object that performs catch-all event handling when the pointer

View File

@ -2871,6 +2871,7 @@ void EqualizationPanel::OnSize(wxSizeEvent & WXUNUSED(event))
Refresh( false ); Refresh( false );
} }
#include "TrackPanelDrawingContext.h"
void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event)) void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
{ {
wxPaintDC dc(this); wxPaintDC dc(this);
@ -3038,7 +3039,9 @@ void EqualizationPanel::OnPaint(wxPaintEvent & WXUNUSED(event))
memDC.SetPen(*wxBLACK_PEN); memDC.SetPen(*wxBLACK_PEN);
if( mEffect->mDraw->GetValue() ) if( mEffect->mDraw->GetValue() )
{ {
mEffect->mEnvelope->DrawPoints(memDC, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0, TrackPanelDrawingContext context{ memDC, {}, {} };
mEffect->mEnvelope->DrawPoints(
context, mEnvRect, ZoomInfo(0.0, mEnvRect.width-1), false, 0.0,
mEffect->mdBMin, mEffect->mdBMax, false); mEffect->mdBMin, mEffect->mdBMax, false);
} }