add NCPLOT_OPTIONS_DETECTMAXONLY #610

dankamongmen/slickgoose
nick black 4 years ago
parent 2b89b0850c
commit f98acad7f6
No known key found for this signature in database
GPG Key ID: 5F43400C21CBFACC

@ -2851,14 +2851,15 @@ API int ncmenu_destroy(struct ncmenu* n);
// //
// This options structure works for both the ncuplot (uint64_t) and ncdplot // This options structure works for both the ncuplot (uint64_t) and ncdplot
// (double) types. // (double) types.
#define NCPLOT_OPTION_LABELTICKSD 0x0001ull // show labels for dependent axis #define NCPLOT_OPTION_LABELTICKSD 0x0001ull // show labels for dependent axis
#define NCPLOT_OPTION_EXPONENTIALD 0x0002ull // exponential dependent axis #define NCPLOT_OPTION_EXPONENTIALD 0x0002ull // exponential dependent axis
#define NCPLOT_OPTION_VERTICALI 0x0004ull // independent axis is vertical #define NCPLOT_OPTION_VERTICALI 0x0004ull // independent axis is vertical
#define NCPLOT_OPTION_NODEGRADE 0x0008ull // fail rather than degrade blitter #define NCPLOT_OPTION_NODEGRADE 0x0008ull // fail rather than degrade blitter
#define NCPLOT_OPTION_DETECTMAXONLY 0x0010ull // use domain detection only for max
typedef struct ncplot_options { typedef struct ncplot_options {
// channels for the maximum and minimum levels. linear interpolation will be // channels for the maximum and minimum levels. linear or exponential
// applied across the domain between these two. // interpolation will be applied across the domain between these two.
uint64_t maxchannel; uint64_t maxchannel;
uint64_t minchannel; uint64_t minchannel;
// if you don't care, pass NCBLIT_DEFAULT and get NCBLIT_8x1 (assuming // if you don't care, pass NCBLIT_DEFAULT and get NCBLIT_8x1 (assuming

@ -14,16 +14,24 @@ class ncppplot {
// these were all originally plain C, sorry for the non-idiomatic usage FIXME // these were all originally plain C, sorry for the non-idiomatic usage FIXME
// ought admit nullptr opts FIXME // ought admit nullptr opts FIXME
static bool create(ncppplot<T>* ncpp, ncplane* n, const ncplot_options* opts, T miny, T maxy) { static bool create(ncppplot<T>* ncpp, ncplane* n, const ncplot_options* opts, T miny, T maxy) {
// if miny == maxy, they both must be equal to 0 struct notcurses* nc = n->nc;
// if miny == maxy (enabling domain detection), they both must be equal to 0
if(miny == maxy && miny){ if(miny == maxy && miny){
logerror(nc, "Supplied non-zero domain detection param %d\n", miny);
return false; return false;
} }
if(opts->rangex < 0){ if(opts->rangex < 0){
logerror(nc, "Supplied negative independent range %d\n", opts->rangex);
return false; return false;
} }
if(maxy < miny){ if(maxy < miny){
return false; return false;
} }
// DETECTMAXONLY can't be used without domain detection
if(opts->flags & NCPLOT_OPTION_DETECTMAXONLY && (miny != maxy)){
logerror(nc, "Supplied DETECTMAXONLY without domain detection");
return false;
}
ncblitter_e blitter = opts ? opts->gridtype : NCBLIT_DEFAULT; ncblitter_e blitter = opts ? opts->gridtype : NCBLIT_DEFAULT;
if(blitter == NCBLIT_DEFAULT){ if(blitter == NCBLIT_DEFAULT){
if(notcurses_canutf8(ncplane_notcurses(n))){ if(notcurses_canutf8(ncplane_notcurses(n))){
@ -272,8 +280,10 @@ class ncppplot {
if(val > maxy){ if(val > maxy){
maxy = val; maxy = val;
} }
if(val < miny){ if(!detectonlymax){
miny = val; if(val < miny){
miny = val;
}
} }
return 0; return 0;
} }
@ -356,7 +366,8 @@ class ncppplot {
int slotstart; // index of most recently-written slot int slotstart; // index of most recently-written slot
bool labelaxisd; // label dependent axis (consumes PREFIXCOLUMNS columns) bool labelaxisd; // label dependent axis (consumes PREFIXCOLUMNS columns)
bool exponentiali; // exponential independent axis bool exponentiali; // exponential independent axis
bool detectdomain; // is domain detection in effect (stretch the domain)? bool detectdomain; // is domain detection in effect (stretch the domain)?
bool detectonlymax; // domain detection applies only to max, not min
}; };

Loading…
Cancel
Save