changeset 32033:1824e0ee4088 stable

Stop excessive memory usage for minor grid ticks (bug #64017). * graphics.cc (calc_ticks_and_lims): Cap the number of minor ticks above or below the current tick range at 1000 (configurable constant).
author Rik <rik@octave.org>
date Tue, 18 Apr 2023 11:09:17 -0700
parents bc681594872a
children 43e4c7f59889 f18da620ab4d
files libinterp/corefcn/graphics.cc
diffstat 1 files changed, 6 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/graphics.cc	Tue Apr 18 15:09:35 2023 +0200
+++ b/libinterp/corefcn/graphics.cc	Tue Apr 18 11:09:17 2023 -0700
@@ -8215,6 +8215,7 @@
     return;
 
   // minor ticks between, above, and below min and max ticks
+  const int MAX_MINOR_TICKS = 1000;
   int n = (is_logscale ? 8 : 4);
   double mult_below = (is_logscale ? tmp_ticks(1) / tmp_ticks(0) : 1);
   double mult_above = (is_logscale ? tmp_ticks(n_ticks-1) / tmp_ticks(n_ticks-2)
@@ -8224,6 +8225,9 @@
   int n_below = static_cast<int> (std::floor ((tmp_ticks(0)-lo_lim) / d_below));
   if (n_below < 0)
     n_below = 0;
+  else if (n_below > MAX_MINOR_TICKS)
+    n_below = MAX_MINOR_TICKS;
+
   int n_between = n * (n_ticks - 1);
   double d_above = (tmp_ticks(n_ticks-1) - tmp_ticks(n_ticks-2)) * mult_above
                    / (n+1);
@@ -8231,6 +8235,8 @@
                                   / d_above));
   if (n_above < 0)
     n_above = 0;
+  else if (n_above > MAX_MINOR_TICKS)
+    n_above = MAX_MINOR_TICKS;
 
   Matrix tmp_mticks (1, n_below + n_between + n_above);
   for (int i = 0; i < n_below; i++)