我正在寻找一种快速,C语言,可移植的方法(独立,无库)来执行colorkeyed blits。目标是一个独立的模拟器库,用于复古风格的计算机设计。
我目前对此有所了解(图片存储在uint32_t
类型的存储空间中,但它们是8位调色图像):
uint32_t sdata; /* Last read source data (4 pixels) */
uint32_t ckey; /* Prepared colorkey, such as 0x30303030U if the key is 0x30 */
uint32_t t32;
...
t32 = sdata ^ ckey; /* 0x00 where the colorkey matches */
t32 = (((t32 & 0x7F7F7F7FU) + 0x7F7F7F7FU) | t32) & 0x80808080U;
t32 = (t32 - (t32 >> 7)) + t32; /* Colorkey mask prepared (0xFF or 0x00) */
一些解释:
它基本上利用this bit twiddling hack修改来生成要应用于源的掩码。第二行是hack的核心,我的情况下每个像素(字节)返回0x80,与colorkey不匹配,否则返回0。第三行只是将所有0x80扩展为0xFF' s。后来应用蒙版是微不足道的,所以我没有包含它(并且在实际代码中它与其他东西结合起来,无论如何)。
所以问题是,在普通的C(简称C89)的限制下,有没有办法让这项任务更快(对于大多数架构而言)?