wxBrush &GetGreyBrush(wxBrush &brush) { static wxBrush b; wxColour c; b = brush; c = MakeColourGrey(brush.GetColour()); b.SetColour(c); return b; }
bool SjOscStar::Draw(wxDC& dc, const wxSize& clientSize, double rot, wxPen& pen, wxBrush& brush) { double xfloat, yfloat; int x, y, hh, vv; int d, intensity; m_z -= 2; if( m_z < -63 ) { m_z = STAR_DEPTH; m_doDraw = !m_exitRequest; } hh = (m_x*64)/(64+m_z); vv = (m_y*64)/(64+m_z); // check position x = hh + 500; y = vv + 500; if( x < -300 || x > 1300 || y < -300 || y > 1300 ) { m_z = STAR_DEPTH; m_doDraw = !m_exitRequest; hh = (m_x*64)/(64+m_z); vv = (m_y*64)/(64+m_z); } // calculate position xfloat = (hh*cos(rot))-(vv*sin(rot)); yfloat = (hh*sin(rot))+(vv*cos(rot)); x = (int)xfloat + 500; y = (int)yfloat + 500; // use star? if( !m_doDraw ) { if( m_exitRequest || x < 450 || x > 550 || y < 450 || y > 550 ) { return FALSE; } else { m_doDraw = TRUE; } } // map star position to client size, keep aspect ratio d = clientSize.x; if( clientSize.y > d ) { d = clientSize.y; } if( d == 0 ) { d = 10; } x = (x * d) / 1000 - (d-clientSize.x)/2; y = (y * d) / 1000 - (d-clientSize.y)/2; // calculate size d = (STAR_DEPTH-m_z) / (38400/d); if( d == 0 ) d = 1; // calculate light intensity intensity = STAR_DEPTH-m_z; intensity = 55 + ((intensity * 200) / STAR_DEPTH); //if( intensity < light ) intensity = light + 10; if( intensity < 0 ) intensity = 0; if( intensity > 255 ) intensity = 255; // draw star if( d==1 ) { pen.SetColour(intensity, intensity, intensity); dc.SetPen(pen); dc.DrawPoint(x, y); } else { dc.SetPen(*wxTRANSPARENT_PEN); brush.SetColour(intensity, intensity, intensity); dc.SetBrush(brush); dc.DrawRectangle(x, y, d, d); } return TRUE; }
void SjOscWindow::OnTimer(wxTimerEvent&) { SJ_FORCE_IN_HERE_ONLY_ONCE; if( m_oscModule ) { // volume stuff long volume, maxVolume = 1; bool volumeBeat; // other objects long i; bool titleChanged, forceOscAnim, forceSpectrAnim; wxString newTitle; // get data g_mainFrame->m_player.GetVisData(m_bufferStart, m_sampleCount*SJ_WW_CH*SJ_WW_BYTERES, 0); // get window client size, correct offscreen DC if needed wxSize clientSize = m_oscModule->m_oscWindow->GetClientSize(); if( clientSize.x != m_offscreenBitmap.GetWidth() || clientSize.y != m_offscreenBitmap.GetHeight() ) { m_offscreenBitmap.Create(clientSize.x, clientSize.y); m_offscreenDc.SelectObject(m_offscreenBitmap); } // calculate the points for the lines, collect volume m_oscilloscope->Calc(clientSize, m_bufferStart, volume); if( m_oscModule->m_showFlags&SJ_OSC_SHOW_SPECTRUM ) { m_spectrum->Calc(clientSize, m_bufferStart); } // get data that are shared between the threads { titleChanged = m_oscModule->m_titleChanged; m_oscModule->m_titleChanged = FALSE; if( titleChanged ) { newTitle = m_oscModule->m_trackName; if( newTitle.IsEmpty() ) { newTitle = SJ_PROGRAM_NAME; } else if( !m_oscModule->m_leadArtistName.IsEmpty() ) { newTitle.Prepend(m_oscModule->m_leadArtistName + wxT(" - ")); } } forceOscAnim = m_oscModule->m_forceOscAnim; m_oscModule->m_forceOscAnim = FALSE; forceSpectrAnim = m_oscModule->m_forceSpectrAnim; m_oscModule->m_forceSpectrAnim = FALSE; } // calculate volume, volume is theoretically max. 255, normally lesser if( titleChanged ) { maxVolume = 1; } if( volume > maxVolume ) { maxVolume = volume; } volumeBeat = (volume > maxVolume/2); // erase screen m_offscreenDc.SetPen(*wxTRANSPARENT_PEN); { // blue gradient background #define BG_STEPS 88 int rowH = (clientSize.y/BG_STEPS)+1; for( i = 0; i < BG_STEPS; i++ ) { m_bgBrush.SetColour(0, 0, i); m_offscreenDc.SetBrush(m_bgBrush); m_offscreenDc.DrawRectangle(0, i*rowH, clientSize.x, rowH); } } // draw text (very background) { m_offscreenDc.SetBackgroundMode(wxTRANSPARENT); m_offscreenDc.SetTextForeground(m_textColour); m_title->Draw(m_offscreenDc, clientSize, titleChanged, newTitle); } // draw figures (they lay in backgroud) if( m_oscModule->m_showFlags&SJ_OSC_SHOW_FIGURES ) { long bgLight = 100; // draw hands (optional) m_hands->Draw(m_offscreenDc, clientSize, volume, bgLight, titleChanged); // draw rotor (optional) m_rotor->Draw(m_offscreenDc, clientSize, m_starfield->IsRunning(), titleChanged, volume, bgLight); // draw firework (optional) m_firework->Draw(m_offscreenDc, clientSize, titleChanged, m_starfield->IsRunning(), volumeBeat, bgLight); } // draw starfield (optional) m_starfield->Draw(m_offscreenDc, clientSize, false, titleChanged, (m_oscModule->m_showFlags&SJ_OSC_SHOW_STARFIELD)!=0); // draw spectrum and/or oscilloscope (for both, the spectrum lays over the oscillosope) m_offscreenDc.SetPen(m_fgPen); if( m_oscModule->m_showFlags&SJ_OSC_SHOW_OSC ) { m_oscilloscope->Draw(m_offscreenDc, forceOscAnim); } if( m_oscModule->m_showFlags&SJ_OSC_SHOW_SPECTRUM ) { m_spectrum->Draw(m_offscreenDc, volumeBeat, (m_oscModule->m_showFlags&SJ_OSC_SHOW_FIGURES)? true : false, forceSpectrAnim); } // draw offscreen bitmap to screen wxClientDC dc(this); dc.Blit(0, 0, m_offscreenBitmap.GetWidth(), m_offscreenBitmap.GetHeight(), &m_offscreenDc, 0, 0); } }
void ThemeBase::SetBrushColour( wxBrush & Brush, int iIndex ) { wxASSERT( iIndex >= 0 ); Brush.SetColour( Colour( iIndex )); }