Mercurial > octave
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++) |