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

📄 blit.cpp

📁 vc写的源程序,是关于游戏类的程序。调用了系统的很多API
💻 CPP
字号:
#include "graphics.h"

// 清空一个位图为指定颜色
void clrscr_bitmap(BMP *bmp, WORD color)
{
	put_message(bmp == NULL, 
		"错误,企图对不存在的位图进行操作。");
	DWORD dcolor = (DWORD)color;
	dcolor <<= 16;
	dcolor |= (DWORD)color;
	_asm
	{
		PUSH edi;
		MOV ebx, bmp;                    // 将bmp的地址装入ebx寄存器
		MOV edi, [ebx]BMP.bit;
		CLD;
		TEST [ebx]BMP.width, 1;
		JNZ _is_odd;
		MOV ecx, [ebx]BMP.surface_dword;
		MOV eax, dcolor;        // 把将要设置的颜色值装入eax
		REP STOSD;                       // 填充指定的内存
		JMP _clrscr_end;
		ALIGN 4

_is_odd:
		MOV ecx, [ebx]BMP.surface_word;
		MOV ax, color;                   // 把将要设置的颜色值装入eax
		CLD;
		REP STOSW;                       // 填充指定的内存
		ALIGN 4

_clrscr_end:
		POP edi;
	}
}

// 将一个位图复制到另一个位图(支持剪裁)
void nomask_bitblt_bitmap(BMP *dest_bmp, int x, int y, BMP *src_bmp, int srcx, int srcy, int w, int h)
{
	put_message(dest_bmp == NULL || src_bmp == NULL, 
		"错误,企图对不存在的位图进行操作。");
	_asm
	{
	 	PUSH edi;
		PUSH esi;
#include "clipblit.inc"
		MOV ebx, dest_bmp; // 把dest_bmp.bit的地址保存在edi
		MOV edi, [ebx]BMP.bit;
		MOV edx, src_bmp; // 把src_bmp.bit的地址保存在edi
		MOV esi, [edx]BMP.bit;

		SAL x, 1;
		ADD edi, x;
		SAL srcx, 1;
		ADD esi, srcx;

		MOV eax, srcy;
		IMUL [edx]BMP.pitch_byte;
		ADD esi, eax;
		MOV eax, y;
		IMUL [ebx]BMP.pitch_byte;
		ADD edi, eax;
		TEST w, 1;
		JNZ _is_odd;
		JMP _no_odd;
		ALIGN 4

_is_odd:
		MOV edx, src_bmp; // 把src_bmp.bit的地址保存在edi
		MOV ebx, [ebx]BMP.width;
		SUB ebx, w;
		SAL ebx, 1;
		MOV edx, [edx]BMP.width;
		SUB edx, w;
		SAL edx, 1;

		CLD;
		MOV ecx, h;
		ALIGN 4

_odd_loop:
		MOV eax, ecx;
		MOV ecx, w;
		REP MOVSW;
		ADD esi, edx;
		ADD edi, ebx;
		MOV ecx, eax;
		LOOP _odd_loop;
		jMP _bitblt_end;
		ALIGN 4

_no_odd:
		MOV edx, src_bmp; // 把src_bmp.bit的地址保存在edi
		MOV ebx, [ebx]BMP.width;
		SUB ebx, w;
		SAL ebx, 1;
		MOV edx, [edx]BMP.width;
		SUB edx, w;
		SAL edx, 1;
		SAR w, 1;
		CLD;
		MOV ecx, h;
		ALIGN 4

_no_odd_loop:
		MOV eax, ecx;
		MOV ecx, w;
		REP MOVSD;
		ADD esi, edx;
		ADD edi, ebx;
		MOV ecx, eax;
		LOOP _no_odd_loop;
		ALIGN 4

_bitblt_end:
		POP esi;
		POP edi;
	}
}

// 将一个位图透明复制到另一个位图(支持剪裁)
void mask_bitblt_bitmap(BMP *dest_bmp, int x, int y, BMP *src_bmp, int srcx, int srcy, int w, int h)
{
	put_message(dest_bmp == NULL || src_bmp == NULL, 
		"错误,企图对不存在的位图进行操作。");
	WORD transcolor;
	_asm
	{
		PUSH edi;
		PUSH esi;
#include "clipblit.inc"
		MOV ebx, dest_bmp; // 把dest_bmp.bit的地址保存在edi
		MOV edi, [ebx]BMP.bit;
		MOV edx, src_bmp; // 把src_bmp.bit的地址保存在edi
		MOV esi, [edx]BMP.bit;
		MOV ax, [edx]BMP.colorkey;
		MOV transcolor, ax;
		SAL x, 1;
		ADD edi, x;
		SAL srcx, 1;
		ADD esi, srcx;

		MOV eax, srcy;
		IMUL [edx]BMP.pitch_byte;
		ADD esi, eax;
		MOV eax, y;
		IMUL [ebx]BMP.pitch_byte;
		ADD edi, eax;

		MOV edx, src_bmp; // 把src_bmp.bit的地址保存在edi
		MOV ebx, [ebx]BMP.width;
		SUB ebx, w;
		SAL ebx, 1;
		MOV edx, [edx]BMP.width;
		SUB edx, w;
		SAL edx, 1;

		CLD;
		MOV ecx, h;
		ALIGN 4

// 奇数行的处理
_next_line:
		MOV h, ecx;
		MOV ecx, w;
		ALIGN 4

_line_loop:
		LODSW;
		CMP ax, transcolor; // 判断是否透明色
		JE _skip_pixel;
		STOSW;
		JMP _do_line_loop;
		ALIGN 4

_skip_pixel:
		ADD edi, 2;
_do_line_loop:
		LOOP _line_loop;

		ADD esi, edx;
		ADD edi, ebx;
		MOV ecx, h;
		LOOP _next_line;
		JMP _bitblt_end;
		ALIGN 4

_bitblt_end:
		POP esi;
		POP edi;
	}
}

void nomask_draw_bitmap(BMP *dest_bmp, int x, int y, BMP *src_bmp)
{
	nomask_bitblt_bitmap(dest_bmp, x, y, src_bmp, 0, 0, src_bmp->width, src_bmp->height);
}

void mask_draw_bitmap(BMP *dest_bmp, int x, int y, BMP *src_bmp)
{
	mask_bitblt_bitmap(dest_bmp, x, y, src_bmp, 0, 0, src_bmp->width, src_bmp->height);
}

⌨️ 快捷键说明

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