⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asl_bitmap.cpp

📁 泡泡堂单机版(含ASL游戏引擎源码 泡泡堂单机版(含ASL游戏引擎源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			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 + -