void EqualizationPanel::OnPaint(wxPaintEvent & evt) { wxPaintDC dc(this); int width, height; GetSize(&width, &height); if (!mBitmap || mWidth!=width || mHeight!=height) { if (mBitmap) delete mBitmap; mWidth = width; mHeight = height; mBitmap = new wxBitmap(mWidth, mHeight); } wxColour bkgnd = GetBackgroundColour(); wxBrush bkgndBrush(bkgnd, wxSOLID); wxMemoryDC memDC; memDC.SelectObject(*mBitmap); wxRect bkgndRect; bkgndRect.x = 0; bkgndRect.y = 0; bkgndRect.width = 40; bkgndRect.height = mHeight; memDC.SetBrush(bkgndBrush); memDC.SetPen(*wxTRANSPARENT_PEN); memDC.DrawRectangle(bkgndRect); bkgndRect.y = mHeight - 20; bkgndRect.width = mWidth; bkgndRect.height = 20; memDC.DrawRectangle(bkgndRect); wxRect border; border.x = 40; border.y = 0; border.width = mWidth; border.height = mHeight - 20; memDC.SetBrush(*wxWHITE_BRUSH); memDC.SetPen(*wxBLACK_PEN); memDC.DrawRectangle(border); mEnvRect.x = 44; mEnvRect.width = mWidth - 50; mEnvRect.y = 3; mEnvRect.height = mHeight - 26; // Pure blue x-axis line memDC.SetPen(wxPen(wxColour(0, 0, 255), 1, wxSOLID)); int center = mEnvRect.height/2; memDC.DrawLine(mEnvRect.x, mEnvRect.y + center, mEnvRect.x + mEnvRect.width, mEnvRect.y + center); // Med-blue envelope line memDC.SetPen(wxPen(wxColour(110, 110, 220), 3, wxSOLID)); // Draw envelope double *values = new double[mEnvRect.width]; mEnvelope->GetValues(values, mEnvRect.width, 0.0, 1.0/mEnvRect.width); int x, y, xlast = 0, ylast = 0; for(int i=0; i<mEnvRect.width; i++) { x = mEnvRect.x + i; y = (int)(mEnvRect.height-mEnvRect.height*values[i]); if (i != 0) { memDC.DrawLine(xlast, ylast, x, mEnvRect.y + y); } xlast = x; ylast = y; } delete[] values; memDC.SetPen(*wxBLACK_PEN); mEnvRect.y -= 5; mEnvelope->Draw(memDC, mEnvRect, 0.0, mEnvRect.width, false, 0.0, 1.0); mEnvRect.y += 5; // Paint border again memDC.SetBrush(*wxTRANSPARENT_BRUSH); memDC.SetPen(*wxBLACK_PEN); memDC.DrawRectangle(border); // Ruler Ruler dbRuler; dbRuler.SetBounds(0, 0, 40, mHeight-21); dbRuler.SetOrientation(wxVERTICAL); dbRuler.SetRange(30, -30); dbRuler.SetFormat(Ruler::LinearDBFormat); dbRuler.SetUnits("dB"); dbRuler.Draw(memDC); Ruler freqRuler; freqRuler.SetBounds(41, mHeight-20, mWidth, mHeight); freqRuler.SetOrientation(wxHORIZONTAL); freqRuler.SetLog(true); freqRuler.SetRange(mLoFreq, mHiFreq); freqRuler.SetFormat(Ruler::IntFormat); freqRuler.SetUnits("Hz"); freqRuler.SetFlip(true); freqRuler.Draw(memDC); dc.Blit(0, 0, mWidth, mHeight, &memDC, 0, 0, wxCOPY, FALSE); }
void EffectCompressorPanel::OnPaint(wxPaintEvent & WXUNUSED(evt)) { wxPaintDC dc(this); int width, height; GetSize(&width, &height); double rangeDB = 60; // Ruler int w = 0; int h = 0; Ruler vRuler; vRuler.SetBounds(0, 0, width, height); vRuler.SetOrientation(wxVERTICAL); vRuler.SetRange(0, -rangeDB); vRuler.SetFormat(Ruler::LinearDBFormat); vRuler.SetUnits(_("dB")); vRuler.GetMaxSize(&w, NULL); Ruler hRuler; hRuler.SetBounds(0, 0, width, height); hRuler.SetOrientation(wxHORIZONTAL); hRuler.SetRange(-rangeDB, 0); hRuler.SetFormat(Ruler::LinearDBFormat); hRuler.SetUnits(_("dB")); hRuler.SetFlip(true); hRuler.GetMaxSize(NULL, &h); vRuler.SetBounds(0, 0, w, height - h); hRuler.SetBounds(w, height - h, width, height); #if defined(__WXMSW__) dc.Clear(); #endif wxRect border; border.x = w; border.y = 0; border.width = width - w; border.height = height - h + 1; dc.SetBrush(*wxWHITE_BRUSH); dc.SetPen(*wxBLACK_PEN); dc.DrawRectangle(border); wxRect envRect = border; envRect.Deflate( 2, 2 ); int kneeX = lrint((rangeDB+threshold)*envRect.width/rangeDB); int kneeY = lrint((rangeDB+threshold/ratio)*envRect.height/rangeDB); int finalY = envRect.height; int startY = lrint((threshold*(1.0/ratio-1.0))*envRect.height/rangeDB); // Yellow line for threshold /* dc.SetPen(wxPen(wxColour(220, 220, 0), 1, wxSOLID)); AColor::Line(dc, envRect.x, envRect.y + envRect.height - kneeY, envRect.x + envRect.width - 1, envRect.y + envRect.height - kneeY);*/ // Was: Nice dark red line for the compression diagram // dc.SetPen(wxPen(wxColour(180, 40, 40), 3, wxSOLID)); // Nice blue line for compressor, same color as used in the waveform envelope. dc.SetPen( AColor::WideEnvelopePen) ; AColor::Line(dc, envRect.x, envRect.y + envRect.height - startY, envRect.x + kneeX - 1, envRect.y + envRect.height - kneeY); AColor::Line(dc, envRect.x + kneeX, envRect.y + envRect.height - kneeY, envRect.x + envRect.width - 1, envRect.y + envRect.height - finalY); // Paint border again dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.SetPen(*wxBLACK_PEN); dc.DrawRectangle(border); vRuler.Draw(dc); hRuler.Draw(dc); }