ビット フィールドの構造体を使用して、ピクセル内の各カラー チャネルにアクセスします。問題は、各チャネルに同じ方法で適用されるコードが非常に頻繁にあることですが、CI エンドで構造体のメンバーを反復処理できないためです。メンバーごとに同じコードのコピーを 3 つ持つか、さらに不便なことに、switch-case ステートメントを使用する必要があります。
数値を指定してメンバーにアクセスできるようにマクロを使用できれば、よりエレガントになると考えました。理想的には、.CHAN(i) が、整数変数 i には、0、1、または 2 が含まれます。ただし、そのようなマクロを作成する方法や、それが可能かどうかさえわかりません。
詳細ですが、各メンバーは12ビットのようなもので、予想される8ビットではありません。そのため、配列に変換したり、ポインターとの共用体を作成したりすることはできません。また、別のチャネルに同じことを行う前に、各チャネルに多くのことを行う必要があることが多いため、X-Macros は機能しません。つまり、各メンバーを通過するための for ループには、1 行以上のものが含まれる可能性があります。
編集:ここにいくつかのコードがあります。最初に構造体です:
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
}