mirror of
https://github.com/wolfpld/tracy.git
synced 2025-03-20 07:40:02 +08:00
Draw zig-zag in place of invisible (too small) frames.
This commit is contained in:
parent
bf475a4cc2
commit
9cd6932b13
@ -986,6 +986,34 @@ bool View::DrawZoneFramesHeader()
|
|||||||
return hover;
|
return hover;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void DrawZigZag( ImDrawList* draw, const ImVec2& wpos, double start, double end, double h, uint32_t color )
|
||||||
|
{
|
||||||
|
int mode = 0;
|
||||||
|
while( start < end )
|
||||||
|
{
|
||||||
|
double step = std::min( end - start, mode == 0 ? h/2 : h );
|
||||||
|
switch( mode )
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
draw->AddLine( wpos + ImVec2( start, 0 ), wpos + ImVec2( start + step, round( -step ) ), color );
|
||||||
|
mode = 1;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
draw->AddLine( wpos + ImVec2( start, round( -h/2 ) ), wpos + ImVec2( start + step, round( step - h/2 ) ), color );
|
||||||
|
mode = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
draw->AddLine( wpos + ImVec2( start, round( h/2 ) ), wpos + ImVec2( start + step, round( h/2 - step ) ), color );
|
||||||
|
mode = 1;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert( false );
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
start += step;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool View::DrawZoneFrames( const FrameData& frames )
|
bool View::DrawZoneFrames( const FrameData& frames )
|
||||||
{
|
{
|
||||||
const auto wpos = ImGui::GetCursorScreenPos();
|
const auto wpos = ImGui::GetCursorScreenPos();
|
||||||
@ -1005,6 +1033,8 @@ bool View::DrawZoneFrames( const FrameData& frames )
|
|||||||
const std::pair <int, int> zrange = m_worker.GetFrameRange( frames, m_zvStart, m_zvEnd );
|
const std::pair <int, int> zrange = m_worker.GetFrameRange( frames, m_zvStart, m_zvEnd );
|
||||||
if( zrange.first < 0 ) return hover;
|
if( zrange.first < 0 ) return hover;
|
||||||
|
|
||||||
|
int64_t prev = -1;
|
||||||
|
|
||||||
for( int i = zrange.first; i < zrange.second; i++ )
|
for( int i = zrange.first; i < zrange.second; i++ )
|
||||||
{
|
{
|
||||||
const auto ftime = m_worker.GetFrameTime( frames, i );
|
const auto ftime = m_worker.GetFrameTime( frames, i );
|
||||||
@ -1026,45 +1056,57 @@ bool View::DrawZoneFrames( const FrameData& frames )
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( fsz <= 4 ) continue;
|
if( fsz < 5 )
|
||||||
|
{
|
||||||
|
if( prev == -1 ) prev = fbegin;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if( prev != -1 )
|
||||||
|
{
|
||||||
|
DrawZigZag( draw, wpos + ImVec2( 0, round( ty / 2 ) ), ( prev - m_zvStart ) * pxns, ( fbegin - m_zvStart ) * pxns, ty / 4, 0xFF888888 );
|
||||||
|
prev = -1;
|
||||||
|
}
|
||||||
|
|
||||||
if( fbegin >= m_zvStart && m_frames == &frames )
|
if( fbegin >= m_zvStart && m_frames == &frames )
|
||||||
{
|
{
|
||||||
draw->AddLine( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns, 0 ), wpos + ImVec2( ( fbegin - m_zvStart ) * pxns, wh ), 0x22FFFFFF );
|
draw->AddLine( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns, 0 ), wpos + ImVec2( ( fbegin - m_zvStart ) * pxns, wh ), 0x22FFFFFF );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( fsz >= 5 )
|
auto buf = GetFrameText( frames, i, ftime, m_worker.GetFrameOffset() );
|
||||||
|
auto tx = ImGui::CalcTextSize( buf ).x;
|
||||||
|
uint32_t color = ( frames.name == 0 && i == 0 ) ? 0xFF4444FF : 0xFFFFFFFF;
|
||||||
|
|
||||||
|
if( fsz - 5 <= tx )
|
||||||
{
|
{
|
||||||
auto buf = GetFrameText( frames, i, ftime, m_worker.GetFrameOffset() );
|
buf = TimeToString( ftime );
|
||||||
auto tx = ImGui::CalcTextSize( buf ).x;
|
tx = ImGui::CalcTextSize( buf ).x;
|
||||||
uint32_t color = ( frames.name == 0 && i == 0 ) ? 0xFF4444FF : 0xFFFFFFFF;
|
|
||||||
|
|
||||||
if( fsz - 5 <= tx )
|
|
||||||
{
|
|
||||||
buf = TimeToString( ftime );
|
|
||||||
tx = ImGui::CalcTextSize( buf ).x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( fbegin >= m_zvStart )
|
|
||||||
{
|
|
||||||
draw->AddLine( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2, 1 ), wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2, ty - 1 ), color );
|
|
||||||
}
|
|
||||||
if( fend <= m_zvEnd )
|
|
||||||
{
|
|
||||||
draw->AddLine( wpos + ImVec2( ( fend - m_zvStart ) * pxns - 2, 1 ), wpos + ImVec2( ( fend - m_zvStart ) * pxns - 2, ty - 1 ), color );
|
|
||||||
}
|
|
||||||
if( fsz - 5 > tx )
|
|
||||||
{
|
|
||||||
const auto part = ( fsz - 5 - tx ) / 2;
|
|
||||||
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fbegin - m_zvStart ) * pxns + part ), round( ty / 2 ) ), color );
|
|
||||||
draw->AddText( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2 + part, 0 ), color, buf );
|
|
||||||
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 + part + tx ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fend - m_zvStart ) * pxns - 2 ), round( ty / 2 ) ), color );
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fend - m_zvStart ) * pxns - 2 ), round( ty / 2 ) ), color );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( fbegin >= m_zvStart )
|
||||||
|
{
|
||||||
|
draw->AddLine( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2, 1 ), wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2, ty - 1 ), color );
|
||||||
|
}
|
||||||
|
if( fend <= m_zvEnd )
|
||||||
|
{
|
||||||
|
draw->AddLine( wpos + ImVec2( ( fend - m_zvStart ) * pxns - 2, 1 ), wpos + ImVec2( ( fend - m_zvStart ) * pxns - 2, ty - 1 ), color );
|
||||||
|
}
|
||||||
|
if( fsz - 5 > tx )
|
||||||
|
{
|
||||||
|
const auto part = ( fsz - 5 - tx ) / 2;
|
||||||
|
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fbegin - m_zvStart ) * pxns + part ), round( ty / 2 ) ), color );
|
||||||
|
draw->AddText( wpos + ImVec2( ( fbegin - m_zvStart ) * pxns + 2 + part, 0 ), color, buf );
|
||||||
|
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 + part + tx ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fend - m_zvStart ) * pxns - 2 ), round( ty / 2 ) ), color );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
draw->AddLine( wpos + ImVec2( std::max( -10.0, ( fbegin - m_zvStart ) * pxns + 2 ), round( ty / 2 ) ), wpos + ImVec2( std::min( w + 20.0, ( fend - m_zvStart ) * pxns - 2 ), round( ty / 2 ) ), color );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( prev != -1 )
|
||||||
|
{
|
||||||
|
DrawZigZag( draw, wpos + ImVec2( 0, round( ty / 2 ) ), ( prev - m_zvStart ) * pxns, ( m_worker.GetFrameBegin( frames, zrange.second-1 ) - m_zvStart ) * pxns, ty / 4, 0xFF888888 );
|
||||||
|
prev = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto fend = m_worker.GetFrameEnd( frames, zrange.second-1 );
|
const auto fend = m_worker.GetFrameEnd( frames, zrange.second-1 );
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user