基本上发生的事情是,当SDL确定要显示的每种颜色的大小时,它会查看掩码中设置的哪些位以确定要在颜色中注意哪些位.它并不像按位那样简单,AND因为值会被移位.例如,
color = 0x00800000 = 00000000 10000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
你已经设置了面具
Rmask = 0xFF000000 = 11111111 00000000 00000000 00000000
Gmask = 0x00FF0000 = 00000000 11111111 00000000 00000000
Bmask = 0x0000FF00 = 00000000 00000000 11111111 00000000
Amask = 0x000000FF = 00000000 00000000 00000000 11111111
Run Code Online (Sandbox Code Playgroud)
那么颜色将是绿色{R = 0,G = 128,B = 0}.的位color通过指定Rmask是0时,由所指定的比特Gmask是0x80 == 128,并通过所指定的比特Bmask是0.如果你要反转为相同颜色的掩模:
Rmask = 0x000000FF
Gmask = 0x0000FF00
Bmask = 0x00FF0000
Amask = 0xFF000000
Run Code Online (Sandbox Code Playgroud)
现在颜色将为蓝色{R = 0,G = 0,B = 128}.看来您正在查看的示例使用16位颜色而没有Alpha通道.由于16位不均匀地划分为3个颜色通道,因此绿色得到额外的位(因为人眼被认为对绿色更敏感).
例:
color = 0x1234 = 00010 010001 10100
Rmask = 0xF800 = 11111 000000 00000
Gmask = 0x07E0 = 00000 111111 00000
Bmask = 0x001F = 00000 000000 11111
Amask = 0
Run Code Online (Sandbox Code Playgroud)
颜色为{R = 2,G = 17/2 = 8.5,B = 20}.(绿色的额外位表示需要将值减半以对其进行标准化).
我不确定SDL是如何做到这一点的,或者你可以使用SDL使用哪种类型的疯狂掩码,但我认为实际的算法是按位进行的AND,然后右移多少位清除面具最不重要的部分?或者,从最高有效位到最低有效位,对于在掩码中设置的每个位,移位总左,如果设置了相应的颜色位,则加1.