mirror of
https://github.com/dankamongmen/notcurses
synced 2025-03-10 01:29:05 -04:00
keyplot: add third plot, this one with half blocks #433
This commit is contained in:
parent
42eb18893e
commit
5f3eb3dc24
@ -2473,15 +2473,11 @@ API int ncmenu_destroy(struct ncmenu* n);
|
||||
typedef enum {
|
||||
NCPLOT_1x1, // full block █
|
||||
NCPLOT_1x1x4, // shaded full blocks █▓▒░
|
||||
NCPLOT_2x1TB, // full/upper blocks █▀
|
||||
NCPLOT_2x1BT, // full/lower blocks █▄
|
||||
NCPLOT_1x2LR, // left/full blocks ▌█
|
||||
NCPLOT_1x2RL, // right/full blocks █▐
|
||||
NCPLOT_2x2, // quadrants ▖▘▝▗
|
||||
NCPLOT_4x1, // four vert levels █▆▄▂
|
||||
NCPLOT_1x4, // four horizontal levels ▎▌▊█
|
||||
NCPLOT_8x1, // eight vert levels █▇▆▅▄▃▂▁
|
||||
NCPLOT_1x8, // eight horizontal levels ▏▎▍▌▋▊▉█
|
||||
NCPLOT_2x1, // full/(upper|left) blocks █▀
|
||||
NCPLOT_2x1INV,// full/(lower|right) blocks █▄
|
||||
NCPLOT_2x2, // quadrants ▖▘▝▗ ▛ ▜ ▟ ▙ ▘▗ ▖▝
|
||||
NCPLOT_4x1, // four vert/horz levels █▆▄▂ / ▎▌▊█
|
||||
NCPLOT_8x1, // eight vert/horz levels █▇▆▅▄▃▂▁ / ▏▎▍▌▋▊▉█
|
||||
NCPLOT_4x2, // 4 rows, 2 cols (braille) ...etc...
|
||||
} ncgridgeom_e;
|
||||
|
||||
|
@ -411,18 +411,14 @@ int ncplane_rotate_ccw(struct ncplane* n);
|
||||
void ncplane_translate(const struct ncplane* src, const struct ncplane* dst, int* y, int* x);
|
||||
bool ncplane_translate_abs(const struct ncplane* n, int* y, int* x);
|
||||
typedef enum {
|
||||
NCPLOT_1x1,
|
||||
NCPLOT_1x1x4,
|
||||
NCPLOT_2x1TB,
|
||||
NCPLOT_2x1BT,
|
||||
NCPLOT_1x2LR,
|
||||
NCPLOT_1x2RL,
|
||||
NCPLOT_2x2,
|
||||
NCPLOT_4x1,
|
||||
NCPLOT_1x4,
|
||||
NCPLOT_8x1,
|
||||
NCPLOT_1x8,
|
||||
NCPLOT_4x2,
|
||||
NCPLOT_1x1, // full block █
|
||||
NCPLOT_1x1x4, // shaded full blocks █▓▒░
|
||||
NCPLOT_2x1, // full/(upper|left) blocks █▀
|
||||
NCPLOT_2x1INV,// full/(lower|right) blocks █▄
|
||||
NCPLOT_2x2, // quadrants ▖▘▝▗ ▛ ▜ ▟ ▙ ▘▗ ▖▝
|
||||
NCPLOT_4x1, // four vert/horz levels █▆▄▂ / ▎▌▊█
|
||||
NCPLOT_8x1, // eight vert/horz levels █▇▆▅▄▃▂▁ / ▏▎▍▌▋▊▉█
|
||||
NCPLOT_4x2, // 4 rows, 2 cols (braille) ...etc...
|
||||
} ncgridgeom_e;
|
||||
typedef struct ncplot_options {
|
||||
uint64_t maxchannel;
|
||||
|
@ -1,3 +1,4 @@
|
||||
#include <vector>
|
||||
#include <cstdlib>
|
||||
#include <ncpp/NotCurses.hh>
|
||||
|
||||
@ -24,11 +25,18 @@ int main(void){
|
||||
if(!n->perimeter(tl, tr, bl, br, hl, vl, 0)){
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
ncpp::Plane plotplane{6, 70, 1, 1, nullptr};
|
||||
std::vector<ncpp::Plane> planes;
|
||||
planes.emplace_back(6, 70, 1, 1, nullptr);
|
||||
planes.emplace_back(6, 70, 8, 1, nullptr);
|
||||
planes.emplace_back(6, 70, 15, 1, nullptr);
|
||||
struct ncplot_options popts{};
|
||||
popts.rangex = 60;
|
||||
popts.detectdomain = true;
|
||||
struct ncplot* plot = ncplot_create(plotplane, &popts);
|
||||
std::array<struct ncplot*, 3> plots;
|
||||
for(auto i = 0u ; i < plots.size() ; ++i){
|
||||
popts.gridtype = static_cast<ncgridgeom_e>(i);
|
||||
plots[i] = ncplot_create(planes[i], &popts);
|
||||
}
|
||||
char32_t r;
|
||||
ncinput ni;
|
||||
// FIXME launch ticker thread
|
||||
@ -48,13 +56,14 @@ int main(void){
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
const uint64_t sec = (timespec_to_ns(&now) - timespec_to_ns(&start)) / NANOSECS_IN_SEC;
|
||||
if(ncplot_add_sample(plot, sec, 1)){
|
||||
return EXIT_FAILURE;
|
||||
for(auto i = 0u ; i < plots.size() ; ++i){
|
||||
if(ncplot_add_sample(plots[i], sec, 1)){
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
if(!nc.render()){
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
}
|
||||
ncplot_destroy(plot);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
@ -1,5 +1,27 @@
|
||||
#include "internal.h"
|
||||
|
||||
static const struct {
|
||||
ncgridgeom_e geom;
|
||||
const wchar_t* egcs;
|
||||
} geomdata[] = {
|
||||
{ .geom = NCPLOT_1x1, .egcs = L"█", },
|
||||
{ .geom = NCPLOT_1x1x4, .egcs = L"▒░▓█", },
|
||||
{ .geom = NCPLOT_2x1, .egcs = L"▄█", },
|
||||
};
|
||||
|
||||
/* FIXME
|
||||
NCPLOT_2x1TB, // full/upper blocks █▀
|
||||
NCPLOT_2x1BT, // full/lower blocks
|
||||
NCPLOT_1x2LR, // left/full blocks ▌█
|
||||
NCPLOT_1x2RL, // right/full blocks █▐
|
||||
NCPLOT_2x2, // quadrants ▖▘▝▗
|
||||
NCPLOT_4x1, // four vert levels █▆▄▂
|
||||
NCPLOT_1x4, // four horizontal levels ▎▌▊█
|
||||
NCPLOT_8x1, // eight vert levels █▇▆▅▄▃▂▁
|
||||
NCPLOT_1x8, // eight horizontal levels ▏▎▍▌▋▊▉█
|
||||
NCPLOT_4x2, // 4 rows, 2 cols (braille) ...etc...
|
||||
*/
|
||||
|
||||
ncplot* ncplot_create(ncplane* n, const ncplot_options* opts){
|
||||
// detectdomain requires that miny == maxy
|
||||
if(opts->detectdomain && opts->miny != opts->maxy){
|
||||
@ -8,6 +30,9 @@ ncplot* ncplot_create(ncplane* n, const ncplot_options* opts){
|
||||
if(opts->maxy < opts->miny){
|
||||
return NULL;
|
||||
}
|
||||
if(opts->gridtype < 0 || opts->gridtype >= sizeof(geomdata) / sizeof(*geomdata)){
|
||||
return NULL;
|
||||
}
|
||||
int sdimy, sdimx;
|
||||
ncplane_dim_yx(n, &sdimy, &sdimx);
|
||||
if(sdimx <= 0){
|
||||
@ -119,23 +144,38 @@ static int
|
||||
redraw_plot(ncplot* n){
|
||||
ncplane_erase(ncplot_plane(n)); // FIXME shouldn't need this
|
||||
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;
|
||||
// each transition is worth this much change in value
|
||||
const size_t states = wcslen(geomdata[n->gridtype].egcs);
|
||||
double interval = (n->maxy - n->miny + 1) / ((double)dimy * states);
|
||||
int idx = n->slotstart;
|
||||
for(uint64_t x = 0 ; x < n->slotcount ; ++x){
|
||||
int64_t gval = n->slots[idx];
|
||||
int64_t gval = n->slots[idx]; // clip the value at the limits of the graph
|
||||
if(gval < n->miny){
|
||||
gval = n->miny;
|
||||
}
|
||||
if(gval > n->maxy){
|
||||
gval = n->maxy;
|
||||
}
|
||||
// starting from the least-significant row, progress in the more significant
|
||||
// direction, drawing egcs from the grid specification, aborting early if
|
||||
// we can't draw anything in a given cell.
|
||||
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{
|
||||
// if we've got at least one interval's worth on the number of positions
|
||||
// times the number of intervals per position plus the starting offset,
|
||||
// we're going to print *something*
|
||||
if(n->miny + (interval * states) * y + interval > gval){
|
||||
break;
|
||||
}
|
||||
size_t egcidx = (gval - n->miny) - (y * interval * states) - 1;
|
||||
if(egcidx >= states){
|
||||
egcidx = states - 1;
|
||||
}
|
||||
if(ncplane_putwc_yx(ncplot_plane(n), dimy - y - 1, x, geomdata[n->gridtype].egcs[egcidx]) <= 0){
|
||||
return -1;
|
||||
}
|
||||
// FIXME this ought fall out naturally. that it does not indicates, i
|
||||
// think, an error above...
|
||||
if(egcidx != states - 1){
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user