From 1b01494c793c0bcb4235791b8677b9f01bed258d Mon Sep 17 00:00:00 2001 From: nick black Date: Fri, 17 Jan 2020 04:32:35 -0500 Subject: [PATCH] implement ncplane_greyscale() #280 --- data/blackmage.png | Bin 0 -> 7508 bytes include/notcurses.h | 3 +++ src/demo/panelreel.c | 1 + src/lib/notcurses.c | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 data/blackmage.png diff --git a/data/blackmage.png b/data/blackmage.png new file mode 100644 index 0000000000000000000000000000000000000000..6fd789af0c7e0d625172da96595640e71f76a31f GIT binary patch literal 7508 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 ec_7!|>(?K{S 255){ + return -1; + } + if(g < 0 || g > 255){ + return -1; + } + if(b < 0 || b > 255){ + return -1; + } + float fg = (0.2126 * (r / 255.0) + 0.7152 * (g / 255.0) + 0.0722 * (b / 255.0)); + return fg * 255; +} + +void ncplane_greyscale(ncplane *n){ + ncplane_lock(n); + for(int y = 0 ; y < n->leny ; ++y){ + for(int x = 0 ; x < n->lenx ; ++x){ + cell* c = &n->fb[nfbcellidx(n, y, x)]; + unsigned r, g, b; + cell_fg_rgb(c, &r, &g, &b); + // Use Rec. 601 scaling + int gy = rgb_greyscale(r, g, b); + cell_set_fg_rgb(c, gy, gy, gy); + cell_bg_rgb(c, &r, &g, &b); + gy = rgb_greyscale(r, g, b); + cell_set_bg_rgb(c, gy, gy, gy); + } + } + ncplane_unlock(n); +}