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.
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);

View File

@ -73,6 +73,7 @@ private:
};
typedef std::vector<EnvPoint> 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;

View File

@ -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())

View File

@ -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;

View File

@ -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);

View File

@ -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)

View File

@ -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

View File

@ -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()

View File

@ -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);

View File

@ -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 &region,
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;

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 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

View File

@ -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);