From 4720f23b123562ee38c8bd4943907a12a83e1bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?joseLu=C3=ADs?= Date: Thu, 13 Aug 2020 00:07:50 +0200 Subject: [PATCH] rust: improve some channel functions & comments Functions `channel_set_alpha()`, `channels_set_fg_alpha()` & `channels_set_bg_alpha()` don't return an error anymore. Instead of failing when the alpha value has others bits set, it gets cleaned of other possible bits with bitmasking. And in case of trying to use high contrast for the background alpha gets reset to a default opaque. --- rust/src/channel.rs | 55 ++++++++++++++++----------------------------- 1 file changed, 19 insertions(+), 36 deletions(-) diff --git a/rust/src/channel.rs b/rust/src/channel.rs index 486908165..9a3c7d312 100644 --- a/rust/src/channel.rs +++ b/rust/src/channel.rs @@ -1,24 +1,14 @@ // --------------------------------------------------------------------------------------- -// - NOTE: The channel components are u8 instead of u32. +// - The channel components are u8 instead of u32. // Because of type enforcing, some runtime checks are now unnecessary. // -// - NOTE: These functions now can't fail and don't have to return an error: -// - `channel_set_rgb()` -// - `channels_set_fg_rgb()` -// - `channels_set_bg_rgb()` -// - `channel_set()` -// - `channels_set_fg()` -// - `channels_set_bg()` +// - None of the functions can't fail now. The original checks for dirty bits +// have been substitued by mask cleaning (bitwise and) // -// - NOTE: These functions were therefore deemed unnecessary to implement: +// - These functions were deemed unnecessary to implement: // - `channel_set_rgb_clipped()` // - `channels_set_fg_rgb_clipped()` // - `channels_set_bg_rgb_clipped()` -// -// - These functions still return an integer error result: -// - `channel_set_alpha()` -// - `channels_set_fg_alpha()` -// - `channels_set_bg_alpha()` // --------------------------------------------------------------------------------------- // // functions already exported by bindgen : 0 @@ -31,7 +21,7 @@ // --------------- (+) implemented (#) + unit test (x) wont implement //#channel_alpha //#channel_b -//#channel_default_p // FIXME TEST +//#channel_default_p //#channel_g //+channel_palindex_p //#channel_r @@ -42,7 +32,7 @@ //+channels_bg_default_p //+channels_bg_palindex_p //+channels_bg_rgb -// channels_blend // TODO +// channels_blend // TODO //#channels_combine //+channel_set //#channel_set_alpha @@ -67,12 +57,12 @@ //+channels_set_fg_default //+channels_set_fg_rgb //xchannels_set_fg_rgb_clipped -// + #![allow(dead_code)] use crate as ffi; -use crate::types::{Alpha, Channel, ChannelPair, Color, IntResult, Rgb}; +use crate::types::{Alpha, Channel, ChannelPair, Color, Rgb}; /// Extract the 8-bit red component from a 32-bit channel. #[inline] @@ -124,16 +114,14 @@ pub fn channel_alpha(channel: Channel) -> Alpha { /// Set the 2-bit alpha component of the 32-bit channel. #[inline] -pub fn channel_set_alpha(channel: &mut Channel, alpha: Alpha) -> IntResult { - if (alpha & !ffi::NCCHANNEL_ALPHA_MASK) != 0 { - return -1; - } - *channel = alpha | (*channel & !ffi::NCCHANNEL_ALPHA_MASK); +pub fn channel_set_alpha(channel: &mut Channel, alpha: Alpha) { + let mut alpha_clean = alpha & ffi::NCCHANNEL_ALPHA_MASK; + *channel = alpha_clean | (*channel & !ffi::NCCHANNEL_ALPHA_MASK); + if alpha != ffi::CELL_ALPHA_OPAQUE { // indicate that we are *not* using the default background color *channel |= ffi::CELL_BGDEFAULT_MASK; } - 0 } /// Is this channel using the "default color" rather than RGB/palette-indexed? @@ -285,29 +273,24 @@ pub fn channels_set_bg(channels: &mut ChannelPair, rgb: Rgb) { /// Set the 2-bit alpha component of the foreground channel. // TODO: TEST #[inline] -pub fn channels_set_fg_alpha(channels: &mut ChannelPair, alpha: Alpha) -> IntResult { +pub fn channels_set_fg_alpha(channels: &mut ChannelPair, alpha: Alpha) { let mut channel = channels_fchannel(*channels); - if channel_set_alpha(&mut channel, alpha) < 0 { - return -1; - } + channel_set_alpha(&mut channel, alpha); *channels = (channel as ChannelPair) << 32 | *channels & 0xffffffff_u64; - 0 } /// Set the 2-bit alpha component of the background channel. // TODO: TEST #[inline] -pub fn channels_set_bg_alpha(channels: &mut ChannelPair, alpha: Alpha) -> IntResult { +pub fn channels_set_bg_alpha(channels: &mut ChannelPair, alpha: Alpha) { + let mut _alpha_clean = alpha; if alpha == ffi::CELL_ALPHA_HIGHCONTRAST { - // forbidden for background alpha - return -1; + // forbidden for background alpha, so makes it opaque + _alpha_clean = ffi::CELL_ALPHA_OPAQUE; } let mut channel = channels_bchannel(*channels); - if channel_set_alpha(&mut channel, alpha) < 0 { - return -1; - } + channel_set_alpha(&mut channel, _alpha_clean); channels_set_bchannel(channels, channel); - 0 } /// Is the foreground using the "default foreground color"?