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 + -
显示快捷键?