From 53b8fd534e2051a992f5a3db35feb02b8e516fa0 Mon Sep 17 00:00:00 2001 From: James Crook <james.k.crook@gmail.com> Date: Fri, 8 Jan 2016 22:05:48 +0000 Subject: [PATCH] Residuals from Bug 1296 Added forcing time64 to be positive. Fixes problem where large negative value overflows into int. More careful computation of TimeToPosition() so floor is only called with in range values. Re-instated 'true' flags for hiddenMid calls, which I'd mistakenly dropped, so that (later) FishEye can distinguish. --- src/TrackArtist.cpp | 13 ++++++++++--- src/ViewInfo.cpp | 10 +++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/TrackArtist.cpp b/src/TrackArtist.cpp index 77b98f8afc..76a4297679 100644 --- a/src/TrackArtist.cpp +++ b/src/TrackArtist.cpp @@ -1590,7 +1590,9 @@ struct ClipParameters hiddenLeftOffset = 0; if (tpre < 0) { // Fix Bug #1296 caused by premature conversion to (int). - wxInt64 time64 = zoomInfo.TimeToPosition(tOffset, 0 , false); + wxInt64 time64 = zoomInfo.TimeToPosition(tOffset, 0 , true); + if( time64 < 0 ) + time64 = 0; hiddenLeftOffset = (time64 < rect.width) ? (int)time64 : rect.width; hiddenMid.x += hiddenLeftOffset; @@ -1602,12 +1604,13 @@ struct ClipParameters // of the track. Reduce the "hiddenMid" rect by the // size of the blank area. if (tpost > t1) { - wxInt64 time64 = zoomInfo.TimeToPosition(tOffset+t1, 0 , false); + wxInt64 time64 = zoomInfo.TimeToPosition(tOffset+t1, 0 , true); + if( time64 < 0 ) + time64 = 0; const int hiddenRightOffset = (time64 < rect.width) ? (int)time64 : rect.width; hiddenMid.width = std::max(0, hiddenRightOffset - hiddenLeftOffset); } - // The variable "mid" will be the rectangle containing the // actual waveform, as distorted by the fisheye, // as opposed to any blank area before or after the track. @@ -1619,6 +1622,8 @@ struct ClipParameters leftOffset = 0; if (tpre < 0) { wxInt64 time64 = zoomInfo.TimeToPosition(tOffset, 0 , false); + if( time64 < 0 ) + time64 = 0; leftOffset = (time64 < rect.width) ? (int)time64 : rect.width; mid.x += leftOffset; @@ -1631,6 +1636,8 @@ struct ClipParameters // size of the blank area. if (tpost > t1) { wxInt64 time64 = zoomInfo.TimeToPosition(tOffset+t1, 0 , false); + if( time64 < 0 ) + time64 = 0; const int distortedRightOffset = (time64 < rect.width) ? (int)time64 : rect.width; mid.width = std::max(0, distortedRightOffset - leftOffset); diff --git a/src/ViewInfo.cpp b/src/ViewInfo.cpp index 6f659563b3..1b8b77099f 100644 --- a/src/ViewInfo.cpp +++ b/src/ViewInfo.cpp @@ -58,9 +58,13 @@ wxInt64 ZoomInfo::TimeToPosition(double projectTime, , bool // ignoreFisheye ) const { - return floor(0.5 + - zoom * (projectTime - h) + origin - ); + double t = 0.5 + zoom * (projectTime - h) + origin ; + if( t < wxINT64_MIN ) + return wxINT64_MIN; + if( t > wxINT64_MAX ) + return wxINT64_MAX; + t = floor( t ); + return t; } bool ZoomInfo::ZoomInAvailable() const -- GitLab