From: Jens Steinhauser Date: Sun, 30 Aug 2015 12:16:11 +0000 (+0200) Subject: Ruler: Fix tick mark calculation X-Git-Tag: pulseview-0.3.0~121 X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=commitdiff_plain;h=17b1aa177651aae05bd94d3310ef7e8e25ec9899;hp=d001f416aec37d5b13b804dec9ee9e1c011ffabb 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. --- 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