我使用位字段的结构来访问像素中的每个颜色通道,问题是我经常有代码以相同的方式应用于每个通道,但是因为我不能只在 CI 端迭代结构的成员每个成员最多有 3 个相同代码的副本,或者更不方便的是必须使用 switch-case 语句。
我认为如果我可以使用宏以便我可以通过提供一个数字来访问成员会更优雅,理想情况下是一个可以使 .CHAN(i) 变为 .r、.g 或 .b 的宏,具体取决于整数变量 i 包含 0、1 或 2。除了我不知道如何制作这样的宏,或者即使这可能。
一个细节,但每个成员都是 12 位,而不是预期的 8 位,所以我不能只是将它变成一个数组或有一个带有指针的联合。X-Macros 也不会这样做,因为我经常需要对每个通道做很多事情,然后再对另一个通道做同样的事情,换句话说,用于遍历每个成员的 for 循环可以包含更多的内容,而不仅仅是一行。
编辑:这是一些代码,首先是结构:
typedef struct
{
uint32_t b:12;
uint32_t g:12;
uint32_t r:12;
uint32_t a:12;
} lrgb_t;
现在是我的问题在代码中的示例:
for (ic=0; ic<3; ic++)
{
for (i=0; i<curvecount; i++)
{
curve[i].p0.x = (double) i;
curve[i].p3.x = (double) i+1.;
switch (ic) // this is what I'm trying to eliminate
{
case 0:
curve[i].p0.y = pancol[i].r / 4095.;
curve[i].p3.y = pancol[i+1].r / 4095.;
break;
case 1:
curve[i].p0.y = pancol[i].g / 4095.;
curve[i].p3.y = pancol[i+1].g / 4095.;
break;
case 2:
curve[i].p0.y = pancol[i].b / 4095.;
curve[i].p3.y = pancol[i+1].b / 4095.;
break;
}
// Ideally this would be replaced by something like this, CHAN() being an hypothetical macro
// curve[i].p0.y = pancol[i].CHAN(ic) / 4095.;
// curve[i].p3.y = pancol[i+1].CHAN(ic) / 4095.;
}
... // more stuff that ultimately results in a bunch of pixels being written, channel after channel
}