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

📄 fstbitmap.cpp

📁 vc写的源程序,是关于游戏类的程序。调用了系统的很多API
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					{
						p++;
						WORD count;
						count = *p;
						p++;
						for (int j = 0; j < count; j++)
						{
							if (ew >= srcx)
							{
								if (ew < w)
								{
									pbmp++;
									left++;
								}
							}
							ew++;
						}
					}
					else if (*p == FST_LINE_END)
					{
						p++;
						if (left <= w)
						{
							int temp = w - left;
							pbmp += temp;
						}
						pbmp += size;
						break;
					}
					else if (*p == FST_END)
					{
						return;
					}
				}
			}
		}
	}
}

// 复制FST位图到BMP位图(Additive方式555)
void additive_fst_555(BMP *dest_bmp, int x, int y, FST_BMP *src_fst, int srcx, int srcy, int w, int h)
{
	put_message(dest_bmp == NULL || src_fst == NULL, 
		"错误,企图对不存在的位图进行操作。");
	_asm
	{
#include "clipblit.inc"
	}
	if (w <= 0 || h <= 0)
		return;
	if (w == src_fst->width && h == src_fst->height)
	{
		// 没有需要剪裁的部分
		DWORD offset_w;
		_asm
		{
			PUSH edi;
			PUSH esi;
			MOV ebx, dest_bmp; // 把dest_bmp.bit的地址保存在edi
			MOV edi, [ebx]BMP.bit;
			MOV edx, src_fst; // 把src_bmp.bit的地址保存在edi
			MOV esi, [edx]FST_BMP.bit;

			ADD edi, x;
			ADD edi, x;

			PUSH edx;
			MOV eax, y;
			IMUL [ebx]BMP.pitch_byte;
			ADD edi, eax;
			POP edx;

			MOV eax, [ebx]BMP.width;
			SUB eax, [edx]FST_BMP.width;
			SHL eax, 1;
			MOV offset_w, eax;

			MOV edx, [edx]FST_BMP.width;
			MOV ebx, 0;

_loop_line:
			LODSW;
			CMP ax, FST_PIXEL;
			JZ _pixel; // 不透明点处理
			CMP ax, FST_TRANS_COLOR;
			JZ _trans_color; // 透明点处理
			CMP ax, FST_LINE_END;
			JZ _line_end; // 行结束
			CMP ax, FST_END;
			JZ _bitblt_end; // FST文件结束
			JMP _bitblt_end;

_pixel:
			LODSW;
			MOV ecx, 0;
			MOV cx, ax;
			ADD ebx, ecx;
			PUSH ebx;
_pixel_loop:
			LODSW;
			MOV bx, [edi];
			AND ax, 0x7bdf;    // 0111 0111 1101 1111
			AND bx, 0x7bdf;
			ADD ax, bx;
			TEST ax, 0x20; // 10 0000
			JZ _bnc;
			OR ax, 0x1f;
_bnc:
			TEST ax, 0x400; // 100 0000 0000
			JZ _gnc;
			OR ax, 0x3e0;
_gnc:
			BTR ax, 15;
			JNC _rnc;
			OR ax, 0x7c00;
_rnc:
			STOSW;
			LOOP _pixel_loop;
			POP ebx;
			JMP _loop_line;

_trans_color:
			MOV eax, 0;
			LODSW;
			ADD edi, eax;
			ADD edi, eax;
			ADD ebx, eax;
			JMP _loop_line;

_line_end:
			MOV eax, edx;
			SUB eax, ebx;
			SHL eax, 1;
			ADD edi, eax;
			ADD edi, offset_w;
			MOV ebx, 0;
			JMP _loop_line;

_bitblt_end:
			POP esi;
			POP edi;
		}
	}
	else
	{
		// 有需要剪裁的
		int i;
		WORD *p = src_fst->bit, *pbmp = dest_bmp->bit;
		if (srcy > 0)
		{
			// 剪裁上面的
			for (i  = 0; i < srcy; i++)
			{
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						p += *p;
						p++;
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p += 2;
					}
					else if (*p = FST_LINE_END)
					{
						p++;
						break;
					}
					else if (*p == FST_END)
						return;
				}
			}
		}
		// 复制FST位图
		pbmp += y * dest_bmp->width;
		if (x >= 0)
			pbmp += x;
		int size = dest_bmp->width - w, ew;
		if (w == src_fst->width)
		{
			// 左右不须要剪裁
			for (i = 0; i < h; i++)
			{
				ew = 0;
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						_asm
						{
							PUSH edi;
							PUSH esi;
							MOV edi, pbmp;
							MOV esi, p;
							MOV ecx, 0;
							MOV cx, count;
_line_loopf:
							LODSW;
							MOV bx, [edi];
							AND ax, 0xf7df;    // 0111 0111 1101 1111
							AND bx, 0xf7df;
							ADC ax, bx;
							TEST ax, 0x20;
							JZ _bncf;
							OR ax, 0x1f;
_bncf:
							TEST ax, 0x400; // 100 0000 0000
							JZ _gncf;
							OR ax, 0x3e0;
_gncf:
							BTR ax, 15;
							JZ _rncf;
							OR ax, 0x7c00;
_rncf:
							STOSW;
							LOOP _line_loopf;
							POP esi;
							POP edi;
						}
						p += count;
						pbmp += count;
						ew += count;
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p++;
						pbmp += *p;
						ew += *p;
						p++;
					}
					else if (*p == FST_LINE_END)
					{
						p++;
						if (ew <= w)
						{
							int temp = w - ew;
							pbmp += temp;
						}
						pbmp += size;
						break;
					}
					else if (*p == FST_END)
					{
						return;
					}
				}
			}
		}
		else
		{
			// 左右须要剪裁
			for (i = 0; i < h; i++)
			{
				int left = 0;
				ew = 0;
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						for (int j = 0; j < count; j++)
						{
							if (ew >= srcx)
							{
								if (ew < w)
								{
									_asm
									{
										PUSH edi;
										PUSH esi;
										MOV edi, pbmp;
										MOV esi, p;
										LODSW;
										MOV bx, [edi];
										AND ax, 0xf7df;    // 0111 0111 1101 1111
										AND bx, 0xf7df;
										ADC ax, bx;
										TEST ax, 0x20;
										JZ _bncc;
										OR ax, 0x1f;
_bncc:
										TEST ax, 0x400; // 100 0000 0000
										JZ _gncc;
										OR ax, 0x3e0;
_gncc:
										BTR ax, 15;
										JNC _rncc;
										OR ax, 0x7c00;   // 111 1110 0000
_rncc:
										STOSW;
										POP esi;
										POP edi;
									}
									pbmp++;
									p++;
									left++;
								}
								else
									p++;
							}
							else
								p++;
							ew++;
						}
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						for (int j = 0; j < count; j++)
						{
							if (ew >= srcx)
							{
								if (ew < w)
								{
									pbmp++;
									left++;
								}
							}
							ew++;
						}
					}
					else if (*p == FST_LINE_END)
					{
						p++;
						if (left <= w)
						{
							int temp = w - left;
							pbmp += temp;
						}
						pbmp += size;
						break;
					}
					else if (*p == FST_END)
					{
						return;
					}
				}
			}
		}
	}
}

