graphic2.c
来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,539 行 · 第 1/5 页
C
1,539 行
pTmp = (UINT32 *)pDstBuffer;
if (dstHeadEx) { //处理目标前部不到4个字节的部分
if (8 - (uOffBit & 7) >= dstHeadEx) {
if (nLeft) {
*pTmp ++ &= pTable[*pBakSrcBuffer >> nRight]
& headMaskR4 | headMaskL4;
}
else {
*pTmp ++ &= pTable[*pBakSrcBuffer ++]
& headMaskR4 | headMaskL4;
}
}
else { //这部分由源图中两个字节中的内容组成
*pTmp ++ &= pTable[(pBakSrcBuffer[1] >> nRight)
| (*pBakSrcBuffer++ << nLeft) & 0xff]
& headMaskR4 | headMaskL4;
}
}
//中间部分,移位拷贝
if (nLeft) {
for (i = 0; i < uLoopCount; ++i) {
*pTmp ++ &= pTable[(*pBakSrcBuffer ++ << nLeft)
& 0xff | (pBakSrcBuffer[1] >> nRight)];
}
}
else {
for (i = 0; i < uLoopCount; ++ i) {
*pTmp ++ &= pTable[*pBakSrcBuffer ++];
}
}
//最后不到4个字节的内容
if (srcTailEx) {
if (nRight >= srcTailEx) {
*pTmp &= pTable[(*pBakSrcBuffer << nLeft) & 0xff]
& tailMaskL4 | tailMaskR4;
}
else {
*pTmp &= pTable[(*pBakSrcBuffer << nLeft) & 0xff
| (pBakSrcBuffer[1] >> nRight)]
& tailMaskL4 | tailMaskR4;
}
}
dotBuf += uLineBytes;
pDstBuffer += dwDstLineBytes;
}
}
break;
#endif
default:
break;
}
}
/*************************************************************************/
/* FUNCTION: _DrawBmpDotImage */
/* DESCRIPTION:Draw a image with dot information. */
/* INPUTS: pDC,Device to fill. */
/* x,x-coordinate of start point. */
/* y,y-coordinate of start point. */
/* uImageW,width or enable area. */
/* uImageH,height or enable area. */
/* dotbuff,dot image buffer. */
/* uOffbit,bit to avoid from left. */
/* LineBytes,one line buffer length for bitmap of dc. */
/* OUTPUTS: NONE. */
/* RETURN: NONE. */
/*************************************************************************/
VOID _DrawBmpDotImage(MDC *pDC, INT x, INT y, UINT uImageW, UINT uImageH,
MBitMapInfoHeader *BmpMap, UINT uXOffBit, UINT uYOffBit)
{
UINT8 *pDstBuffer,*dotBuf;
UINT8 *pBakSrcBuffer, *pBakDstBuffer;
UINT32 dwDstLineBytes;
int uLoopCount, i;
UINT8 byDrawMode;
MBitMapInfoHeader *pDstBmp;
UINT8 dstHeadEx, srcTailEx; //头尾不成一个字节的位
int nLeft, nRight;
UINT32 uLineBytes;
// left or right mean the left part after operation
// for mono bitmap
UINT8 headMaskLeft, headMaskRight, tailMaskLeft, tailMaskRight;
// for 4-bit gray bitmap
#if COLOR_LEVEL >= 4
UINT32 headMaskL4, headMaskR4, tailMaskL4, tailMaskR4;
UINT32 *pTmp, *pTable;
#endif
uLineBytes = _getLineBytes(BmpMap->biBitCount, BmpMap->biWidth);
if( BmpMap->biHeight > 0 )
// dotBuf = (UINT8 *) (BmpMap ) +sizeof(MBitMap ) + uLineBytes *( uImageH -1 -uYOffBit )
dotBuf = (UINT8 *) (BmpMap ) +sizeof(MBitMap ) + uLineBytes *( BmpMap->biHeight -1 -uYOffBit )
+ _getPaletteSize(BmpMap->biBitCount, BmpMap->biClrUsed) ;
else
dotBuf = (UINT8 *) (BmpMap + 1) + uLineBytes * uYOffBit
+ _getPaletteSize(BmpMap->biBitCount, BmpMap->biClrUsed) ;
pDstBmp = &pDC->dcBitMapInfo->bmpInfo;
dwDstLineBytes = _getLineBytes(pDstBmp->biBitCount, pDstBmp->biWidth);
pDstBuffer = (UINT8 *)(pDstBmp + 1) + dwDstLineBytes * y
+ _getPaletteSize(pDstBmp->biBitCount, pDstBmp->biClrUsed);
byDrawMode = g_mTable.style;
dotBuf += uXOffBit >> 3;
switch (pDstBmp->biBitCount) {
case 0x01:
uXOffBit &= 7;
pDstBuffer += x >> 3;
dstHeadEx = (8 - (x & 7)) & 7;
srcTailEx = (uImageW - dstHeadEx) & 7;
uLoopCount = (uImageW - dstHeadEx) >> 3;
nLeft = (uXOffBit + dstHeadEx) & 7;
nRight = 8 - nLeft;
headMaskLeft = maskTable1[dstHeadEx];
headMaskRight = ~headMaskLeft;
tailMaskLeft = maskTable1[(8 - srcTailEx) & 7];
tailMaskRight = ~tailMaskLeft;
if (uImageW < dstHeadEx) { //小于一个字节
headMaskLeft |= ~maskTable1[dstHeadEx - uImageW];
headMaskRight = ~headMaskLeft;
uLoopCount = 0;
srcTailEx = 0;
}
else {
uImageW = dstHeadEx;
}
if (byDrawMode == DRMODE_SRCCOPY)
{
while (uImageH -- > 0) {
pBakSrcBuffer = dotBuf;
pBakDstBuffer = pDstBuffer;
if (dstHeadEx) { //处理目标前部不到一个字节的部分
if (8 - uXOffBit >= uImageW) {
if (8 - uXOffBit >= dstHeadEx) {
if (nLeft) {
*pBakDstBuffer ++
= (*pBakDstBuffer & headMaskLeft)
| ((*pBakSrcBuffer >> nRight)
& headMaskRight);
}
else {
*pBakDstBuffer ++
= (*pBakDstBuffer & headMaskLeft)
| (*pBakSrcBuffer ++ & headMaskRight);
}
}
else {
*pBakDstBuffer ++
= (*pBakDstBuffer & headMaskLeft)
| ((*pBakSrcBuffer << nLeft)
& headMaskRight);
}
}
else { //这部分由源图中两个字节中的内容组成
*pBakDstBuffer ++ = (*pBakDstBuffer & headMaskLeft)
| ((*pBakSrcBuffer ++ << nLeft
| (pBakSrcBuffer[1] >> nRight))
& headMaskRight);
}
}
//中间部分,移位拷贝
if (nLeft) {
for (i = 0; i < uLoopCount; ++i) {
*pBakDstBuffer ++ = (*pBakSrcBuffer ++ << nLeft)
| (pBakSrcBuffer[1] >> nRight);
}
}
else {
memmove(pBakDstBuffer, pBakSrcBuffer, uLoopCount);
pBakDstBuffer += uLoopCount;
pBakSrcBuffer += uLoopCount;
}
//最后不到一个字节的内容
if (srcTailEx) {
if (nRight >= srcTailEx) {
*pBakDstBuffer = (*pBakSrcBuffer << nLeft)
& tailMaskLeft
| (*pBakDstBuffer & tailMaskRight);
}
else {
*pBakDstBuffer = ((*pBakSrcBuffer << nLeft)
| (pBakSrcBuffer[1] >> nRight)) & tailMaskLeft
| (*pBakDstBuffer & tailMaskRight);
}
}
// dotBuf += uLineBytes;
if( BmpMap->biHeight > 0 )
dotBuf -= uLineBytes;
else
dotBuf += uLineBytes;
pDstBuffer += dwDstLineBytes;
}
}
else if (byDrawMode == DRMODE_TRANSPARENT) {
while (uImageH -- > 0) {
pBakSrcBuffer = dotBuf;
pBakDstBuffer = pDstBuffer;
if (dstHeadEx) { //处理目标前部不到一个字节的部分
if (8 - uXOffBit >= uImageW) {
if (8 - uXOffBit >= dstHeadEx) {
if (nLeft) {
*pBakDstBuffer ++
|= ((*pBakSrcBuffer >> nRight)
& headMaskRight);
}
else {
*pBakDstBuffer ++
|= (*pBakSrcBuffer ++ & headMaskRight);
}
}
else {
*pBakDstBuffer ++ |= ((*pBakSrcBuffer << nLeft)
& headMaskRight);
}
}
else { //这部分由源图中两个字节中的内容组成
*pBakDstBuffer ++ |= ((*pBakSrcBuffer ++ << nLeft)
| (pBakSrcBuffer[1] >> nRight))
& headMaskRight;
}
}
//中间部分,移位拷贝
if (nLeft) {
for (i = 0; i < uLoopCount; ++i) {
*pBakDstBuffer ++ |= (*pBakSrcBuffer ++ << nLeft)
| (pBakSrcBuffer[1] >> nRight);
}
}
else {
for (i = 0; i < uLoopCount; ++i) {
*pBakDstBuffer ++ |= *pBakSrcBuffer ++;
}
}
//最后不到一个字节的内容
if (srcTailEx) {
if (nRight >= srcTailEx) {
*pBakDstBuffer |= (*pBakSrcBuffer << nLeft)
& tailMaskLeft;
}
else {
*pBakDstBuffer |= ((*pBakSrcBuffer << nLeft)
| (pBakSrcBuffer[1] >> nRight)) & tailMaskLeft;
}
}
// dotBuf += uLineBytes;
if( BmpMap->biHeight > 0 )
dotBuf -= uLineBytes;
else
dotBuf += uLineBytes;
pDstBuffer += dwDstLineBytes;
}
}
else if (byDrawMode == DRMODE_NOTSRC) {
while (uImageH -- > 0) {
pBakSrcBuffer = dotBuf;
pBakDstBuffer = pDstBuffer;
if (dstHeadEx) { //处理目标前部不到一个字节的部分
if (8 - uXOffBit >= dstHeadEx) {
if (nLeft) {
*pBakDstBuffer ++
= (*pBakDstBuffer & headMaskLeft)
| (~(*pBakSrcBuffer >> nRight)
& headMaskRight);
}
else {
*pBakDstBuffer ++
= (*pBakDstBuffer & headMaskLeft)
| (~(*pBakSrcBuffer ++) & headMaskRight);
}
}
else { //这部分由源图中两个字节中的内容组成
*pBakDstBuffer = (*pBakDstBuffer & headMaskLeft)
|(~(*pBakSrcBuffer++ << nLeft) &headMaskRight);
*pBakDstBuffer ++ |= (~(*pBakSrcBuffer >> nRight)
& headMaskRight);
}
}
//中间部分,移位拷贝
if (nLeft) {
for (i = 0; i < uLoopCount; ++i) {
*pBakDstBuffer ++ = (~*pBakSrcBuffer ++ << nLeft)
| ((UINT8)~pBakSrcBuffer[1] >> nRight);
}
}
else {
for (i = 0; i < uLoopCount; ++i) {
*pBakDstBuffer ++ = ~*pBakSrcBuffer ++;
}
}
//最后不到一个字节的内容
if (srcTailEx) {
if (nRight >= srcTailEx) {
*pBakDstBuffer = ~(*pBakSrcBuffer << nLeft)
& tailMaskLeft
| (*pBakDstBuffer & tailMaskRight);
}
else {
*pBakDstBuffer = (~*pBakSrcBuffer ++ << nLeft)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?