【发布时间】:2014-03-18 22:14:07
【问题描述】:
这就是我问的原因:
uint32_t Color::hex(uint32_t a_hex, bool a_readAlphaBits /*= false*/) {
A = (a_readAlphaBits ? ((a_hex >> 24) & 0xFF) / 255.0f : 1.0f);
R = (((a_hex >> 16) & 0xFF) / 255.0f);
G = (((a_hex >> 8) & 0xFF) / 255.0f);
B = (((a_hex)& 0xFF) / 255.0f);
return hex();
}
0xFF0000 读取为 RGB 时表示纯红色,但读取为 RGBA 时为 0x00FF0000,这意味着 alpha 位是完全透明的。
因为我想让用户输入 RGB 或 RGBA,而我不知道在编译或运行时无法自动区分 0x00000000 和 0x000000,所以我必须添加一个“readAlphaBits”如果设置为 true 将读取额外位的标志,否则默认为 1.0f。
理想情况下,我希望自动检测到这一点。有谁知道如何确定文字的书写方式?
我有一个想法,涉及基于宏的区分
#define C_HEX(x) 0xFF##x
因此,如果有人输入 C_HEX(000000) 或 C_HEX(00000000),它将以这样的方式添加前缀,即在六位时,完全限定值将是 32 位,而在八位时,它将是 40。我没有t 尝试过,但即使它可以在编译时区分调用,我也不希望这样做,我认为无论如何在这种情况下使用标志可能会更好。如果用户忘记输入该宏,即使我可以根据提供的值的内存布局检测到它丢失,它也会有点蹩脚。
但在检测方面我想不出太多其他的了。
停下来!
编辑:
理想的调用代码如下所示(我有一个类似的基于十六进制的颜色构造函数):
- 颜色(0xFF0000); //红色 rgba,alpha 为 1.0
- 颜色(0x88FF0000); //红色 rgba,alpha 为 .533333333
【问题讨论】:
-
考虑使用 C++11 用户定义文字
-
这听起来很可怕......为什么不实例化像
rgb(FF0000)和rgba(00FF0000)这样的类来编码文字类型 -
用户定义的文字可以做到,但是你必须解析十六进制。只需将
00定义为不透明并将 alpha 放在高位就容易得多。 -
@M2tM:好的,那为什么不拥有两个函数
rgb和rgba,它们都返回Color?要求程序员决定是否添加那个字母是不是太过分了? -
@M2tM 我们显然对优雅有不同的看法;)
标签: c++ hex bit-manipulation rgb