📄 blit.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 + -