📄 rlebitmap.cpp
字号:
mov esi, [ecx];
mov edi, [eax]Bitmap.line;
mov ecx, src;
mov edx, x;
mov edi, [edi+4*ebx];
shl edx, 1;
mov ecx, [ecx]src.width;
add edi, edx;
cmp w, ecx;
jl clip;
mov ebx, h;
mov edx, edi;
noclip_blit:
lodsw;
test ax, ax;
jz next_line;
movzx ecx, al;
cmp ax, RLE_TRANS;
jge noclip_trans;
//非透明
shr ecx, 1;
jnc noclip_even;
movsw;
noclip_even:
shr ecx, 1;
jnc noclip_quard;
movsd;
noclip_quard:
test ecx, ecx;
jz noclip_blit;
movq mm0, [esi];
dec ecx;
add esi, 8;
movq [edi], mm0;
add edi, 8;
jmp noclip_quard;
noclip_trans:
lea edi, [edi+2*ecx];
jmp noclip_blit;
next_line:
add edx, pitch;
dec ebx;
mov edi, edx;
jnz noclip_blit;
jmp blit_end;
//需要剪裁
clip:
mov edx, sx; //edx剪裁后的左边界
mov eax, w;
mov dptr, edi;
add sx, eax; //sx剪裁后的右边界
xor ebx, ebx; //ebx源图当前像素位置
clip_blit:
lodsw;
test ax, ax;
jz line_end;
cmp ebx, sx; //sx是右边界
jge line_end;
movzx ecx, al;
cmp ax, RLE_TRANS;
jl clip_pixels;
cmp ebx, edx; //透明或轮廓
jge l1;
add ebx, ecx;
mov eax, ebx;
sub eax, edx;
js clip_blit;
lea edi, [edi+2*eax];
jmp clip_blit;
l1:
add ebx, ecx;
lea edi, [edi+2*ecx];
jmp clip_blit;
clip_pixels:
mov eax, edx;
cmp ebx, edx;
jge l2; //超过左边界
sub eax, ebx;
cmp eax, ecx;
jle l3;
mov eax, ecx;
l3:
lea esi, [esi+2*eax];
add ebx, eax;
sub ecx, eax;
jz clip_blit; //仍未超过左边界
l2:
mov eax, sx; //sx是右边界
sub eax, ebx;
cmp eax, ecx;
jle l4;
mov eax, ecx;
l4:
add ebx, ecx;
shr eax, 1; //copy pixels
jnc clip_even;
movsw;
clip_even:
shr eax, 1;
jnc clip_quard;
movsd;
clip_quard:
test eax, eax;
jz clip_blit;
movq mm0, [esi];
dec eax;
add esi, 8;
movq [edi], mm0;
add edi, 8;
jmp clip_quard;
line_end:
mov ebx, sline;
mov eax, dptr;
add ebx, 4;
add eax, pitch;
mov esi, [ebx];
mov dptr, eax;
mov sline, ebx;
mov edi, eax;
xor ebx, ebx;
dec h;
jnz clip_blit;
blit_end:
emms;
}
}
//with outline
void RleBitmapBlitOl( Bitmap* dest, int x, int y, RleBitmap* src )
{
RLE_CLIP;
int pitch, dptr;
char** sline = &(src->line[sy]);
pitch = dest->pitch;
__asm{
mov ebx, y;
cld;
mov ecx, sline;
mov eax, dest;
mov esi, [ecx];
mov edi, [eax]Bitmap.line;
mov ecx, src;
mov eax, RLE_OUTLINECOLOR;
mov edx, x;
movd mm0, eax;
mov edi, [edi+4*ebx];
movq mm1, mm0;
shl edx, 1;
psllq mm0, 32;
mov ecx, [ecx]src.width;
por mm0, mm1;
add edi, edx;
cmp w, ecx;
jl clip;
cmp x, 1;
jl clip;
mov ebx, h;
mov edx, edi;
noclip_blit:
lodsw;
test ax, ax;
jz next_line;
movzx ecx, al;
and ax, 0xff00;
cmp ax, RLE_TRANS;
jg noclip_outline;
je noclip_trans;
//非透明
cmp word ptr [esi], RLE_SHADOWCOLOR;
je noclip_no_lOl;
mov word ptr [edi-2], RLE_OUTLINECOLOR; //左轮廓点
noclip_no_lOl:
shr ecx, 1;
jnc noclip_even;
movsw;
noclip_even:
shr ecx, 1;
jnc noclip_quard;
movsd;
noclip_quard:
test ecx, ecx;
jz noclip_rOl;
movq mm1, [esi];
dec ecx;
add esi, 8;
movq [edi], mm1;
add edi, 8;
jmp noclip_quard;
noclip_rOl: //右轮廓点
cmp word ptr [edi-2], RLE_SHADOWCOLOR;
je noclip_blit;
mov word ptr [edi], RLE_OUTLINECOLOR;
jmp noclip_blit;
//透明
noclip_trans:
lea edi, [edi+2*ecx];
jmp noclip_blit;
//画轮廓
noclip_outline:
mov eax, RLE_OUTLINECOLOR;
shr ecx, 1;
jnc noclip_oleven;
stosw;
noclip_oleven:
shr ecx, 1;
jnc noclip_olquard;
stosd;
noclip_olquard:
test ecx, ecx;
jz noclip_blit;
movq [edi], mm0;
dec ecx;
add edi, 8;
jmp noclip_olquard;
next_line:
add edx, pitch;
dec ebx;
mov edi, edx;
jnz noclip_blit;
jmp blit_end;
//需要剪裁
clip:
mov edx, sx; //edx剪裁后的左边界
mov eax, w;
mov dptr, edi;
add sx, eax; //sx剪裁后的右边界
xor ebx, ebx; //ebx源图当前像素位置
clip_blit:
lodsw;
test ax, ax;
jz line_end;
cmp ebx, sx; //sx是右边界
jge line_end;
movzx ecx, al;
//and ax, 0xff00;
cmp ah, RLE_TRANS >> 8;
jl clip_pixels;
jg clip_outline;
cmp ebx, edx; //透明
jge l1;
add ebx, ecx;
mov eax, ebx;
sub eax, edx;
js clip_blit;
lea edi, [edi+2*eax];
jmp clip_blit;
l1:
add ebx, ecx;
lea edi, [edi+2*ecx];
jmp clip_blit;
clip_outline: //轮廓
mov eax, ebx;
cmp ebx, edx;
jge ol1;
mov w, ebx; //暂存
add eax, ecx;
sub eax, edx;
jns ol0;
add ebx, ecx;
jmp clip_blit;
ol0:
mov ecx, eax;
mov ebx, edx;
ol1:
mov eax, sx;
sub eax, ebx;
cmp eax, ecx;
jge ol2;
mov ecx, eax;
ol2:
add ebx, ecx;
mov eax, RLE_OUTLINECOLOR;
shr ecx, 1;
jnc ol3;
stosw;
ol3:
repnz stosd;
jmp clip_blit;
clip_pixels:
mov eax, edx;
cmp ebx, edx;
jle l2; //未超过左边界
cmp [esi], RLE_SHADOWCOLOR;
je l4;
mov word ptr [edi-2], RLE_OUTLINECOLOR;
jmp l4;
l2:
sub eax, ebx; //未超过左边界
cmp eax, ecx;
jle l3;
mov eax, ecx;
l3:
lea esi, [esi+2*eax];
add ebx, eax;
sub ecx, eax;
jz clip_blit; //仍未超过左边界
l4:
mov eax, sx; //sx是右边界
sub eax, ebx;
cmp eax, ecx;
jle l5;
mov eax, ecx;
cmp word ptr [esi+2*ecx-2], RLE_SHADOWCOLOR;
je l5;
mov word ptr [edi+2*ecx], RLE_OUTLINECOLOR;
l5:
add ebx, ecx;
shr eax, 1; //copy pixels
jnc clip_even;
movsw;
clip_even:
shr eax, 1;
jnc clip_quard;
movsd;
clip_quard:
test eax, eax;
jz clip_blit;
movq mm0, [esi];
dec eax;
add esi, 8;
movq [edi], mm0;
add edi, 8;
jmp clip_quard;
// jmp clip_blit;
line_end:
mov ebx, sline;
mov eax, dptr;
add ebx, 4;
add eax, pitch;
mov esi, [ebx];
mov dptr, eax;
mov sline, ebx;
mov edi, eax;
xor ebx, ebx;
dec h;
jnz clip_blit;
blit_end:
emms;
}
}
static RleBitmap *test;
void initRleBitmap( void )
{
Bitmap *bmp = LoadPicture( "pic\\test.tga" );
if( bmp == NULL )
return;
test = CreateRleBitmap( bmp, 1 );
if( test == NULL )
return;
SaveRleBitmap( "pic\\test.rle", test );
delete test;
test = LoadRleBitmap( "pic\\test.rle" );
if( test == NULL )
;//FailMsg( "rlebmp" );
}
void testRleBitmap( void )
{
/* RleBitmapBlitOl( backScreen, 550, -40, test );
RleBitmapBlitOl( backScreen, 560, 100, test );
RleBitmapBlitOl( backScreen, 670, 200, test );
RleBitmapBlitOl( backScreen, 580, 450, test );
RleBitmapBlitOl( backScreen, -50, -50, test );*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -