27void DrawPoint(wxDC & dc,
const wxRect & r,
int x,
int y,
bool top)
29 if (y >= 0 && y <= r.height) {
30 wxRect circle(r.x + x, r.y + (top ? y - 1: y - 2), 4, 4);
31 dc.DrawEllipse(circle);
38 bool dB,
double dBRange,
39 float zoomMin,
float zoomMax,
bool mirrored,
int origin)
41 auto &dc = context.
dc;
43 const auto &zoomInfo = *artist->pZoomInfo;
45 bool highlight =
false;
46#ifdef EXPERIMENTAL_TRACK_PANEL_HIGHLIGHTING
48 highlight = target && target->
GetEnvelope() ==
this;
52 dc.SetBrush(*wxWHITE_BRUSH);
55 const double time = env[i].GetT() + env.
GetOffset();
56 const wxInt64 position = zoomInfo.TimeToPosition(time, origin);
57 if (position >= 0 && position < r.width) {
64 double v = env[i].GetVal();
65 int x = (int)(position);
69 true, dBRange,
false);
74 y2 =
GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
75 true, dBRange,
false);
81 int value = (int)((zoomMax / (zoomMax - zoomMin)) * r.height);
91 false, dBRange,
false);
92 y2 =
GetWaveYPos(-v-.000000001, zoomMin, zoomMax, r.height, dB,
93 false, dBRange,
false);
103 dc.SetBrush(*wxWHITE_BRUSH);
110 : mEnvelope(envelope)
111 , mMirrored(mirrored)
116 , mButton(wxMOUSE_BTN_NONE)
127inline int SQR(
int x) {
return x * x; }
138 bool dB,
double dBRange,
139 float zoomMin,
float zoomMax)
159 bool dB,
double dBRange,
160 float zoomMin,
float zoomMax)
162 int ctr = (int)(r.height * zoomMax / (zoomMax - zoomMin));
163 bool upper = !
mMirrored || (zoomMin >= 0.0) || (event.m_y - r.y < ctr);
165 int clip_y =
event.m_y - r.y;
166 if(clip_y < 0) clip_y = 0;
167 if(clip_y > r.GetBottom()) clip_y = r.GetBottom();
170 int bestDistSqr = 100;
181 for (
int i = 0; i < len; i++) {
184 if (position >= 0 && position < r.width) {
186 int x = (int)(position);
188 int numControlPoints;
192 y[0] =
GetWaveYPos(value, zoomMin, zoomMax, r.height,
193 dB,
true, dBRange,
false);
194 y[1] =
GetWaveYPos(-value, zoomMin, zoomMax, r.height,
195 dB,
true, dBRange,
false);
198 y[2] =
GetWaveYPos(value, zoomMin, zoomMax, r.height,
199 dB,
false, dBRange,
false);
200 y[3] =
GetWaveYPos(-value -.00000001, zoomMin, zoomMax,
201 r.height, dB,
false, dBRange,
false);
203 numControlPoints = 4;
206 numControlPoints = 2;
209 numControlPoints = 1;
211 const int deltaXSquared =
SQR(x - (event.m_x - r.x));
212 for(
int j=0; j<numControlPoints; j++){
214 const int dSqr = deltaXSquared +
SQR(y[j] - (event.m_y - r.y));
215 if (dSqr < bestDistSqr) {
236 int ct =
GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
237 false, dBRange,
false) ;
238 int cb =
GetWaveYPos( -v-.000000001, zoomMin, zoomMax, r.height, dB,
239 false, dBRange,
false) ;
241 int t =
GetWaveYPos( v, zoomMin, zoomMax, r.height, dB,
242 true, dBRange,
false) ;
243 int b =
GetWaveYPos( -v, zoomMin, zoomMax, r.height, dB,
244 true, dBRange,
false) ;
250 (event.m_y - r.y) > ct &&
251 ((
event.m_y - r.y) < cb))
257 double newVal =
ValueOfPixel(clip_y, r.height, upper, dB, dBRange,
274 const ZoomInfo &zoomInfo,
bool dB,
double dBRange,
275 float zoomMin,
float zoomMax)
277 int clip_y =
event.m_y - r.y;
278 if(clip_y < 0) clip_y = 0;
279 if(clip_y > r.height) clip_y = r.height;
293 const ZoomInfo &zoomInfo,
bool dB,
double dBRange,
294 float zoomMin,
float zoomMax,
295 float WXUNUSED(eMin),
float WXUNUSED(eMax))
300 larger.Inflate(10, 10);
302 if (larger.Contains(event.m_x, event.m_y))
306 MoveDragPoint( event, r, zoomInfo, dB, dBRange, zoomMin, zoomMax);
329 const ZoomInfo &zoomInfo,
bool dB,
double dBRange,
330 float zoomMin,
float zoomMax)
332 if (event.ButtonDown() &&
mButton == wxMOUSE_BTN_NONE)
338 if (event.ButtonUp() && event.GetButton() ==
mButton)
int GetWaveYPos(float value, float min, float max, int height, bool dB, bool outer, float dBr, bool clip)
static wxBrush envelopeBrush
EnvelopeEditor(Envelope &envelope, bool mirrored)
bool HandleDragging(const wxMouseEvent &event, wxRect &r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin=-1.0, float zoomMax=1.0, float eMin=0., float eMax=2.)
bool MouseEvent(const wxMouseEvent &event, wxRect &r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin=-1.0, float zoomMax=1.0)
void MoveDragPoint(const wxMouseEvent &event, wxRect &r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin, float zoomMax)
bool HandleMouseButtonDown(const wxMouseEvent &event, wxRect &r, const ZoomInfo &zoomInfo, bool dB, double dBRange, float zoomMin=-1.0, float zoomMax=1.0)
bool HandleMouseButtonUp()
int mContourOffset
Number of pixels contour is from the true envelope.
float ValueOfPixel(int y, int height, bool upper, bool dB, double dBRange, float zoomMin, float zoomMax)
static void DrawPoints(const Envelope &env, TrackPanelDrawingContext &context, const wxRect &r, bool dB, double dBRange, float zoomMin, float zoomMax, bool mirrored, int origin=0)
Envelope * GetEnvelope() const
Piecewise linear or piecewise exponential function from double to double.
double GetValue(double t, double sampleDur=0) const
Get envelope value at time t.
int InsertOrReplace(double when, double value)
Add a point at a particular absolute time coordinate.
void SetDragPoint(int dragPoint)
double ClampValue(double value)
size_t GetNumberOfPoints() const
Return number of points.
void MoveDragPoint(double newWhen, double value)
bool GetDragPointValid() const
void SetDragPointValid(bool valid)
static TrackArtist * Get(TrackPanelDrawingContext &)
double PositionToTime(int64 position, int64 origin=0, bool ignoreFisheye=false) const
int64 TimeToPosition(double time, int64 origin=0, bool ignoreFisheye=false) const
STM: Converts a project time to screen x position.
void DrawPoint(wxDC &dc, const wxRect &r, int x, int y, bool top)