]> sigrok.org Git - pulseview.git/commitdiff
Ruler: Fix tick mark calculation
authorJens Steinhauser <redacted>
Sun, 30 Aug 2015 12:16:11 +0000 (14:16 +0200)
committerUwe Hermann <redacted>
Fri, 4 Sep 2015 10:54:52 +0000 (12:54 +0200)
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

index 2cd1275348d737f9f2f3c6fd1868c977118fe7aa..87f5f9b08d3f831eb638fdc065bfbeaf82cf54d3 100644 (file)
@@ -96,14 +96,14 @@ void Ruler::paintEvent(QPaintEvent*)
        p.setPen(palette().color(foregroundRole()));
 
        const double minor_tick_period = tick_period / MinorTickSubdivision;
        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<double>();
-       const double first_minor_division =
-               ceil(view_.offset() / minor_tick_period).convert_to<double>();
-       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<int>() - 1;
 
        const int text_height = calculate_text_height();
        const int ruler_height = RulerHeight * text_height;
 
        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 {
        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<double>();
 
                if (division % MinorTickSubdivision == 0)
                x = ((t - view_.offset()) / view_.scale()).convert_to<double>();
 
                if (division % MinorTickSubdivision == 0)
@@ -134,7 +134,6 @@ void Ruler::paintEvent(QPaintEvent*)
                }
 
                division++;
                }
 
                division++;
-
        } while (x < width());
 
        // Draw the hover mark
        } while (x < width());
 
        // Draw the hover mark