From 17b1aa177651aae05bd94d3310ef7e8e25ec9899 Mon Sep 17 00:00:00 2001 From: Jens Steinhauser Date: Sun, 30 Aug 2015 14:16:11 +0200 Subject: [PATCH] Ruler: Fix tick mark calculation Prior to this change, due to floating point errors the loop that calculates the tick mark positions could loop thousands of iterations while zooming in at high time values, blocking the whole UI and leading to distorted text in the end. --- pv/view/ruler.cpp | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/pv/view/ruler.cpp b/pv/view/ruler.cpp index 2cd12753..87f5f9b0 100644 --- a/pv/view/ruler.cpp +++ b/pv/view/ruler.cpp @@ -96,14 +96,14 @@ void Ruler::paintEvent(QPaintEvent*) p.setPen(palette().color(foregroundRole())); const double minor_tick_period = tick_period / MinorTickSubdivision; - const double first_major_division = - floor(view_.offset() / tick_period).convert_to(); - const double first_minor_division = - ceil(view_.offset() / minor_tick_period).convert_to(); - const double t0 = first_major_division * tick_period; + const pv::util::Timestamp first_major_division = + floor(view_.offset() / tick_period); + const pv::util::Timestamp first_minor_division = + ceil(view_.offset() / minor_tick_period); + const pv::util::Timestamp t0 = first_major_division * tick_period; - int division = (int)round(first_minor_division - - first_major_division * MinorTickSubdivision) - 1; + int division = (round(first_minor_division - + first_major_division * MinorTickSubdivision)).convert_to() - 1; const int text_height = calculate_text_height(); const int ruler_height = RulerHeight * text_height; @@ -113,7 +113,7 @@ void Ruler::paintEvent(QPaintEvent*) double x; do { - const double t = t0 + division * minor_tick_period; + const pv::util::Timestamp t = t0 + division * minor_tick_period; x = ((t - view_.offset()) / view_.scale()).convert_to(); if (division % MinorTickSubdivision == 0) @@ -134,7 +134,6 @@ void Ruler::paintEvent(QPaintEvent*) } division++; - } while (x < width()); // Draw the hover mark -- 2.30.2