287 lines
8.6 KiB
Diff
287 lines
8.6 KiB
Diff
--- a/src/wxparaver/src/gtimeline.cpp 2019-09-13 13:18:03.000000000 +0200
|
|
+++ b/src/wxparaver/src/gtimeline.cpp 2020-11-30 13:18:50.121429888 +0100
|
|
@@ -607,8 +607,8 @@
|
|
// Paint blank image while redrawing
|
|
wxClientDC dc( drawZone );
|
|
#ifdef __WXGTK__
|
|
- dc.DrawBitmap( bufferImage, 0, 0, false );
|
|
- drawZone->Update();
|
|
+// dc.DrawBitmap( bufferImage, 0, 0, false );
|
|
+// drawZone->Update();
|
|
#endif
|
|
|
|
if( !drawAxis( bufferDraw, selectedSet ) )
|
|
@@ -1365,13 +1365,66 @@
|
|
|
|
void gTimeline::drawRowEvents( wxDC& eventdc, wxDC& eventmaskdc, TObjectOrder rowPos, hash_set< PRV_INT32 >& eventsToDraw )
|
|
{
|
|
+ int last_x = -100, x, xx;
|
|
+ int i, neigh, max_x;
|
|
+
|
|
+ /* Keep track of other events in nearby pixels */
|
|
+ max_x = myWindow->getWidth();
|
|
+ int *table = new int[max_x];
|
|
+
|
|
+ for(i=0; i<max_x; i++)
|
|
+ {
|
|
+ table[i] = 0;
|
|
+ }
|
|
+
|
|
for( hash_set< PRV_INT32 >::iterator it = eventsToDraw.begin(); it != eventsToDraw.end(); ++it )
|
|
{
|
|
+ /* Add a new event in the x position in the table */
|
|
+ x = *it;
|
|
+ assert(0 <= x);
|
|
+ assert(x < max_x);
|
|
+ table[*it]++;
|
|
+ }
|
|
+
|
|
+ for( hash_set< PRV_INT32 >::iterator it = eventsToDraw.begin(); it != eventsToDraw.end(); ++it )
|
|
+ {
|
|
+ /*
|
|
+ * Draws an event with 4 segments: AE, BF, CG and DH
|
|
+ *
|
|
+ * A B C D
|
|
+ * * * * *
|
|
+ * * * * *
|
|
+ * * * * *
|
|
+ * * F G H
|
|
+ * *
|
|
+ * *
|
|
+ * E
|
|
+ */
|
|
+
|
|
+ /* If the event is very close to another one, we paint it red, so we
|
|
+ * now that we may need to zoom to see more closely how many events
|
|
+ * are there. Otherwise we paint it green. */
|
|
+ x = *it;
|
|
+
|
|
+ /* Count neighbour events */
|
|
+ neigh = 0;
|
|
+ for(xx=x-5; xx<=x+5; xx++)
|
|
+ {
|
|
+ if(0 <= xx && xx < max_x)
|
|
+ neigh += table[xx];
|
|
+ }
|
|
+
|
|
+ /* Paint the event red if there are more events close */
|
|
+ if(neigh > 1)
|
|
+ eventdc.SetPen( *wxRED_PEN );
|
|
+ else
|
|
+ eventdc.SetPen( *wxGREEN_PEN );
|
|
+
|
|
eventdc.DrawLine( *it, rowPos - 6, *it, rowPos );
|
|
- eventdc.DrawLine( *it+1, rowPos - 6, *it+1, rowPos-3 );
|
|
- eventdc.DrawLine( *it+2, rowPos - 6, *it+2, rowPos-3 );
|
|
- eventdc.DrawLine( *it+3, rowPos - 6, *it+3, rowPos-3 );
|
|
- eventdc.DrawLine( *it+4, rowPos - 6, *it+4, rowPos-3 );
|
|
+// eventdc.DrawLine( *it+1, rowPos - 6, *it+1, rowPos-3 );
|
|
+// eventdc.DrawLine( *it+2, rowPos - 6, *it+2, rowPos-3 );
|
|
+// eventdc.DrawLine( *it+3, rowPos - 6, *it+3, rowPos-3 );
|
|
+// eventdc.DrawLine( *it+4, rowPos - 6, *it+4, rowPos-3 );
|
|
#ifndef __WXMAC__
|
|
eventmaskdc.DrawLine( *it, rowPos - 6, *it, rowPos );
|
|
eventmaskdc.DrawLine( *it+1, rowPos - 6, *it+1, rowPos-3 );
|
|
@@ -1379,8 +1432,12 @@
|
|
eventmaskdc.DrawLine( *it+3, rowPos - 6, *it+3, rowPos-3 );
|
|
eventmaskdc.DrawLine( *it+4, rowPos - 6, *it+4, rowPos-3 );
|
|
#endif
|
|
+
|
|
+ last_x = x;
|
|
}
|
|
|
|
+ delete table;
|
|
+
|
|
}
|
|
|
|
|
|
@@ -2427,7 +2484,7 @@
|
|
|
|
motionEvent = event;
|
|
if( !event.ShiftDown() )
|
|
- timerMotion->Start( 20, true );
|
|
+ timerMotion->Start( 2, true );
|
|
|
|
wxMemoryDC dc( bufferImage );
|
|
// PRV_UINT32 precision = ParaverConfig::getInstance()->getTimelinePrecision();
|
|
@@ -4651,12 +4708,18 @@
|
|
|
|
void gTimeline::OnTimerMotion( wxTimerEvent& event )
|
|
{
|
|
+ int mx, my;
|
|
+
|
|
+ mx = motionEvent.GetX();
|
|
+ my = motionEvent.GetY();
|
|
+
|
|
if( motionEvent.GetX() < objectAxisPos + 1 || motionEvent.GetX() > bufferImage.GetWidth() - drawBorder ||
|
|
motionEvent.GetY() < drawBorder || motionEvent.GetY() > timeAxisPos - 1 )
|
|
return;
|
|
|
|
wxMemoryDC dc( bufferImage );
|
|
wxColour tmpColor;
|
|
+ wxClientDC paintDC( drawZone );
|
|
|
|
wxString label;
|
|
if( zooming || timing || wxGetApp().GetGlobalTiming() )
|
|
@@ -4704,7 +4767,11 @@
|
|
#endif
|
|
|
|
if( tmpColor == backgroundColour )
|
|
+ {
|
|
+ /* Just clean and exit */
|
|
+ paintDC.DrawBitmap( drawImage, 0, 0 );
|
|
return;
|
|
+ }
|
|
|
|
rgb color = { (ParaverColor)tmpColor.Red(), (ParaverColor)tmpColor.Green(), (ParaverColor)tmpColor.Blue() };
|
|
TSemanticValue firstValue, secondValue;
|
|
@@ -4762,38 +4829,109 @@
|
|
}
|
|
}
|
|
|
|
-#ifndef __WXGTK__
|
|
- wxClientDC paintDC( drawZone );
|
|
- #ifdef __WXMAC__
|
|
- drawStackedImages( paintDC );
|
|
- #else
|
|
- paintDC.DrawBitmap( drawImage, 0, 0 );
|
|
- #endif
|
|
-#else
|
|
- #if wxMAJOR_VERSION<3
|
|
- wxPaintDC paintDC( drawZone );
|
|
- #else
|
|
- wxClientDC paintDC( drawZone );
|
|
- #endif
|
|
- paintDC.DrawBitmap( drawImage, 0, 0 );
|
|
-#endif
|
|
-
|
|
paintDC.SetFont( semanticFont );
|
|
+ paintDC.SetPen( backgroundColour );
|
|
+ paintDC.SetBrush( backgroundColour );
|
|
+ paintDC.SetTextForeground( foregroundColour );
|
|
+
|
|
+ /* Draw the label close to the mouse, so it's easier to follow */
|
|
+ int label_x0, label_y0;
|
|
+ label_x0 = mx + 20;
|
|
+ label_y0 = my + 20;
|
|
+ paintDC.SetPen( *wxBLACK_PEN );
|
|
+ paintDC.SetBrush( *wxBLACK_BRUSH );
|
|
+
|
|
+ /* Draw a filled black rectangle behind the label, so is easy to read
|
|
+ * when placed over multiple colors from the trace */
|
|
+ int rect_x0, rect_y0, rect_w, rect_h;
|
|
+ rect_x0 = label_x0 - 5;
|
|
+ rect_y0 = label_y0 - 5;
|
|
+
|
|
+ TObjectOrder row;
|
|
+ TTime time;
|
|
+
|
|
+ /* Fills "row" and "time" objects if is over a TimeObject (?) */
|
|
+ bool print_duration = true;
|
|
+ double tp, tn;
|
|
+
|
|
+ /* This whole thing to get the event is completely crap. We may get a
|
|
+ * pixel here that belong to a different event, probably due to
|
|
+ * rounding operations when dealing with time.
|
|
+ *
|
|
+ * To avoid giving misleading information, we only print the time when
|
|
+ * both neighbour pixels are also from the same event */
|
|
+ print_duration &= pixelToTimeObject(mx, my, time, row);
|
|
+ print_duration &= pixelToTimeObject(mx-2, my, tp, row);
|
|
+ print_duration &= pixelToTimeObject(mx+2, my, tn, row);
|
|
+
|
|
+ if(time <= tp) print_duration = false;
|
|
+ if(tn <= time) print_duration = false;
|
|
+
|
|
+ //computeWhatWhere(time, row, 0.0, false, false);
|
|
+
|
|
+ //printf("time = %e\n", time);
|
|
+ //printf("begin time = %e\n", myWindow->getBeginTime(row));
|
|
+
|
|
+ if(print_duration)
|
|
+ {
|
|
+ double t0, t1, t, dt;
|
|
+ t = time;
|
|
+
|
|
+ myWindow->init(t, CREATEEVENTS + CREATECOMMS, false );
|
|
+ myWindow->initRow(row, t, CREATEEVENTS + CREATECOMMS, false );
|
|
+
|
|
+ t0 = myWindow->getBeginTime(row);
|
|
+ t1 = myWindow->getEndTime(row);
|
|
+
|
|
+ //printf("t0=%e t=%e t1=%e\n", t0, t, t1);
|
|
+ while(!(t0 <= t && t <= t1))
|
|
+ {
|
|
+ myWindow->calcNext(row);
|
|
+ t0 = myWindow->getBeginTime(row);
|
|
+ t1 = myWindow->getEndTime(row);
|
|
+ //printf("t0=%e t=%e t1=%e\n", t0, t, t1);
|
|
+ if(t0 > t)
|
|
+ {
|
|
+ //printf("we are out\n");
|
|
+ break;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ /* Only add the duration if we are more than one pixel away from the
|
|
+ * border */
|
|
+ if(t0 < tp && tn < t1)
|
|
+ {
|
|
+ if(t0 > t)
|
|
+ dt = 0;
|
|
+ else
|
|
+ dt = t1 - t0;
|
|
+
|
|
+ assert(t0 <= time);
|
|
+ assert(time <= t1);
|
|
+
|
|
+ wxString duration = wxString::FromAscii( LabelConstructor::timeLabel(
|
|
+ myWindow->traceUnitsToWindowUnits( dt ),
|
|
+ myWindow->getTimeUnit(),
|
|
+ ParaverConfig::getInstance()->getTimelinePrecision() ).c_str() );
|
|
+
|
|
+ label << wxT( " (" ) << duration << wxT(")");
|
|
+ }
|
|
+ }
|
|
+
|
|
wxSize objectExt = paintDC.GetTextExtent( label );
|
|
+ rect_w = objectExt.GetWidth() + 10;
|
|
+ rect_h = objectExt.GetHeight() + 10;
|
|
+
|
|
+ /* Erase previous bitmap */
|
|
+ paintDC.DrawBitmap( drawImage, 0, 0 );
|
|
+
|
|
+ /* Draw black rectangle */
|
|
+ paintDC.DrawRectangle( rect_x0, rect_y0, rect_w, rect_h );
|
|
|
|
+ /* Then place the label */
|
|
+ paintDC.DrawText( label, label_x0, label_y0);
|
|
paintDC.SetPen( backgroundColour );
|
|
paintDC.SetBrush( backgroundColour );
|
|
-// paintDC.DrawRectangle( ( bufferImage.GetWidth() - objectAxisPos ) / 2, timeAxisPos + 1, objectExt.GetWidth() + 30, bufferImage.GetHeight() - timeAxisPos );
|
|
- if( !( zooming || timing || wxGetApp().GetGlobalTiming() ) )
|
|
- {
|
|
- paintDC.SetBrush( tmpColor );
|
|
- paintDC.DrawRectangle( ( bufferImage.GetWidth() - objectAxisPos ) / 2, timeAxisPos + 2, 10, bufferImage.GetHeight() - timeAxisPos - 3 );
|
|
- }
|
|
- paintDC.SetTextForeground( foregroundColour );
|
|
- if( zooming )
|
|
- paintDC.DrawText( label, ( bufferImage.GetWidth() - objectAxisPos ) / 2 + objectAxisPos - ( objectExt.GetWidth() / 2 ), timeAxisPos + 3 );
|
|
- else
|
|
- paintDC.DrawText( label, ( bufferImage.GetWidth() - objectAxisPos ) / 2 + 12, timeAxisPos + 3 );
|
|
}
|
|
|
|
void gTimeline::OnTimerWheel( wxTimerEvent& event )
|
|
@@ -5075,7 +5213,11 @@
|
|
endRow = TObjectOrder( floor( ( y - drawBorder - 1 ) / heightPerRow ) );
|
|
|
|
if( endRow >= numObjects )
|
|
+ {
|
|
endRow = numObjects - 1;
|
|
+ printf("endRow exceeds numObjects, capped to %d\n", endRow);
|
|
+ }
|
|
+ //printf("endRow = %d\n", endRow);
|
|
onObject = selected[ endRow ];
|
|
|
|
return true;
|