// 复制FST位图到BMP位图(Alpha方式)
void alpha_fst(BMP *dest_bmp, int x, int y, FST_BMP *src_fst, int srcx, int srcy, int w, int h)
{
	put_message(dest_bmp == NULL || src_fst == NULL, 
		"错误,企图对不存在的位图进行操作。");
	_asm
	{
#include "clipblit.inc"
	}
	if (w <= 0 || h <= 0)
		return;
	if (w == src_fst->width && h == src_fst->height)
	{
		// 没有需要剪裁的部分
		DWORD offset_w;
		_asm
		{
			PUSH edi;
			PUSH esi;
			MOV ebx, dest_bmp; // 把dest_bmp.bit的地址保存在edi
			MOV edi, [ebx]BMP.bit;
			MOV edx, src_fst; // 把src_bmp.bit的地址保存在edi
			MOV esi, [edx]FST_BMP.bit;

			ADD edi, x;
			ADD edi, x;

			PUSH edx;
			MOV eax, y;
			IMUL [ebx]BMP.pitch_byte;
			ADD edi, eax;
			POP edx;

			MOV eax, [ebx]BMP.width;
			SUB eax, [edx]FST_BMP.width;
			SHL eax, 1;
			MOV offset_w, eax;

			MOV edx, [edx]FST_BMP.width;
			MOV ebx, 0;

_loop_line:
			LODSW;
			CMP ax, FST_PIXEL;
			JZ _pixel; // 不透明点处理
			CMP ax, FST_TRANS_COLOR;
			JZ _trans_color; // 透明点处理
			CMP ax, FST_LINE_END;
			JZ _line_end; // 行结束
			CMP ax, FST_END;
			JZ _bitblt_end; // FST文件结束
			JMP _bitblt_end;

_pixel:
			LODSW;
			MOV ecx, 0;
			MOV cx, ax;
			ADD ebx, ecx;
			PUSH ebx;
_pixel_loop:
			LODSW;
			CALL alpha_pixel;
			LOOP _pixel_loop;
			POP ebx;
			JMP _loop_line;

_trans_color:
			MOV eax, 0;
			LODSW;
			ADD edi, eax;
			ADD edi, eax;
			ADD ebx, eax;
			JMP _loop_line;

_line_end:
			MOV eax, edx;
			SUB eax, ebx;
			SHL eax, 1;
			ADD edi, eax;
			ADD edi, offset_w;
			MOV ebx, 0;
			JMP _loop_line;

_bitblt_end:
			POP esi;
			POP edi;
		}
	}
	else
	{
		// 有需要剪裁的
		int i;
		WORD *p = src_fst->bit, *pbmp = dest_bmp->bit;
		if (srcy > 0)
		{
			// 剪裁上面的
			for (i  = 0; i < srcy; i++)
			{
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						p += *p;
						p++;
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p += 2;
					}
					else if (*p = FST_LINE_END)
					{
						p++;
						break;
					}
					else if (*p == FST_END)
						return;
				}
			}
		}
		// 复制FST位图
		pbmp += y * dest_bmp->width;
		if (x >= 0)
			pbmp += x;
		int size = dest_bmp->width - w, ew;
		if (w == src_fst->width)
		{
			// 左右不须要剪裁
			for (i = 0; i < h; i++)
			{
				ew = 0;
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						_asm
						{
							PUSH edi;
							PUSH esi;
							MOV edi, pbmp;
							MOV esi, p;
							MOV ecx, 0;
							MOV cx, count;
_line_loopf:
							LODSW;
							CALL alpha_pixel;
							LOOP _line_loopf;
							POP esi;
							POP edi;
						}
						p += count;
						pbmp += count;
						ew += count;
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p++;
						pbmp += *p;
						ew += *p;
						p++;
					}
					else if (*p == FST_LINE_END)
					{
						p++;
						if (ew <= w)
						{
							int temp = w - ew;
							pbmp += temp;
						}
						pbmp += size;
						break;
					}
					else if (*p == FST_END)
					{
						return;
					}
				}
			}
		}
		else
		{
			// 左右须要剪裁
			for (i = 0; i < h; i++)
			{
				int left = 0;
				ew = 0;
				while(TRUE)
				{
					if (*p == FST_PIXEL)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						for (int j = 0; j < count; j++)
						{
							if (ew >= srcx)
							{
								if (ew < w)
								{
									_asm
									{
										PUSH edi;
										PUSH esi;
										MOV edi, pbmp;
										MOV esi, p;
										LODSW;
										CALL alpha_pixel;
										POP esi;
										POP edi;
									}
									pbmp++;
									p++;
									left++;
								}
								else
									p++;
							}
							else
								p++;
							ew++;
						}
					}
					else if (*p == FST_TRANS_COLOR)
					{
						p++;
						WORD count;
						count = *p;
						p++;
						for (int j = 0; j < count; j++)
						{
							if (ew >= srcx)
							{
								if (ew < w)
								{
									pbmp++;
									left++;
								}
							}
							ew++;
						}
					}
					else if (*p == FST_LINE_END)
					{
						p++;
						if (left <= w)
						{
							int temp = w - left;
							pbmp += temp;
						}
						pbmp += size;
						break;
					}
					else if (*p == FST_END)
					{
						return;
					}
				}
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -