From a33cbae28826de4f20930d225e31f3be0db0502b Mon Sep 17 00:00:00 2001 From: Zev Weiss Date: Sat, 21 May 2022 20:14:02 -0700 Subject: 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 --- Meter.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) (limited to 'Meter.c') diff --git a/Meter.c b/Meter.c index 5e7d3b70..b6fe6402 100644 --- a/Meter.c +++ b/Meter.c @@ -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; -- cgit v1.2.3