diff options
author | Zev Weiss <zev@bewilderbeest.net> | 2022-05-21 20:14:02 -0700 |
---|---|---|
committer | Zev Weiss <zev@bewilderbeest.net> | 2023-10-08 16:37:20 -0700 |
commit | a33cbae28826de4f20930d225e31f3be0db0502b (patch) | |
tree | b068db06d67e953177938423b6b89c2a5ea51ce2 /Meter.c | |
parent | 2978af01a79d1627d7fa90fda0efec9cf774d901 (diff) |
Meter: allocate GraphData buffer dynamically
On wide screens the previous value of 256 could end up insufficient to
cover the screen space allocated to the graph, leaving it awkwardly
truncated mid-column. We now allocate the buffer dynamically instead,
growing it to accommodate whatever width the graph occupies.
Signed-off-by: Zev Weiss <zev@bewilderbeest.net>
Diffstat (limited to 'Meter.c')
-rw-r--r-- | Meter.c | 22 |
1 files changed, 14 insertions, 8 deletions
@@ -86,7 +86,7 @@ void Meter_delete(Object* cast) { if (Meter_doneFn(this)) { Meter_done(this); } - free(this->drawData); + free(this->drawData.values); free(this->caption); free(this->values); free(this); @@ -121,8 +121,9 @@ void Meter_setMode(Meter* this, int modeIndex) { } } else { assert(modeIndex >= 1); - free(this->drawData); - this->drawData = NULL; + free(this->drawData.values); + this->drawData.values = NULL; + this->drawData.nValues = 0; const MeterMode* mode = Meter_modes[modeIndex]; this->draw = mode->draw; @@ -289,12 +290,17 @@ static const char* const GraphMeterMode_dotsAscii[] = { static void GraphMeterMode_draw(Meter* this, int x, int y, int w) { const Machine* host = this->host; - - if (!this->drawData) { - this->drawData = xCalloc(1, sizeof(GraphData)); + GraphData* data = &this->drawData; + + assert(w > 0); + if ((size_t)w * 2 > data->nValues) { + size_t oldNValues = data->nValues; + data->nValues = MAXIMUM(oldNValues + (oldNValues / 2), (unsigned int)w * 2); + data->values = xReallocArray(data->values, data->nValues, sizeof(*data->values)); + memmove(data->values + (data->nValues - oldNValues), data->values, oldNValues * sizeof(*data->values)); + memset(data->values, 0, (data->nValues - oldNValues) * sizeof(*data->values)); } - GraphData* data = this->drawData; - const int nValues = METER_GRAPHDATA_SIZE; + const int nValues = data->nValues; const char* const* GraphMeterMode_dots; int GraphMeterMode_pixPerRow; |