在缓冲区/数组中使用颜色结构

Using a Color struct in a buffer/array

本文关键字:颜色 结构 缓冲区 数组      更新时间:2023-10-16

我正在开发一个处理(以及其他(图像的库。为了与 OGL 的互操作性,我需要(至少(写入 BGRA 缓冲区(字节顺序 -> B 优先(
为此,我正在设计一个应该表示颜色的 ColorARGB 类。我想到了两种方法:第一种方法将颜色值存储为uint32_t并提供到字节缓冲区的转换方法,第二种将组件存储为字节,应该能够直接使用。在代码中:

struct ColorARGB
{
uint32_t clrValue;
ColorARGB(uint32_t clrValue):clrValue(clrValue){}
ColorARGB(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
clrValue = a << 24 | r << 16 | g << 8 | b;
}
static ColorARGB fromBGRA(const uint8_t* ptr)
{
return fromBGRA(reinterpret_cast<const uint32_t*>(ptr));
}
static ColorARGB fromBGRA(const uint32_t* ptr)
{
// This is little endian BGRA word format
return ColorARGB(boost::endian::little_to_native(*ptr));
}
// Similar functions for toBGRA
}

或:

struct ColorARGB2{
uint8_t clrValues[4]; // Or maybe: uint8_t b, g, r, a;
ColorARGB2(uint8_t a, uint8_t r, uint8_t g, uint8_t b)
{
clrValues[0] = b; clrValues[1] = g;
clrValues[2] = r; clrValues[3] = a;
}
}

第二个版本应该允许std::vector<ColorARGB2>而第一个版本会有问题,在大端机器上,缓冲区是 ARGB 而不是 BGRA。我也可以只是reinterpret_cast<ColorARGB2*>,而由于ColorARGB的原因,

这是不可能的。ColorARGB2有什么问题吗?我会遇到可能的对齐问题,尤其是在处理字节缓冲区(uint8_t*(时?我可以简单地将比较实现为reinterpret_cast<const uint32_t*>(&lhs) == reinterpret_cast<const uint32_t*>(&rhs)还是由于对齐而失败?

更新(不是真正的答案,但有帮助(: 我在提升 src 代码中发现了以下内容:

#if defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)
// On x86 (which is little endian), unaligned loads are permitted
#   define RTTR_USE_UNALIGNED_ACCESS 1
#endif

理论上,您可能会遇到对齐问题,但在实践中,我从未见过这种情况发生。

还有第三个选项尚未枚举,即通过使用联合来执行这两个选项。大致如下:

typedef union ARGBPixel {
uint32_t colorValue;
uint8_t components[4];  // <- Or an existing struct with separate a,r,g,b
} ARGBPixel;

通过上述并集,同一块内存可以寻址为uint32_t或数组或uint8_t的结构。