?? 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 + -