说是icon格式,实际上只是将 XOR 图直接画在窗口上,搞清格式就不,有点一相不通为什么要把数据倒过来存储。
图标(ico,cur)文件的结构解析_ico文件格式解析-CSDN博客
void IconToBuf(HDC hdc, int x0, int y0, LPBITMAPINFOHEADER bi) {
WORD *buf;
//信息头之后是调色板,数量与biBitCount有关
LPRGBQUAD palettePtr = (LPRGBQUAD) ((DWORD) bi + bi->biSize);
//调色板之后是XOR位图的数据
PBYTE xordata;
//XOR位图的数据
PWORD anddata;
int bit, mod;
int count = ((bi->biHeight) * (bi->biWidth) / 4);
//数据顺序为: 从左到右,从下向上。而液晶屏加载显示顺序为:从左到右,从上向下。需要重新定位!
buf =
hdc->vram
+ (x0 + (y0 + bi->biHeight / 2 - 1) * hdc->nWidth) * VBE_BPP;
xordata = (PBYTE) ((DWORD) palettePtr
+ (sizeof(RGBQUAD) * (1 << bi->biBitCount)));
//KPrintf("icon %d,%d,%x!\n", bi->biHeight, bi->biWidth, xordata);
for (int i = 0; i < bi->biHeight / 2; i++) {
for (bit = 0; bit < bi->biWidth; bit++) {
mod = ((*xordata) >> (((bit + 1) % 2) << 2)) & 0xf;
*buf = rgb(palettePtr[mod].rgbRed, palettePtr[mod].rgbGreen,
palettePtr[mod].rgbBlue);
buf++;
xordata += (bit % 2);
}
buf -= (bit + hdc->nWidth);
}
}