graphic2.c

来自「好记星的控件,包括button,list,对文件操作」· C语言 代码 · 共 1,539 行 · 第 1/5 页

C
1,539
字号
                    if (bySrc != byAll) {
                        if ((bySrc & 0xf0) == byHi) {
                            *pBakSrcBuffer = (*pBakSrcBuffer & 0xf0)
                                | (bySrc & 0xf);
                        }
                        else if ((bySrc & 0xf) == byLo) {
                            *pBakSrcBuffer = (*pBakSrcBuffer & 0xf)
                                | (bySrc & 0xf0);
                        }
                        else {
                            *pBakSrcBuffer = bySrc;
                        }
                    }
                    pBakDstBuffer ++;
                }
                if (dstTail) {  //最后一个象素占半个字节
                    bySrc = *pBakSrcBuffer << 4;
                    if (bySrc != byHi) {
                        *pBakDstBuffer = (*pBakDstBuffer & 0xf) | bySrc;
                    }
                }
            }
            else {
                for (i = 0; i < uLoopCount; ++i) {
                    bySrc = *pBakSrcBuffer ++;
                    if (bySrc != byAll) {
                        if ((bySrc & 0xf0) == byHi) {
                            *pBakSrcBuffer = (*pBakSrcBuffer & 0xf0)
                                | (bySrc & 0xf);
                        }
                        else if ((bySrc & 0xf) == byLo) {
                            *pBakSrcBuffer = (*pBakSrcBuffer & 0xf)
                                | (bySrc & 0xf0);
                        }
                        else {
                            *pBakSrcBuffer = bySrc;
                        }
                    }
                    pBakDstBuffer ++;
                }
                if (dstTail) {  //最后一个象素占半个字节
                    bySrc = *pBakSrcBuffer & 0xf0;
                    if (bySrc != byHi) {
                        *pBakDstBuffer = (*pBakDstBuffer & 0xf) | bySrc;
                    }
                }
            }
            pSrcBuffer += dwSrcLineBytes;
            pDstBuffer += dwDstLineBytes;
        }
    }
    else if (pDstDC->dcDrawMode == DRMODE_SRCOR) {
        while (height -- > 0) {
            pBakSrcBuffer = pSrcBuffer;
            pBakDstBuffer = pDstBuffer;
            
            if (dstHead) {      //目标起始位置为奇
                if (srcHead) {
                    *pBakDstBuffer ++ |= *pBakSrcBuffer ++ & 0xf;
                }
                else {
                    *pBakDstBuffer ++ |= *pBakSrcBuffer >> 4;
                }
            }
            
            //起始位置奇偶性不同,需拆分组合每个字节,否则直接拷贝
            if (dstHead != srcHead) {
                for (i = 0; i < uLoopCount; ++i) {
                    *pBakDstBuffer ++ |= (*pBakSrcBuffer ++ << 4)
                        | (pBakSrcBuffer[1] >> 4);
                }
                if (dstTail) {  //最后一个象素占半个字节
                    *pBakDstBuffer |= *pBakSrcBuffer << 4;
                }
            }
            else {
                for (i = 0; i < uLoopCount; ++i) {
                    *pBakDstBuffer ++ |= *pBakSrcBuffer ++;
                }
                if (dstTail) {  //最后一个象素占半个字节
                    *pBakDstBuffer = *pBakSrcBuffer & 0xf0;
                }
            }
            pSrcBuffer += dwSrcLineBytes;
            pDstBuffer += dwDstLineBytes;
        }
    }
    else if (pDstDC->dcDrawMode == DRMODE_SRCAND) {
        while (height -- > 0) {
            pBakSrcBuffer = pSrcBuffer;
            pBakDstBuffer = pDstBuffer;
            
            if (dstHead) {      //目标起始位置为奇
                if (srcHead) {
                    *pBakDstBuffer ++ &= (*pBakDstBuffer & 0xf0)
                        | (*pBakSrcBuffer ++ & 0xf);
                }
                else {
                    *pBakDstBuffer ++ &= (*pBakDstBuffer & 0xf0)
                        | (*pBakSrcBuffer >> 4);
                }
            }
            
            //起始位置奇偶性不同,需拆分组合每个字节,否则直接拷贝
            if (dstHead != srcHead) {
                for (i = 0; i < uLoopCount; ++i) {
                    *pBakDstBuffer ++ &= (*pBakSrcBuffer ++ << 4)
                        | (pBakSrcBuffer[1] >> 4);
                }
                if (dstTail) {  //最后一个象素占半个字节
                    *pBakDstBuffer &= (*pBakSrcBuffer << 4)
                        | (*pBakDstBuffer & 0x0f);
                }
            }
            else {
                for (i = 0; i < uLoopCount; ++i) {
                    *pBakDstBuffer ++ &= *pBakSrcBuffer ++;
                }
                if (dstTail) {  //最后一个象素占半个字节
                    *pBakDstBuffer &= (*pBakSrcBuffer & 0xf0)
                        | (*pBakDstBuffer & 0x0f);
                }
            }
            pSrcBuffer += dwSrcLineBytes;
            pDstBuffer += dwDstLineBytes;
        }
    }
}
/*************************************************************************/
/* FUNCTION:   _DrawTextImage                                           */
/* 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 _DrawTextImage(MDC *pDC, INT x, INT y, UINT uImageW, UINT uImageH,
                    UINT8 *dotBuf, UINT uOffBit, UINT uLineBytes)
{
    UINT8   *pDstBuffer;
    UINT8   *pBakSrcBuffer, *pBakDstBuffer;
    UINT32  dwDstLineBytes;
    int     uLoopCount, i;
    UINT8   byDrawMode;
    MBitMapInfoHeader    *pDstBmp;
    UINT8   dstHeadEx, srcTailEx;   //头尾不成一个字节的位
    int     nLeft, nRight;
    
    // 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
    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 += uOffBit >> 3;
    
    switch (pDstBmp->biBitCount) {
    case 0x01:
        uOffBit &= 7;
        pDstBuffer += x >> 3;
        dstHeadEx = (8 - (x & 7)) & 7;
        srcTailEx = (uImageW - dstHeadEx) & 7;
        uLoopCount = (uImageW - dstHeadEx) >> 3;
        nLeft = (uOffBit + 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 - uOffBit >= uImageW) {
                        if (8 - uOffBit >= 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;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_TRANSPARENT) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pBakDstBuffer = pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到一个字节的部分
                    if (8 - uOffBit >= uImageW) {
                        if (8 - uOffBit >= 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;
                    }
                }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?