comparison libinterp/corefcn/graphics.cc @ 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 b482ed13ac1a
children 43e4c7f59889 0cedac4984ae
comparison
equal deleted inserted replaced
32031:bc681594872a 32033:1824e0ee4088
8213 octave_idx_type n_ticks = tmp_ticks.numel (); 8213 octave_idx_type n_ticks = tmp_ticks.numel ();
8214 if (n_ticks < 2) 8214 if (n_ticks < 2)
8215 return; 8215 return;
8216 8216
8217 // minor ticks between, above, and below min and max ticks 8217 // minor ticks between, above, and below min and max ticks
8218 const int MAX_MINOR_TICKS = 1000;
8218 int n = (is_logscale ? 8 : 4); 8219 int n = (is_logscale ? 8 : 4);
8219 double mult_below = (is_logscale ? tmp_ticks(1) / tmp_ticks(0) : 1); 8220 double mult_below = (is_logscale ? tmp_ticks(1) / tmp_ticks(0) : 1);
8220 double mult_above = (is_logscale ? tmp_ticks(n_ticks-1) / tmp_ticks(n_ticks-2) 8221 double mult_above = (is_logscale ? tmp_ticks(n_ticks-1) / tmp_ticks(n_ticks-2)
8221 : 1); 8222 : 1);
8222 8223
8223 double d_below = (tmp_ticks(1) - tmp_ticks(0)) / mult_below / (n+1); 8224 double d_below = (tmp_ticks(1) - tmp_ticks(0)) / mult_below / (n+1);
8224 int n_below = static_cast<int> (std::floor ((tmp_ticks(0)-lo_lim) / d_below)); 8225 int n_below = static_cast<int> (std::floor ((tmp_ticks(0)-lo_lim) / d_below));
8225 if (n_below < 0) 8226 if (n_below < 0)
8226 n_below = 0; 8227 n_below = 0;
8228 else if (n_below > MAX_MINOR_TICKS)
8229 n_below = MAX_MINOR_TICKS;
8230
8227 int n_between = n * (n_ticks - 1); 8231 int n_between = n * (n_ticks - 1);
8228 double d_above = (tmp_ticks(n_ticks-1) - tmp_ticks(n_ticks-2)) * mult_above 8232 double d_above = (tmp_ticks(n_ticks-1) - tmp_ticks(n_ticks-2)) * mult_above
8229 / (n+1); 8233 / (n+1);
8230 int n_above = static_cast<int> (std::floor ((hi_lim-tmp_ticks(n_ticks-1)) 8234 int n_above = static_cast<int> (std::floor ((hi_lim-tmp_ticks(n_ticks-1))
8231 / d_above)); 8235 / d_above));
8232 if (n_above < 0) 8236 if (n_above < 0)
8233 n_above = 0; 8237 n_above = 0;
8238 else if (n_above > MAX_MINOR_TICKS)
8239 n_above = MAX_MINOR_TICKS;
8234 8240
8235 Matrix tmp_mticks (1, n_below + n_between + n_above); 8241 Matrix tmp_mticks (1, n_below + n_between + n_above);
8236 for (int i = 0; i < n_below; i++) 8242 for (int i = 0; i < n_below; i++)
8237 tmp_mticks(i) = tmp_ticks(0) - (n_below-i) * d_below; 8243 tmp_mticks(i) = tmp_ticks(0) - (n_below-i) * d_below;
8238 for (int i = 0; i < n_ticks-1; i++) 8244 for (int i = 0; i < n_ticks-1; i++)