notcurses/src/poc/dirgb.c
nick black 6bd288f056 Workable split of library
Rather than trying to force things in via library constructors
and weak symbols and --whole-archive and pkg-config tricks, just
add new functions ncdirect_core_init() and notcurses_core_init().
libnotcurses has ncdirect_init() and notcurses_init(), which pass
through to these. apps linking against notcurses-core ought use
the _core_ variants directly. This gets exactly the linkage we
want, everywhere. Convert many PoCs to _core_ variants. #1301

Signed-off-by: nick black <dankamongmen@gmail.com>
2021-01-19 23:09:22 -05:00

127 lines
2.3 KiB
C

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <notcurses/direct.h>
static int
print_b(struct ncdirect* nc, int r, int g, int total){
int b = total - (r + g);
if(b > 255){
return 0;
}
int ret = ncdirect_set_fg_rgb8(nc, r, g, b);
if(ret){
return -1;
}
if(printf("X") < 0){
return -1;
}
return 0;
}
static int
print_gb(struct ncdirect* nc, int r, int total){
for(int g = 0 ; g <= total - r && g < 256 ; g += 4){
if(print_b(nc, r, g, total)){
return -1;
}
}
return 0;
}
static int
print_rgb8(struct ncdirect* nc, int total){
if(random() % 2){
if(ncdirect_off_styles(nc, NCSTYLE_ITALIC)){
return -1;
}
}
if(random() % 16 == 0){
if(ncdirect_on_styles(nc, NCSTYLE_ITALIC)){
return -1;
}
}
for(int r = 0 ; r <= total && r < 256 ; r += 4){
if(print_gb(nc, r, total)){
return -1;
}
}
return 0;
}
// direct-mode generation of 4096 RGB foregrounds
int main(void){
if(!setlocale(LC_ALL, "")){
return EXIT_FAILURE;
}
struct ncdirect* nc = ncdirect_core_init(NULL, stdout, 0);
if(!nc){
return EXIT_FAILURE;
}
for(int t = 0 ; t < 768 ; t += 4){
if(print_rgb8(nc, t)){
goto err;
}
}
if(ncdirect_flush(nc)){
goto err;
}
if(ncdirect_set_styles(nc, NCSTYLE_BOLD)){
goto err;
}
for(int t = 768 ; t ; t -= 4){
if(print_rgb8(nc, t)){
goto err;
}
}
if(ncdirect_flush(nc)){
goto err;
}
if(ncdirect_set_styles(nc, NCSTYLE_UNDERLINE)){
goto err;
}
for(int t = 0 ; t < 768 ; t += 4){
if(print_rgb8(nc, t)){
goto err;
}
}
if(ncdirect_flush(nc)){
goto err;
}
if(ncdirect_set_styles(nc, NCSTYLE_ITALIC)){
goto err;
}
for(int t = 768 ; t ; t -= 4){
if(print_rgb8(nc, t)){
goto err;
}
}
if(ncdirect_flush(nc)){
goto err;
}
int leny = ncdirect_dim_y(nc);
int lenx = ncdirect_dim_x(nc);
ncdirect_set_fg_default(nc);
ncdirect_set_bg_default(nc);
if(ncdirect_cursor_move_yx(nc, leny / 2, (lenx - 4) / 2)){
goto err;
}
ncdirect_on_styles(nc, NCSTYLE_ITALIC);
printf("dank\n");
if(ncdirect_stop(nc)){
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
err:
fprintf(stderr, "WE HAD A BAD ERROR YO (%s)\n", strerror(errno));
ncdirect_stop(nc);
return EXIT_FAILURE;
}