传奇3客户端(wil格式分析)

更新时间:2023-06-05 17:18:45 阅读: 评论:0

传奇3客户端(wil格式分析)
绘制mir3的图像
/*
⽤于压缩图像的绘制,绘制mir3的图像。
该函数使⽤pwSrc所指向的压缩图像数据,rcSrc所指⽰的源图像矩形,
给定⽤于保存源图像的矩形的左上⾓由nX, nY 定位。
压缩的图像⽂件映像中图像数据区的格式:
标志,如果是C0 00 表⽰是透明像素,如果是C1 00表⽰是正常像素,
如果是C2 00函数使⽤wChooColor1进⾏像素处理,如果是C3 00 函数使⽤wChooColor2进⾏像素处理,注意: 1、函数的参数有默认值: wChooColor1 = 0XFFFF, wChooColor2 = 0XFFFF 这是⽩⾊。
2、注意存在屏幕、显⽰区域、和⽬标矩形三个区域,屏幕坐标系作为显⽰区域和⽬标矩形定位的区域。
老年褥疮最好方法
+++++++++++++++++++++++++++++++++++++++++++++++++++
+              |              | nY              +
+---------------|-----------nX ++++++++++++++++  +
+              |nStartY      +              +  +
+-----nStartX---++++++++++++++++++++++++++++  +  +
+              + m_stDisplayInfo.wWidth  +  +  +
胃火牙痛+              +              +          +  +  +
+              +              +          +  +  +
+              +              ++++++++++++++++  +
+              + m_stDisplayInfo.wHeight  +      +
+              +                          +      +
+              ++++++++++++++++++++++++++++      +
+                                                +
+                                                +
+                                                +
+++++++++++++++++++++++++++++++++++++++++++++++++++
*/
BOOL CWHDXGraphicWindow::DrawWithImageForComp
(INT nX, INT nY, //源图像的左上⾓绘制到屏幕上时的屏幕坐标
RECT rcSrc, //源图像矩形
WORD* pwSrc, //源图像数据
WORD wChooColor1, //选择的混合颜⾊1
WORD wChooColor2 //选择的混合颜⾊2
)
{
RECT rc; //实际绘制矩形
DDSURFACEDESC2 ddsd; //dd表⾯特性描述结构
//////////////////////////////////////////////////////////////////////////////
//在屏幕坐标系上(或窗⼝的客户坐标系上)定位源图像的矩形(⽬标矩形)
//实际绘制矩形的宽⾼初始化为源图像矩形的⾼宽
INT nWidth = rcSrc.right-rcSrc.left;
INT nHeight = p;
//实际绘制矩形的左上⾓相对位置
INT nXOfft = rcSrc.left;
INT nYOfft = p;
//在显⽰区域上定位⼀个供图像显⽰的区域,这就像定义⼀个视⼝,这⾥与显⽰屏幕同。
//这个区域的左上⾓被定位在显⽰区的左上⾓,右下⾓定位在显⽰区的右下⾓。
//注意当这个视⼝与显⽰屏幕不⼀致时,仅仅视⼝之内的图像才需要绘制。
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 )
{
nXOfft += nStartX - nX;
nWidth = rcSrc.right - nXOfft;
}
//如果⽬标矩形有区域落在视⼝右边线之右
if ( (nX+rcSrc.right-rcSrc.left-1) > nEndX )
nWidth = nEndX - nX - nXOfft + 1;
/
/如果⽬标矩形有区域落在视⼝上边线之上
if ( nY < nStartY )
{
nYOfft += nStartY - nY;
nHeight = rcSrc.bottom - nYOfft;
}
//如果⽬标矩形有区域落在视⼝下边线之下
if ( (nY+p-1) > nEndY )
nHeight = nEndY - nY - nYOfft + 1;
//以上计算出需要绘制的图像部分的矩形
//剪切的结果是⼀个正矩形,说明⽬标矩形与视⼝有重叠部分,这就可以进⾏绘制了。
if ( (nWidth > 0) && (nHeight > 0) )
{
//定位绘制区域
rc.left = nXOfft;
rc.right = nXOfft+nWidth;

rc.bottom = nYOfft+nHeight;
//初始化dd表⾯特性描述结构
ddsd.dwSize = sizeof(DDSURFACEDESC2);
ddsd.lpSurface = NULL;
//锁定后缓冲区表⾯,获取直接访问表⾯内存所必须的信息
m_pddsBackBuffer->Lock(NULL, &ddsd, DDLOCK_WAIT, NULL);
//如果没有获取表⾯的基地址,则调⽤返回失败。
if ( !ddsd.lpSurface ) return FALSE;
//将表⾯内存的基地址转换为字指针(每像素16位⾊深)
学习网站WORD* pwdDst;
pwdDst = (WORD*)ddsd.lpSurface; //获取dd表⾯的基地址
//将格式图像处理为每像素16位⾊深的位图数据阵列时
//在逐像素处理过程中要使⽤的⼀些临时变量,坐标原点在图像的⼏何中⼼。
INT nWidthStart = 0; //宽度⽅向开始处理的像素坐标
INT nWidthEnd = 0; //累计处理完毕的像素数⽬
INT nCurrWidth  = 0; //当前正在处理的像素的宽度坐标
INT nCntCopyWord = 0; //需要拷贝的图像像素数⽬(每像素两个字节)
INT nYCnt =0; //累计表⾯上不包含本图像像素的显⽰表⾯的像素⾏的数量
INT nLastWidth = 0; //最近⼀次处理的像素宽度⽅向的像素坐标
//解析格式图像数据时,根据格式标识进⾏图像像素的光栅操作时要使⽤的临时变量。
FLOAT rBlueRate, rGreenRate, bRedRate; //⽤于保存565数据中的各个彩⾊分量的⽐率
BYTE  bRedSrc, bGreenSrc, bBlueSrc; //⽤于保存源图像数据的各个彩⾊分量值
BYTE  bRedWantedColor, bGreenWantedColor, bBlueWantedColor; //⽤于保存光栅操作后图像数据的各个彩⾊分量值WORD  wPixel; //⽤于保存选择的⽤于对图像某些像素进⾏光栅操作的⼀个565彩⾊值
//LYF:这⾥是如何定位源图像数据中要处理的数据的呢?
//使⽤nYCnt计算出显⽰表⾯上不包含本图像像素的像素⾏的数量,
//表⾯的nYCnt⾏的下⼀⾏将包含本图像的⾸⾏。
for ( nYCnt=0 ; nYCnt < rc.top ; nYCnt++ )
{
nWidthEnd += pwSrc[nWidthStart]; //表⾯上⼀⾏已经处理完的字节数
nWidthStart++; //LYF:这⼀句⽆⽤?
nWidthEnd++; //处理包含图像数据的下⼀个表⾯⾏
nWidthStart = nWidthEnd; //得到要开始处理的像素的屏幕坐标
}
//对图像上从图像顶到图像底的每⼀⾏像素,逐⾏处理
for ( p ; nYCnt < rc.bottom ; nYCnt++ )
{
// 计算出开始绘制的像素的结束地址和开始地址
nWidthEnd += pwSrc[nWidthStart];
nWidthStart++;
//按源图像格式解析并逐像素绘制
for ( INT x = nWidthStart; x < nWidthEnd ; )
{
//0xC0是作透明处理的像素的标记
if ( pwSrc[x] == 0xC0 )
{
//透明像素不拷贝到⽬表表⾯,仅仅计算所占位置
x++;
nCntCopyWord = pwSrc[x]; //获得要拷贝的作透明处理像素的数量
x++;
nCurrWidth += nCntCopyWord; //计算以像素表⽰的当前宽度
}
//0xC1是正常的图像数据的标记
el if ( pwSrc[x] == 0xC1 )
{
x++;
nCntCopyWord = pwSrc[x]; //获得要拷贝的正常处理像素的数量
x++;
nLastWidth = nCurrWidth; //最近的像素表⽰的宽度
nCurrWidth += nCntCopyWord; //计算以像素表⽰的当前宽度
/
/当前像素落在绘制矩形之外不绘制
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
//当前像素落在绘制矩形之内就进⾏正常像素的拷贝
//注意由中⼼向左边拷贝,再向右边拷贝,这样第⼀时间出现有效的像素。
//因为是绘制矩形的左半边,故表⾯每⾏的字节数(表⾯节距)要除以2即右移⼀位。
//正要绘制的表⾯像素的偏移量(字节) = 已经绘制的表⾯像素的⾏坐标(Y)* 表⾯的节距 + 已经绘制的表⾯像素的列坐标(X)*每像素字节数
el
{
// 实际绘制矩形的左半边
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);
}
// 实际绘制矩形的右半边
el 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;
}
el
{
memcpy(&pwdDst[((nYCnt+nY) * (ddsd.lPitch >> 1)) + (nLastWidth+nX)], &pwSrc[x], sizeof(WORD)*nCntCopyWord);
x += nCntCopyWord;三愿
}
}
}
//0xC2、0xC3 是使⽤选择的颜⾊对图像进⾏滤镜处理的标记,
//往往⽤于⾓⾊垂死的变⾊镜效果的处理。
el if ( pwSrc[x] == 0xC2 || pwSrc[x] == 0xC3 )
{
WORD wDyingKind, wChooColor; //垂死种类、选择的变⾊颜⾊
wDyingKind = pwSrc[x];
//根据垂死种类选择变⾊颜⾊
switch ( wDyingKind )
{
//使⽤参数wChooColor1设定的颜⾊
ca0xC2:
wChooColor = wChooColor1;
break;
//使⽤参数wChooColor2设定的颜⾊
ca0xC3:
wChooColor = wChooColor2;
break;
}
x++;
nCntCopyWord = pwSrc[x]; //获得需要进⾏垂死颜⾊处理的像素的数量
x++;
nLastWidth = nCurrWidth;
nCurrWidth += nCntCopyWord;
//如果当前像素落在绘制矩形之外则不绘制
if ( rc.left > nCurrWidth || rc.right < nLastWidth )
{
x += nCntCopyWord;
}
// 绘制矩形之内的像素就要对该像素进⾏光栅处理,
//注意是由中⼼向左右两边分别绘制,先向左绘制,再向右绘制。
el
{
//绘制矩形的左半边
if ( nLastWidth < rc.left && rc.left <= nCurrWidth )
{
x += (rc.left-nLastWidth);
//逐个处理该图像⾏的每个像素
for ( INT nCheck = 0; nCheck < nCurrWidth-rc.left; nCheck++ )
{
//解析选择的颜⾊的BGR分量
wPixel  = wChooColor;
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);
/
/解析源像素的BGR分量
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);
//计算源像素BGR分量的⽐率
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));
//计算出希望得到的像素的BGR分量的值
bBlueWantedColor = (BYTE)(((FLOAT)bBlueWantedColor*rBlueRate));
bGreenWantedColor = (BYTE)(((FLOAT)bGreenWantedColor*rGreenRate));
bRedWantedColor = (BYTE)(((FLOAT)bRedWantedColor*bRedRate));
//计算出的像素的BGR分量的值不可能⼤于相应分量的最⼤值
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);
//⽤逻辑与来构造表⽰⼀个像素的数据,并且直接写⼊表⾯内存。
//因为是绘制矩形的左半边,故表⾯每⾏的字节数(表⾯节距)要除以2即右移⼀位。
/
/正要绘制的表⾯像素的偏移量(字节) = 已经绘制的表⾯像素的⾏坐标(Y)* 表⾯的节距 + 已经绘制的表⾯像素的列坐标(X)*每像素字节数
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);
}
// 由中⼼向右处理
el if ( nLastWidth <= rc.right && rc.right < nCurrWidth )
{
for ( INT nCheck = 0; nCheck < rc.right-nLastWidth; nCheck++ )
{
wPixel  = wChooColor;
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 += nCntCopyWord;
}
el
{
for ( INT nCheck = 0; nCheck < nCntCopyWord; nCheck++ )
{
wPixel  = wChooColor;
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);

本文发布于:2023-06-05 17:18:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/874554.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:像素   图像   绘制   处理   矩形   数据
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图