From 73b462112134baa70033c1d278b0784b7b96dff4 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 12 Jul 2023 02:28:56 +0300 Subject: [PATCH] Cached current x-axis indices to reduce redundant calculations. --- .../SourceFiles/statistics/chart_widget.cpp | 21 ++++++++++++++++--- .../SourceFiles/statistics/chart_widget.h | 2 ++ .../statistics/linear_chart_view.cpp | 12 +++-------- .../statistics/linear_chart_view.h | 1 + 4 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/statistics/chart_widget.cpp b/Telegram/SourceFiles/statistics/chart_widget.cpp index ca76e57a81..58d9c1010d 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.cpp +++ b/Telegram/SourceFiles/statistics/chart_widget.cpp @@ -538,9 +538,18 @@ void ChartWidget::ChartAnimationController::setXPercentageLimits( _animationValueXMax.start(xPercentageLimits.max); _lastUserInteracted = now; - _finalHeightLimits = FindHeightLimitsBetweenXLimits( - chartData, - { _animationValueXMin.to(), _animationValueXMax.to() }); + const auto startXIndex = chartData.findStartIndex( + _animationValueXMin.to()); + const auto endXIndex = chartData.findEndIndex( + startXIndex, + _animationValueXMax.to()); + _currentXIndices = { float64(startXIndex), float64(endXIndex) }; + + _finalHeightLimits = Limits{ + float64(FindMinValue(chartData, startXIndex, endXIndex)), + float64(FindMaxValue(chartData, startXIndex, endXIndex)), + }; + _animationValueHeightMin = anim::value( _animationValueHeightMin.current(), _finalHeightLimits.min); @@ -720,6 +729,10 @@ Limits ChartWidget::ChartAnimationController::currentXLimits() const { return { _animationValueXMin.current(), _animationValueXMax.current() }; } +Limits ChartWidget::ChartAnimationController::currentXIndices() const { + return _currentXIndices; +} + Limits ChartWidget::ChartAnimationController::finalXLimits() const { return { _animationValueXMin.to(), _animationValueXMax.to() }; } @@ -841,6 +854,7 @@ void ChartWidget::setupChartArea() { Statistic::PaintLinearChartView( p, _chartData, + _animationController.currentXIndices(), _animationController.currentXLimits(), _animationController.currentHeightLimits(), chartRect, @@ -961,6 +975,7 @@ void ChartWidget::setupFooter() { Statistic::PaintLinearChartView( p, _chartData, + { 0., float64(_chartData.x.size() - 1) }, fullXLimits, _footer->fullHeightLimits(), r, diff --git a/Telegram/SourceFiles/statistics/chart_widget.h b/Telegram/SourceFiles/statistics/chart_widget.h index 345ea8d1b3..022e42579e 100644 --- a/Telegram/SourceFiles/statistics/chart_widget.h +++ b/Telegram/SourceFiles/statistics/chart_widget.h @@ -58,6 +58,7 @@ private: std::vector &dateLines); [[nodiscard]] Limits currentXLimits() const; + [[nodiscard]] Limits currentXIndices() const; [[nodiscard]] Limits finalXLimits() const; [[nodiscard]] Limits currentHeightLimits() const; [[nodiscard]] Limits finalHeightLimits() const; @@ -84,6 +85,7 @@ private: anim::value _animValueBottomLineAlpha; Limits _finalHeightLimits; + Limits _currentXIndices; float _dtHeightSpeed = 0.; Limits _dtCurrent; diff --git a/Telegram/SourceFiles/statistics/linear_chart_view.cpp b/Telegram/SourceFiles/statistics/linear_chart_view.cpp index 52ab5e7983..7d016495e1 100644 --- a/Telegram/SourceFiles/statistics/linear_chart_view.cpp +++ b/Telegram/SourceFiles/statistics/linear_chart_view.cpp @@ -19,6 +19,7 @@ namespace Statistic { void PaintLinearChartView( QPainter &p, const Data::StatisticalChart &chartData, + const Limits &xIndices, const Limits &xPercentageLimits, const Limits &heightLimits, const QRect &rect, @@ -32,21 +33,14 @@ void PaintLinearChartView( const auto additionalP = (chartData.xPercentage.size() < 2) ? 0. : (chartData.xPercentage.front() * rect.width()); - const auto additionalPoints = 0; auto first = true; auto chartPath = QPainterPath(); - const auto startXIndex = chartData.findStartIndex( - xPercentageLimits.min); - const auto endXIndex = chartData.findEndIndex( - startXIndex, - xPercentageLimits.max); - - const auto localStart = std::max(0, startXIndex - additionalPoints); + const auto localStart = std::max(0, int(xIndices.min)); const auto localEnd = std::min( int(chartData.xPercentage.size() - 1), - endXIndex + additionalPoints); + int(xIndices.max)); for (auto i = localStart; i <= localEnd; i++) { if (line.y[i] < 0) { diff --git a/Telegram/SourceFiles/statistics/linear_chart_view.h b/Telegram/SourceFiles/statistics/linear_chart_view.h index 5f9b849c39..c41b268a03 100644 --- a/Telegram/SourceFiles/statistics/linear_chart_view.h +++ b/Telegram/SourceFiles/statistics/linear_chart_view.h @@ -19,6 +19,7 @@ struct DetailsPaintContext; void PaintLinearChartView( QPainter &p, const Data::StatisticalChart &chartData, + const Limits &xIndices, const Limits &xPercentageLimits, const Limits &heightLimits, const QRect &rect,