基本的に何が起こっているかというと、SDL が表示する各色の量を決定するときに、マスクに設定されているビットを調べて、色のどのビットに注意を払うかを決定します。AND
値がシフトされるため、ビット単位ほど単純ではありません。例えば、
color = 0x00800000 = 00000000 10000000 00000000 00000000
マスクを
Rmask = 0xFF000000 = 11111111 00000000 00000000 00000000
Gmask = 0x00FF0000 = 00000000 11111111 00000000 00000000
Bmask = 0x0000FF00 = 00000000 00000000 11111111 00000000
Amask = 0x000000FF = 00000000 00000000 00000000 11111111
色は緑になります {R=0, G=128, B=0}. で指定された のビットは 0、 でcolor
指定されRmask
たビットGmask
は0x80 == 128
、 で指定されたビットBmask
は 0 です。同じ色のマスクを逆にする場合:
Rmask = 0x000000FF
Gmask = 0x0000FF00
Bmask = 0x00FF0000
Amask = 0xFF000000
色は青になります {R=0, G=0, B=128}. あなたが見ている例では、アルファチャンネルなしで 16 ビットカラーを使用しているようです。16 ビットは 3 つのカラー チャネルで均等に分割されないため、緑は余分なビットを取得します (人間の目は緑に対してより敏感であると考えられているため)。
例:
color = 0x1234 = 00010 010001 10100
Rmask = 0xF800 = 11111 000000 00000
Gmask = 0x07E0 = 00000 111111 00000
Bmask = 0x001F = 00000 000000 11111
Amask = 0
色は{R=2、G=17/2=8.5、B=20}になります。(緑の余分なビットは、正規化するために値を半分にする必要があることを意味します)。
SDLがどのように正確にそれを行うのか、またはSDLで使用できるクレイジーマスクの種類はわかりませんが、実際のアルゴリズムは bitwise の行に沿っており、AND
クリアされたビット数だけ右シフトすると思いますマスクの最も重要でない部分?または、最上位ビットから最下位ビットの順に作業し、マスクに設定されている各ビットについて、合計を左にシフトし、色の対応するビットが設定されている場合は 1 を追加します。