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

📄 rlebitmap.cpp

📁 游戏c++开发简例
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -