void CScratchPadGraph::AddVerticalLine( float flTime, float flMinValue, float flMaxValue, const CSPColor &vColor ) { Vector v1 = GetSamplePosition( flTime, flMinValue ); Vector v2 = GetSamplePosition( flTime, flMaxValue ); m_pPad->DrawLine( CSPVert( v1, vColor ), CSPVert( v2, vColor ) ); }
void CScratchPadGraph::AddSample( LineID iLine, float flTime, float flValue ) { CScratchPadGraph::CLineInfo *pInfo = &m_LineInfos[iLine]; UpdateTicksAndStuff( flTime, flValue ); if ( !pInfo->m_bFirst ) { // Draw a line from the last value to the current one. Vector vStart = GetSamplePosition( pInfo->m_flLastTime, pInfo->m_flLastValue ); Vector vEnd = GetSamplePosition( flTime, flValue ); m_pPad->DrawLine( CSPVert( vStart, pInfo->m_vColor ), CSPVert( vEnd, pInfo->m_vColor ) ); } pInfo->m_flLastTime = flTime; pInfo->m_flLastValue = flValue; pInfo->m_bFirst = false; }
int YsWavFile::GetSignedValue(int atTimeStep,int channel) const { const size_t sampleIdx=GetSamplePosition(atTimeStep); const size_t unitSize=GetUnitSize(); if(sampleIdx+unitSize<=sizeInBytes && 0<=channel && channel<GetNumChannel()) { int rawSignedValue=0; size_t offset=sampleIdx+channel*BytePerSample(); switch(BitPerSample()) { case 8: if(YSTRUE==isSigned) { rawSignedValue=dat[offset]; if(128<=rawSignedValue) { rawSignedValue-=256; } } else { rawSignedValue=dat[offset]-128; } break; case 16: // Assume little endian rawSignedValue=dat[offset]+256*dat[offset+1]; if(YSTRUE==isSigned) { if(32768<=rawSignedValue) { rawSignedValue-=65536; } } else { rawSignedValue-=32768; } break; } return rawSignedValue; } return 0; }
void CScratchPadGraph::UpdateTicksAndStuff( float flTime, float flValue ) { if ( flTime > m_flHighestTime ) { // Update the left part of the time axis. Vector vStart = GetSamplePosition( m_flHighestTime, m_flValueOrigin ); Vector vEnd = GetSamplePosition( flTime, m_flValueOrigin ); m_pPad->DrawLine( CSPVert( vStart, m_vTimeLineColor ), CSPVert( vEnd, m_vTimeLineColor ) ); m_flHighestTime = flTime; } if ( flValue > m_flHighestValue ) { // Update the left part of the time axis. Vector vStart = GetSamplePosition( m_flTimeOrigin, m_flHighestValue ); Vector vEnd = GetSamplePosition( m_flTimeOrigin, flValue ); m_pPad->DrawLine( CSPVert( vStart, m_vValueLineColor ), CSPVert( vEnd, m_vValueLineColor ) ); // Extend the lines attached to the time labels. for ( int i=0; i < m_nTimeLabelsDrawn; i++ ) { float flTime = m_flTimeOrigin + m_nTimeLabelsDrawn * m_flTimeLabelEveryNSeconds; m_pPad->DrawLine( CSPVert((const Vector&) GetSamplePosition( flTime, m_flHighestValue )), CSPVert((const Vector&) GetSamplePosition( flTime, flValue ) ) ); } m_flHighestValue = flValue; } // More text labels? int iHighestTextLabel = (int)ceil( (flTime - m_flTimeOrigin) / m_flTimeLabelEveryNSeconds + 0.5f ); while ( m_nTimeLabelsDrawn < iHighestTextLabel ) { CTextParams params; float flTime = m_flTimeOrigin + m_nTimeLabelsDrawn * m_flTimeLabelEveryNSeconds; params.m_bSolidBackground = true; params.m_vPos = GetSamplePosition( flTime, m_flValueOrigin-5 ); params.m_bTwoSided = true; char str[512]; Q_snprintf( str, sizeof( str ), "time: %.2f", flTime ); m_pPad->DrawText( str, params ); // Now draw the vertical line for the value.. m_pPad->DrawLine( CSPVert( (const Vector&)GetSamplePosition( flTime, m_flValueOrigin ) ), CSPVert( (const Vector&)GetSamplePosition( flTime, m_flHighestValue ) ) ); m_nTimeLabelsDrawn++; } }