📄 whdxgraphic.cpp
字号:
rc.top = nYOffset;
rc.bottom = nYOffset+nHeight;
INT nWidthStart = 0;
INT nWidthEnd = 0;
INT nCurrWidth = 0;
INT nCntCopyWord = 0;
INT nYCnt =0;
INT nLastWidth = 0;
FLOAT rBlueRate, rGreenRate, bRedRate;
BYTE bRedSrc, bGreenSrc, bBlueSrc;
BYTE bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
WORD wPixel;
// y绵 努府俏.
for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
{
nWidthEnd += pwSrc[nWidthStart];
nWidthStart++;
nWidthEnd++;
nWidthStart = nWidthEnd;
}
// y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
{
// 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
nWidthEnd += pwSrc[nWidthStart];
nWidthStart++;
// 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
for ( INT x = nWidthStart; x < nWidthEnd ; )
{
if ( pwSrc[x] == 0xC0 )
{
x++;
nCntCopyWord = pwSrc[x];
x++;
nCurrWidth += nCntCopyWord;
}
else if ( pwSrc[x] == 0xC1 )
{
x++;
nCntCopyWord = pwSrc[x];
x++;
nLastWidth = nCurrWidth;
nCurrWidth += nCntCopyWord;
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
else
{
// rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
{
x += (rc.left-nLastWidth);
memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
x += (nCurrWidth-rc.left);
}
// rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
{
memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
x += nCntCopyWord;
}
else
{
memcpy(&pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
x += nCntCopyWord;
}
}
}
else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
{
WORD wDyingKind, wChooseColor;
wDyingKind = pwSrc[x];
switch ( wDyingKind )
{
case 0xC2:
wChooseColor = wChooseColor1;
break;
case 0xC3:
wChooseColor = wChooseColor2;
break;
}
x++;
nCntCopyWord = pwSrc[x];
x++;
nLastWidth = nCurrWidth;
nCurrWidth += nCntCopyWord;
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
else
{
// rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
{
x += (rc.left-nLastWidth);
for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
{
wPixel = wChooseColor;
bBlueWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
wPixel = pwSrc[x+nCheck];
bBlueSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor <<m_stBitsMaskInfo.bRShift) |
(bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
(bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
}
x += (nCurrWidth-rc.left);
}
// rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
{
for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
{
wPixel = wChooseColor;
bBlueWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
wPixel = pwSrc[x+nCheck];
bBlueSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor <<m_stBitsMaskInfo.bRShift) |
(bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
(bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
}
x += nCntCopyWord;
}
else
{
for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
{
wPixel = wChooseColor;
bBlueWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
wPixel = pwSrc[x+nCheck];
bBlueSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
pwDst[((nYCnt+nY) * nDstXSize) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor <<m_stBitsMaskInfo.bRShift) |
(bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
(bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
}
x += nCntCopyWord;
}
}
}
}
// 扼牢狼 场阑 促澜 扼牢狼 矫累栏肺 颗败霖促.
nWidthEnd++;
nWidthStart = nWidthEnd;
nCurrWidth = 0;
}
}
m_pddsBackBuffer->Unlock(NULL);
return TRUE;
}
return FALSE;
}
BOOL CWHDXGraphicWindow::DrawWithImageForComp(INT nX, INT nY, RECT rcSrc, WORD* pwSrc, WORD wChooseColor1, WORD wChooseColor2)
{
RECT rc;
DDSURFACEDESC2 ddsd;
INT nWidth = rcSrc.right-rcSrc.left;
INT nHeight = rcSrc.bottom-rcSrc.top;
INT nXOffset = rcSrc.left;
INT nYOffset = rcSrc.top;
INT nStartX = 0;
INT nStartY = 0;
INT nEndX = m_stDisplayInfo.wWidth -1;
INT nEndY = m_stDisplayInfo.wHeight-1;
if ( m_pddsBackBuffer != NULL )
{
if (nX < nStartX )
{
nXOffset += nStartX - nX;
nWidth = rcSrc.right - nXOffset;
}
if ( (nX+rcSrc.right-rcSrc.left-1) > nEndX )
nWidth = nEndX - nX - nXOffset + 1;
if ( nY < nStartY )
{
nYOffset += nStartY - nY;
nHeight = rcSrc.bottom - nYOffset;
}
if ( (nY+rcSrc.bottom-rcSrc.top-1) > nEndY )
nHeight = nEndY - nY - nYOffset + 1;
if ( (nWidth > 0) && (nHeight > 0) )
{
rc.left = nXOffset;
rc.right = nXOffset+nWidth;
rc.top = nYOffset;
rc.bottom = nYOffset+nHeight;
ddsd.dwSize = sizeof(DDSURFACEDESC2);
ddsd.lpSurface = NULL;
m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
if ( !ddsd.lpSurface ) return FALSE;
WORD* pwdDst;
pwdDst = (WORD*)ddsd.lpSurface;
INT nWidthStart = 0;
INT nWidthEnd = 0;
INT nCurrWidth = 0;
INT nCntCopyWord = 0;
INT nYCnt =0;
INT nLastWidth = 0;
FLOAT rBlueRate, rGreenRate, bRedRate;
BYTE bRedSrc, bGreenSrc, bBlueSrc;
BYTE bRedWantedColor, bGreenWantedColor, bBlueWantedColor;
WORD wPixel;
// y绵 努府俏.
for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
{
nWidthEnd += pwSrc[nWidthStart];
nWidthStart++;
nWidthEnd++;
nWidthStart = nWidthEnd;
}
// y绵俊 措秦辑 角力肺 风俏矫懦 Count父阑 沥茄促.
for ( nYCnt=rc.top ; nYCnt < rc.bottom ; nYCnt++ )
{
// 茄扼牢狼 辨捞甫 掘绢柯促.(窜困绰 况靛)
nWidthEnd += pwSrc[nWidthStart];
nWidthStart++;
// 扼牢狼 辨捞父怒 拳搁俊 谎妨霖促.
for ( INT x = nWidthStart; x < nWidthEnd ; )
{
if ( pwSrc[x] == 0xC0 )
{
x++;
nCntCopyWord = pwSrc[x];
x++;
nCurrWidth += nCntCopyWord;
}
else if ( pwSrc[x] == 0xC1 )
{
x++;
nCntCopyWord = pwSrc[x];
x++;
nLastWidth = nCurrWidth;
nCurrWidth += nCntCopyWord;
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
else
{
// rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
{
x += (rc.left-nLastWidth);
memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (rc.left+nX)], &pwSrc[x], sizeof(WORD)*(nCurrWidth-rc.left));
x += (nCurrWidth-rc.left);
}
// rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
{
memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*(rc.right-nLastWidth));
x += nCntCopyWord;
}
else
{
memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
x += nCntCopyWord;
}
}
}
else if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
{
WORD wDyingKind, wChooseColor;
wDyingKind = pwSrc[x];
switch ( wDyingKind )
{
case 0xC2:
wChooseColor = wChooseColor1;
break;
case 0xC3:
wChooseColor = wChooseColor2;
break;
}
x++;
nCntCopyWord = pwSrc[x];
x++;
nLastWidth = nCurrWidth;
nCurrWidth += nCntCopyWord;
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
else
{
// rc.left痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
{
x += (rc.left-nLastWidth);
for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
{
wPixel = wChooseColor;
bBlueWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
wPixel = pwSrc[x+nCheck];
bBlueSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift);
if ( bGreenWantedColor > (m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift) )
bGreenWantedColor = (BYTE)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift);
if ( bRedWantedColor > (m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift) )
bRedWantedColor = (BYTE)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift);
pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX+nCheck)] = ((bRedWantedColor <<m_stBitsMaskInfo.bRShift) |
(bGreenWantedColor<<m_stBitsMaskInfo.bGShift) |
(bBlueWantedColor <<m_stBitsMaskInfo.bBShift));
}
x += (nCurrWidth-rc.left);
}
// rc.right痢阑 扁霖栏肺 墨乔且 康开捞 吧赴 版快.
else if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
{
for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
{
wPixel = wChooseColor;
bBlueWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedWantedColor = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
wPixel = pwSrc[x+nCheck];
bBlueSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwBMask) >> m_stBitsMaskInfo.bBShift);
bGreenSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwGMask) >> m_stBitsMaskInfo.bGShift);
bRedSrc = (BYTE)((wPixel & m_stBitsMaskInfo.dwRMask) >> m_stBitsMaskInfo.bRShift);
rBlueRate = (FLOAT)((FLOAT)bBlueSrc / (FLOAT)(m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift));
rGreenRate = (FLOAT)((FLOAT)bGreenSrc / (FLOAT)(m_stBitsMaskInfo.dwGMask>>m_stBitsMaskInfo.bGShift));
bRedRate = (FLOAT)((FLOAT)bRedSrc / (FLOAT)(m_stBitsMaskInfo.dwRMask>>m_stBitsMaskInfo.bRShift));
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
if ( bBlueWantedColor > (m_stBitsMaskInfo.dwBMask>>m_stBitsMaskInfo.bBShift) )
bBlueWantedColor = (BYTE)(m_stBitsMaskInfo.dwBMask>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -