graphic2.c

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

C
1,539
字号
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_NOTSRC) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pBakDstBuffer = pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到一个字节的部分
                    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);
                        *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)
                            & tailMaskLeft
                            | (*pBakDstBuffer & tailMaskRight);
                        *pBakDstBuffer
                            |= ((~*pBakSrcBuffer & 0xff) >> nRight)
                            & tailMaskLeft;
                    }
                }
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_SRCAND) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pBakDstBuffer = pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到一个字节的部分
                    if (8 - uOffBit >= uImageW) {
                        if (8 - uOffBit >= dstHeadEx) {
                            if (nLeft) {
                                *pBakDstBuffer ++
                                    &= ((*pBakSrcBuffer >> nRight)
                                    & headMaskRight) | headMaskLeft;
                            }
                            else {
                                *pBakDstBuffer ++ &= headMaskLeft
                                    | (*pBakSrcBuffer ++ & headMaskRight);
                            }
                        }
                        else {
                            *pBakDstBuffer ++ &= ((*pBakSrcBuffer << nLeft)
                                & headMaskRight) | headMaskLeft;
                        }
                    }
                    else {  //这部分由源图中两个字节中的内容组成
                        *pBakDstBuffer ++ &= ((pBakSrcBuffer[1] >> nRight)
                            | (*pBakSrcBuffer ++ << nLeft))
                            & headMaskRight | headMaskLeft;
                    }
                }
                //中间部分,移位拷贝
                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 | tailMaskRight;
                    }
                    else {
                        *pBakDstBuffer &= ((*pBakSrcBuffer << nLeft)
                            | (pBakSrcBuffer[1] >> nRight))
                            & tailMaskLeft | tailMaskRight;
                    }
                }
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        break;
        
#if   COLOR_LEVEL >= 4                 
    case 0x04:
        pTable = g_mTable.pCurTable;
        pDstBuffer += (x >> 3) << 2;
        dstHeadEx = (8 - (x & 7)) & 7;
        srcTailEx = (uImageW - dstHeadEx) & 7;
        uLoopCount = (uImageW - dstHeadEx) >> 3;
        nLeft = (uOffBit + dstHeadEx) & 7;
        nRight = 8 - nLeft;
        headMaskL4 = maskTable4[dstHeadEx];
        headMaskR4 = ~headMaskL4;
        tailMaskL4 = maskTable4[(8 - srcTailEx) & 7];
        tailMaskR4 = ~tailMaskL4;
        if (uImageW < dstHeadEx) {  //小于4个字节
            headMaskL4 |= ~maskTable4[dstHeadEx - uImageW];
            headMaskR4 = ~headMaskL4;
            dstHeadEx = uImageW;
            uLoopCount = 0;
            srcTailEx = 0;
        }
        
        if (byDrawMode == DRMODE_SRCCOPY) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pTmp = (UINT32 *)pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到4个字节的部分
                    if (8 - (uOffBit & 7) >= dstHeadEx) {
                        if (nLeft) {
                            *pTmp ++ = (*pTmp & headMaskL4) | (pTable
                                [*pBakSrcBuffer >> nRight] & headMaskR4);
                        }
                        else {
                            *pTmp ++ = (*pTmp & headMaskL4) | (pTable
                                [*pBakSrcBuffer ++] & headMaskR4);
                        }
                    }
                    else {  //这部分由源图中两个部分中的内容组成
                        *pTmp = (*pTmp & headMaskL4)
                            | (pTable [(*pBakSrcBuffer++ << nLeft) & 0xff]
                            & headMaskR4);
                        *pTmp ++ |= pTable[*pBakSrcBuffer >> nRight]
                            & headMaskR4;
                    }
                }
                //中间部分,移位拷贝
                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 | (*pTmp & tailMaskR4);
                    }
                    else {
                        *pTmp = pTable[(*pBakSrcBuffer ++ << nLeft) & 0xff]
                            & maskTable4[nLeft] | (*pTmp & tailMaskR4);
                        *pTmp |= pTable[*pBakSrcBuffer >> nRight]
                            & tailMaskL4 & ~maskTable4[nLeft];
                    }
                }
                
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_TRANSPARENT
            && g_mTable.dwColor == BLACK_COLOR || byDrawMode == DRMODE_SRCOR) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pTmp = (UINT32 *)pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到4个字节的部分
                    if (8 - (uOffBit & 7) >= dstHeadEx) {
                        if (nLeft) {
                            *pTmp ++ |= pTable[*pBakSrcBuffer >> nRight]
                                & headMaskR4;
                        }
                        else {
                            *pTmp ++
                                |= pTable[*pBakSrcBuffer ++] & headMaskR4;
                        }
                    }
                    else {  //这部分由源图中两个字节中的内容组成
                        *pTmp ++ |= pTable[(*pBakSrcBuffer ++ << nLeft)
                            & 0xff | (pBakSrcBuffer[1] >> nRight)]
                            & headMaskR4;
                    }
                }
                //中间部分,移位拷贝
                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;
                    }
                    else {
                        *pTmp |= pTable[(*pBakSrcBuffer++ << nLeft) & 0xff]
                            & tailMaskL4;
                        *pTmp |= pTable[*pBakSrcBuffer >> nRight]
                            & tailMaskL4;
                    }
                }
                
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_TRANSPARENT) {
            UINT8   byData;

            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;
                pTmp = (UINT32 *)pDstBuffer;
                
                if (dstHeadEx) {    //处理目标前部不到4个字节的部分
                    if (8 - (uOffBit & 7) >= dstHeadEx) {
                        if (nLeft) {
                            byData = *pBakSrcBuffer >> nRight;
                        }
                        else {
                            byData = *pBakSrcBuffer ++;
                        }
                    }
                    else {  //这部分由源图中两个字节中的内容组成
                        byData = *pBakSrcBuffer++ << nLeft;
                        byData |= *pBakSrcBuffer >> nRight;
                    }
                    *pTmp &= ~Std1To4[byData] & headMaskR4 | headMaskL4;
                    *pTmp ++ |= pTable[byData] & headMaskR4;
                }
                //中间部分,移位拷贝
                if (nLeft) {
                    for (i = 0; i < uLoopCount; ++i) {
                        byData = (*pBakSrcBuffer ++ << nLeft)
                            | (pBakSrcBuffer[1] >> nRight);
                        *pTmp &= ~Std1To4[byData];
                        *pTmp ++ |= pTable[byData];
                    }
                }
                else {
                    for (i = 0; i < uLoopCount; ++ i) {
                        byData = *pBakSrcBuffer ++;
                        *pTmp &= ~Std1To4[byData];
                        *pTmp ++ |= pTable[byData];
                    }
                }
                //最后不到4个字节的内容
                if (srcTailEx) {
                    if (nRight >= srcTailEx) {
                        byData = *pBakSrcBuffer << nLeft;
                    }
                    else {
                        byData = *pBakSrcBuffer ++ << nLeft;
                        byData |= *pBakSrcBuffer >> nRight;
                    }
                    *pTmp &= ~Std1To4[byData] & tailMaskL4 | tailMaskR4;
                    *pTmp |= pTable[byData] & tailMaskL4;
                }
                
                dotBuf += uLineBytes;
                pDstBuffer += dwDstLineBytes;
            }
        }
        else if (byDrawMode == DRMODE_SRCAND) {
            while (uImageH -- > 0) {
                pBakSrcBuffer = dotBuf;

⌨️ 快捷键说明

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