From 42eb18893e15c06dda1d07e609541bde8d969df7 Mon Sep 17 00:00:00 2001 From: nick black Date: Fri, 3 Apr 2020 06:37:14 -0400 Subject: [PATCH] plots: multiple rows #136 --- src/lib/plot.c | 61 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/src/lib/plot.c b/src/lib/plot.c index f3107437d..590a0713a 100644 --- a/src/lib/plot.c +++ b/src/lib/plot.c @@ -50,19 +50,25 @@ ncplane* ncplot_plane(ncplot* n){ return n->ncp; } -static inline bool -invalid_y(ncplot* n, int64_t y){ +// if we're doing domain detection, update the domain to reflect the value we +// just set. if we're not, check the result against the known ranges, and +// return -1 if the value is outside of that range. +static inline int +update_domain(ncplot* n, uint64_t x){ + const int64_t val = n->slots[x % n->slotcount]; if(n->detectdomain){ - if(y > n->maxy){ - n->maxy = y; + if(val > n->maxy){ + n->maxy = val; } - if(y < n->miny){ - n->miny = y; + if(val < n->miny){ + n->miny = val; } - }else if(y > n->maxy || y < n->miny){ - return true; + return 0; + } + if(val > n->maxy || val < n->miny){ + return -1; } - return false; + return 0; } // if x is less than the window, return -1 @@ -102,7 +108,6 @@ window_slide(ncplot* n, uint64_t x){ static inline void update_sample(ncplot* n, uint64_t x, int64_t y, bool reset){ uint64_t idx = x/*(n->slotstart + delta)*/ % n->slotcount; -fprintf(stderr, "WRITING %jd to IFX %ju (DELTA: %ju, SLOTX: %ju)\n", y, idx, 0, n->slotx); if(reset){ n->slots[idx] = y; }else{ @@ -113,16 +118,28 @@ fprintf(stderr, "WRITING %jd to IFX %ju (DELTA: %ju, SLOTX: %ju)\n", y, idx, 0, static int redraw_plot(ncplot* n){ ncplane_erase(ncplot_plane(n)); // FIXME shouldn't need this - for(int y = 0 ; y < 1 ; ++y){ // FIXME use available columns - int idx = n->slotstart; - for(uint64_t x = 0 ; x < n->slotcount ; ++x){ - if(n->slots[idx] > n->miny){ // FIXME prorate - if(ncplane_putegc_yx(ncplot_plane(n), y, x, "█", NULL) <= 0){ + const int dimy = ncplane_dim_y(ncplot_plane(n)); + // each row is worth this much change in value + double interval = (n->maxy - n->miny + 1) / (double)dimy; + int idx = n->slotstart; + for(uint64_t x = 0 ; x < n->slotcount ; ++x){ + int64_t gval = n->slots[idx]; + if(gval < n->miny){ + gval = n->miny; + } + if(gval > n->maxy){ + gval = n->maxy; + } + for(int y = 0 ; y < dimy ; ++y){ + if(n->miny + interval * (y + 1) <= gval){ + if(ncplane_putegc_yx(ncplot_plane(n), dimy - y - 1, x, "█", NULL) <= 0){ return -1; } + }else{ + break; } - idx = (idx + 1) % n->slotcount; } + idx = (idx + 1) % n->slotcount; } return 0; } @@ -132,24 +149,24 @@ redraw_plot(ncplot* n){ // the window are lost. The first call will place the initial window. The plot // will be redrawn, but notcurses_render() is not called. int ncplot_add_sample(ncplot* n, uint64_t x, int64_t y){ - if(invalid_y(n, y)){ - return -1; - } if(window_slide(n, x)){ return -1; } update_sample(n, x, y, false); + if(update_domain(n, x)){ + return -1; + } return redraw_plot(n); } int ncplot_set_sample(ncplot* n, uint64_t x, int64_t y){ - if(invalid_y(n, y)){ - return -1; - } if(window_slide(n, x)){ return -1; } update_sample(n, x, y, true); + if(update_domain(n, x)){ + return -1; + } return redraw_plot(n); }