📄 asl_bitmap.cpp
字号:
por mm0, mm1 // mm0: 0rrrrrgg gggbbbbb
movq [edi], mm0 // 处理结果给目的地址
add edi, 8 // 目的指针加8
loop _next // 循环处理
emms // 清空MMX
}
pdst += nPitch;
psrc += m_nPitch;
}
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::SetBlock()
// 功 能: 设置位图的拆分块, 双目绘图函数可以指定块来绘制
// 参 数: [numX] - 横向分块数
// [numY] - 纵向分块数
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::SetBlock(int numX, int numY)
{
ASSERT(numX >= 1 && numY >= 1);
m_nBlockX = numX;
m_nBlockY = numY;
m_nBlockW = m_nWidth / m_nBlockX;
m_nBlockH = m_nHeight / m_nBlockY;
}
/******************************************************************************
* 双目绘图函数(将本位图绘制到另一个位图)
*
* 注1: 本段所有函数均根据是否设置颜色键自动处理, 即设置了颜色键的按有颜色键绘
* 制, 没有设颜色键的按无颜色键绘制
*
* 注2: 对于位图可以均匀分为几行几列的, 可以用SetBlock()函数设置行列数, 这样绘
* 制的时候可以指定块号或行列号来绘制位图的某块, 方便8向行走图等的操作
******************************************************************************/
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::Draw()
// 功 能: 将本位图以普通方式绘制到目标位图上(按块号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nSeq] - 块号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::Draw(ASLBitmap &bmDest, int xDest, int yDest, int nSeq) const
{
Draw(bmDest, xDest, yDest, nSeq / m_nBlockX, nSeq % m_nBlockX);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::Draw()
// 功 能: 将本位图以普通方式绘制到目标位图上(按行列号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [row] - 块行号
// [col] - 块列号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::Draw(ASLBitmap &bmDest, int xDest, int yDest,
int row, int col) const
{
ASSERT(row >= 0 && row < m_nBlockY && col >= 0 && col < m_nBlockX);
RECT rect;
rect.left = col * m_nBlockW;
rect.right = rect.left + m_nBlockW;
rect.top = row * m_nBlockH;
rect.bottom = rect.top + m_nBlockH;
Draw(bmDest, xDest, yDest, rect);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::Draw()
// 功 能: 将本位图以普通方式绘制到目标位图上(用户指定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [*rcSrc] - 源绘制区矩形, 为空时表示整张位图
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::Draw(ASLBitmap &bmDest, int xDest, int yDest,
const RECT &rcSrc) const
{
ASSERT(m_hBitmap != NULL);
ASSERT(bmDest.GetHandle() != NULL);
// 对绘图位置进行调整
xDest -= m_ptHot.x;
yDest -= m_ptHot.y;
RECT rect = rcSrc;
if (EqualRect(&rect, &DEFAULTRECT))
{
rect = m_rcClip;
}
if (!_AdjustDrawPos(bmDest, xDest, yDest, rect))
{
return;
}
const int nWidth = rect.right - rect.left;
const int nHeight = rect.bottom - rect.top;
if (nWidth <= 0 || nHeight <= 0)
{
return;
}
BYTE *psrc = (BYTE*)m_pData + m_nPitch * rect.top + rect.left * 2;
BYTE *pdst = (BYTE*)bmDest.m_pData + bmDest.m_nPitch * yDest + xDest * 2;
if (m_nColorKey < 0)
{
for (int i = 0; i < nHeight; ++i)
{
asmDrawPlain(psrc, pdst, nWidth);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
else
{
const COLOR clr = RGB16(m_nColorKey);
const __int64 clr64 = Bit16To64(clr);
for (int i = 0; i < nHeight; ++i)
{
asmDrawColorkey(psrc, pdst, nWidth, clr64);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlpha()
// 功 能: 将本位图以半透明方式绘制到目标位图上(按块号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nAlpha] - 透明度, 0(全透明) - 256(完全不透明)
// [nSeq] - 块号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlpha(ASLBitmap &bmDest, int xDest, int yDest, int nAlpha,
int nSeq) const
{
DrawAlpha(bmDest, xDest, yDest, nAlpha, nSeq / m_nBlockX, nSeq % m_nBlockX);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlpha()
// 功 能: 将本位图以半透明方式绘制到目标位图上(按行列号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nAlpha] - 透明度, 0(全透明) - 256(完全不透明)
// [row] - 块行号
// [col] - 块列号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlpha(ASLBitmap &bmDest, int xDest, int yDest, int nAlpha,
int row, int col) const
{
ASSERT(row >= 0 && row < m_nBlockY && col >= 0 && col < m_nBlockX);
RECT rect;
rect.left = col * m_nBlockW;
rect.right = rect.left + m_nBlockW;
rect.top = row * m_nBlockH;
rect.bottom = rect.top + m_nBlockH;
DrawAlpha(bmDest, xDest, yDest, nAlpha, rect);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlpha()
// 功 能: 将本位图以半透明方式绘制到目标位图上(用户指定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nAlpha] - 透明度, 0(全透明) - 256(完全不透明)
// [*rcSrc] - 源绘制区矩形, 为空时表示整张位图
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlpha(ASLBitmap &bmDest, int xDest, int yDest, int nAlpha,
const RECT &rcSrc) const
{
ASSERT(m_hBitmap != NULL);
ASSERT(bmDest.GetHandle() != NULL);
// 对绘图位置进行调整
xDest -= m_ptHot.x;
yDest -= m_ptHot.y;
RECT rect = rcSrc;
if (EqualRect(&rect, &DEFAULTRECT))
{
rect = m_rcClip;
}
if (!_AdjustDrawPos(bmDest, xDest, yDest, rect))
{
return;
}
const int nWidth = rect.right - rect.left;
const int nHeight = rect.bottom - rect.top;
if (nWidth <= 0 || nHeight <= 0)
{
return;
}
// 修正nAlpha值
if (nAlpha < 0)
{
nAlpha = 0;
}
else if (nAlpha > 256)
{
nAlpha = 256;
}
// 优化nAlpha为0和256时的绘制
if (nAlpha == 0)
{
return;
}
else if (nAlpha == 256)
{
Draw(bmDest, xDest, yDest, rect);
}
else
{
BYTE *psrc = (BYTE*)m_pData + m_nPitch * rect.top + rect.left * 2;
BYTE *pdst = (BYTE*)bmDest.m_pData + bmDest.m_nPitch * yDest + xDest * 2;
if (m_nColorKey < 0)
{
const __int64 alpha64 = Bit16To64(nAlpha >> 3);
for (int i = 0; i < nHeight; ++i)
{
asmAlphaPlain(psrc, pdst, nWidth, alpha64);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
else
{
const COLOR clr = RGB16(m_nColorKey);
const __int64 clr64 = Bit16To64(clr);
const __int64 alpha64 = Bit16To64(nAlpha >> 3);
for (int i = 0; i < nHeight; ++i)
{
asmAlphaColorkey(psrc, pdst, nWidth, alpha64, clr64);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
}
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaFast()
// 功 能: 将本位图以快速半透明方式绘制到目标位图上(按块号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nSeq] - 块号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlphaFast(ASLBitmap &bmDest, int xDest, int yDest,
int nSeq) const
{
DrawAlphaFast(bmDest, xDest, yDest, nSeq / m_nBlockX, nSeq % m_nBlockX);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaFast()
// 功 能: 将本位图以快速半透明方式绘制到目标位图上(按行列号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [row] - 块行号
// [col] - 块列号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlphaFast(ASLBitmap &bmDest, int xDest, int yDest,
int row, int col) const
{
ASSERT(row >= 0 && row < m_nBlockY && col >= 0 && col < m_nBlockX);
RECT rect;
rect.left = col * m_nBlockW;
rect.right = rect.left + m_nBlockW;
rect.top = row * m_nBlockH;
rect.bottom = rect.top + m_nBlockH;
DrawAlphaFast(bmDest, xDest, yDest, rect);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaFast()
// 功 能: 将本位图以快速半透明方式绘制到目标位图上(用户指定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [*rcSrc] - 源绘制区矩形, 为空时表示整张位图
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlphaFast(ASLBitmap &bmDest, int xDest, int yDest,
const RECT &rcSrc) const
{
ASSERT(m_hBitmap != NULL);
ASSERT(bmDest.GetHandle() != NULL);
// 对绘图位置进行调整
xDest -= m_ptHot.x;
yDest -= m_ptHot.y;
RECT rect = rcSrc;
if (EqualRect(&rect, &DEFAULTRECT))
{
rect = m_rcClip;
}
if (!_AdjustDrawPos(bmDest, xDest, yDest, rect))
{
return;
}
const int nWidth = rect.right - rect.left;
const int nHeight = rect.bottom - rect.top;
if (nWidth <= 0 || nHeight <= 0)
{
return;
}
BYTE *psrc = (BYTE*)m_pData + m_nPitch * rect.top + rect.left * 2;
BYTE *pdst = (BYTE*)bmDest.m_pData + bmDest.m_nPitch * yDest + xDest * 2;
if (m_nColorKey < 0)
{
for (int i = 0; i < nHeight; ++i)
{
asmFastPlain(psrc, pdst, nWidth);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
else
{
const COLOR clr = RGB16(m_nColorKey);
const __int64 clr64 = Bit16To64(clr);
for (int i = 0; i < nHeight; ++i)
{
asmFastColorkey(psrc, pdst, nWidth, clr64);
psrc += m_nPitch;
pdst += bmDest.m_nPitch;
}
}
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaChannel()
// 功 能: 将本位图以nAlpha通道方式绘制到目的位图上(按块号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [nSeq] - 块号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlphaChannel(ASLBitmap &bmDest, int xDest, int yDest,
int nSeq) const
{
DrawAlphaChannel(bmDest, xDest, yDest, nSeq / m_nBlockX, nSeq % m_nBlockX);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaChannel()
// 功 能: 将本位图以nAlpha通道方式绘制到目的位图上(按行列号确定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [row] - 块行号
// [col] - 块列号
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
void ASLBitmap::DrawAlphaChannel(ASLBitmap &bmDest, int xDest, int yDest,
int row, int col) const
{
ASSERT(row >= 0 && row < m_nBlockY && col >= 0 && col < m_nBlockX);
RECT rect;
rect.left = col * m_nBlockW;
rect.right = rect.left + m_nBlockW;
rect.top = row * m_nBlockH;
rect.bottom = rect.top + m_nBlockH;
DrawAlphaChannel(bmDest, xDest, yDest, rect);
}
//-----------------------------------------------------------------------------
// 函数名: ASLBitmap::DrawAlphaChannel()
// 功 能: 将本位图以nAlpha通道方式绘制到目的位图上(用户指定源绘制区)
// 参 数: [&bmDest] - 目标位图
// [xDest] - 目标x坐标
// [yDest] - 目标y坐标
// [*rcSrc] - 源绘制区矩形, 为空时表示整张位图
// 返回值: [void] - 无
//-----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -