From 9c3adaaea3fff495e34424436c3089837d633ebc Mon Sep 17 00:00:00 2001 From: nick black Date: Fri, 17 Dec 2021 03:17:56 -0500 Subject: [PATCH] add ncchannel_rgb(), use it in channels_blend() --- USAGE.md | 22 ++++++++++++++++++++-- doc/man/man3/notcurses_channels.3.md | 2 ++ include/notcurses/notcurses.h | 13 ++++++++++--- src/lib/internal.h | 8 +++----- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/USAGE.md b/USAGE.md index 7df8855e6..25d7ed161 100644 --- a/USAGE.md +++ b/USAGE.md @@ -3174,14 +3174,32 @@ ncchannels_bg_alpha(uint64_t channels){ return ncchannel_alpha(channels_bchannel(channels)); } +// Extract the 24-bit RGB value from a 32-bit channel. +// Only valid if ncchannel_rgb_p() would return true for the channel. +static inline uint32_t +ncchannel_rgb(uint32_t channel){ + return channel & NC_BG_RGB_MASK; +} + +// Extract the three 8-bit R/G/B components from a 32-bit channel. +// Only valid if ncchannel_rgb_p() would return true for the channel. +static inline uint32_t +ncchannel_rgb8(uint32_t channel, unsigned* restrict r, unsigned* restrict g, + unsigned* restrict b){ + *r = ncchannel_r(channel); + *g = ncchannel_g(channel); + *b = ncchannel_b(channel); + return channel; +} + // Extract 24 bits of foreground RGB from 'channels', split into subchannels. -static inline unsigned +static inline uint32_t ncchannels_fg_rgb8(uint64_t channels, unsigned* r, unsigned* g, unsigned* b){ return ncchannel_rgb8(channels_fchannel(channels), r, g, b); } // Extract 24 bits of background RGB from 'channels', split into subchannels. -static inline unsigned +static inline uint32_t ncchannels_bg_rgb8(uint64_t channels, unsigned* r, unsigned* g, unsigned* b){ return ncchannel_rgb8(channels_bchannel(channels), r, g, b); } diff --git a/doc/man/man3/notcurses_channels.3.md b/doc/man/man3/notcurses_channels.3.md index 99dc30879..5851fd2a5 100644 --- a/doc/man/man3/notcurses_channels.3.md +++ b/doc/man/man3/notcurses_channels.3.md @@ -25,6 +25,8 @@ notcurses_channels - operations on notcurses channels **uint32_t ncchannel_b(uint32_t ***channel***);** +**uint32_t ncchannel_rgb(uint32_t ***channel***);** + **uint32_t ncchannel_rgb8(uint32_t ***channel***, uint32_t* restrict ***r***, uint32_t* restrict ***g***, uint32_t* restrict ***b***);** **int ncchannel_set_rgb8(uint32_t* ***channel***, unsigned ***r***, unsigned ***g***, unsigned ***b***);** diff --git a/include/notcurses/notcurses.h b/include/notcurses/notcurses.h index 16d60b6a1..8ea60fa33 100644 --- a/include/notcurses/notcurses.h +++ b/include/notcurses/notcurses.h @@ -222,9 +222,16 @@ ncchannel_b(uint32_t channel){ return (channel & 0x0000ffu); } +// Extract the 24-bit RGB value from a 32-bit channel. +// Only valid if ncchannel_rgb_p() would return true for the channel. +static inline uint32_t +ncchannel_rgb(uint32_t channel){ + return channel & NC_BG_RGB_MASK; +} + // Extract the three 8-bit R/G/B components from a 32-bit channel. // Only valid if ncchannel_rgb_p() would return true for the channel. -static inline unsigned +static inline uint32_t ncchannel_rgb8(uint32_t channel, unsigned* RESTRICT r, unsigned* RESTRICT g, unsigned* RESTRICT b){ *r = ncchannel_r(channel); @@ -404,13 +411,13 @@ ncchannels_bg_palindex(uint64_t channels){ // Extract 24 bits of foreground RGB from 'channels', shifted to LSBs. static inline uint32_t ncchannels_fg_rgb(uint64_t channels){ - return ncchannels_fchannel(channels) & NC_BG_RGB_MASK; + return ncchannel_rgb(ncchannels_fchannel(channels)); } // Extract 24 bits of background RGB from 'channels', shifted to LSBs. static inline uint32_t ncchannels_bg_rgb(uint64_t channels){ - return ncchannels_bchannel(channels) & NC_BG_RGB_MASK; + return ncchannel_rgb(ncchannels_bchannel(channels)); } // Extract 24 bits of foreground RGB from 'channels', split into subchannels. diff --git a/src/lib/internal.h b/src/lib/internal.h index 9cba3ecf3..f6de1776c 100644 --- a/src/lib/internal.h +++ b/src/lib/internal.h @@ -1353,16 +1353,14 @@ channels_blend(notcurses* nc, unsigned c1, unsigned c2, unsigned* blends){ }else if(c2palette){ ncchannel_set_palindex(&c1, ncchannel_palindex(c2)); }else{ - ncchannel_set(&c1, c2 & NC_BG_RGB_MASK); + ncchannel_set(&c1, ncchannel_rgb(c2)); } ncchannel_set_alpha(&c1, ncchannel_alpha(c2)); }else if(!c2default && !ncchannel_default_p(c1)){ unsigned rsum, gsum, bsum; if(c2palette){ - uint32_t rgb = nc->palette.chans[ncchannel_palindex(c2)]; - bsum = rgb & 0xff; - gsum = (rgb >> 8u) & 0xff; - rsum = (rgb >> 16u) & 0xff; + ncchannel_rgb8(nc->palette.chans[ncchannel_palindex(c2)], + &rsum, &gsum, &bsum); }else{ ncchannel_rgb8(c2, &rsum, &gsum, &bsum); }