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