📄 hong_sprite.cpp
字号:
mov cx,[esi+2]; //load data num
add esi,4;
shr ecx,1;
loop_TR:
mov ax,[esi];
and eax,111001110011100b;
mov tmpclr,eax;
mov ax,[edi];
and eax,111001110011100b;
add eax,tmpclr;
shr eax,2;
mov [edi],ax;
add esi,2;
add edi,2;
loop loop_TR;
jmp loop_2;
exit_2:
add esi,2;
add edx,dDxSize;
dec bx;
jmp loop_1;
exit_1:
pop es;
};
}
void PutCompressedImageTrans(int x, int y, Spr *sp, WORD MSK)
{
int lx, rx, ty, by , IsC=0;
if( sp == NULL ) return;
if( sp->img == NULL ) return;
int xl = sp->xl;
int yl = sp->yl;
if( xl == 0 ) return;
if( yl == 0 ) return;
x -= sp->ox;
y -= sp->oy;
if( x >= SCREEN_WIDTH ) return;
else if( x + xl < 0 ) return;
if( y >= SCREEN_HEIGHT ) return;
else if( y + yl < 0 ) return;
rx = xl;
lx = 0;
ty = 0;
by = yl;
if( x + xl >= SCREEN_WIDTH )
{
rx -= x + xl - SCREEN_WIDTH;
IsC = 1;
}
if( x < 0 )
{
lx = 0 - x;
x = 0;
rx -= lx;
IsC = 1;
}
if( y + yl >= SCREEN_HEIGHT )
{
by -= y + yl - SCREEN_HEIGHT;
IsC = 1;
}
if( y < 0 )
{
ty = 0 - y;
y = 0;
by -= ty;
IsC = 1;
}
if( _PixelInfo.BitMaskR == 0x7C00)
{
if( IsC )
PutCmprsImgClipingTrans555( x, y, sp->img, g_DestBackBuf, lx, rx, ty, by, MSK);
else
PutCmprsImgNOTClipingTrans555( x, y, yl, sp->img, g_DestBackBuf, MSK);
}
else
{
if( IsC )
PutCmprsImgClipingTrans565( x, y, sp->img, g_DestBackBuf, lx, rx, ty, by, MSK);
else
PutCmprsImgNOTClipingTrans565( x, y, yl, sp->img, g_DestBackBuf, MSK);
}
return;
}
/////////////////////////////////////////////////////////////////////////// Put Sprite Transperensy..
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Put Sprite Normally...
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void PutCmprsImgCliping(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by)
{
int l;
LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
_asm{
mov ecx,rx;
shl ecx,1;
mov rx,ecx;
mov ecx,lx;
shl ecx,1;
mov lx,ecx;
}
_asm{
push es;
push ds;
pop es;
xor eax,eax;
mov esi,Stmp;
mov ecx,ty;
or ecx,ecx;
jz exit_1;
loop_1:
cmp word ptr[esi],0xffff;
jz exit_xxxx;
mov ax,[esi+2]
add esi,4;
add esi,eax;
jmp loop_1;
exit_xxxx:
add esi,2;
loop loop_1;
exit_1:
}
_asm{
mov ebx, by; //
or ebx,ebx;
jz exit_for1;
loop_for1:
xor edx,edx;
mov edi,Dtmp;
test lx,0xffff; //if(lx)
jz exit_if1;
loop_while1:
cmp word ptr[esi],0xffff; //while(*stmp != 0xffff)
jz exit_while1; //
add dx,[esi];
cmp edx,lx; //if(j>lx)
jle jmp_if1; //
sub edx,lx; //j-=lx
add edi,edx; //dtmp+=j
jmp jmp_0416;//****************************************************
jmp_if1:///////////////////////////////////////
mov ax,[esi + 2];
add esi,4;
add edx,eax;
add esi,eax; //
cmp edx,lx; //
jle loop_while1;
sub edx,lx;
sub esi,edx;
mov eax,edx;
xor edx,edx;
jmp jmp_0429; //4.29
exit_while1: //end while(*stmp != 0xffff)*/
exit_if1: //end if(lx)
loop_while2:
cmp word ptr[esi],0xffff;
jz exit_while2;
movzx eax,word ptr[esi];
add edi,eax; //dtmp+=*stmp
add dx,ax; //j+=*stmp
jmp_0416:
mov ax,[esi + 2];
add esi,4;
jmp_0429:
mov ecx,eax; //l=k=*stmp
mov l,eax;
add eax,edx;
cmp eax, rx;
jle exit_if0;
cmp edx, rx;
jg exit_if0;
mov ecx, rx;
sub ecx,edx;
exit_if0:
cmp edx, rx;
jg else_if;
add edx, l; //j+=l;
sub l,ecx; //l-k;
shr ecx,2; //move DATA
jnc Next2_1; //
movsw; //
Next2_1: //
rep movsd; //
add esi,l;
jmp loop_while2;
else_if:
add esi,l;
ext_loop:
cmp word ptr[esi],0xffff;
jz ext;
mov ax,[esi+2];
add esi,4;
add esi,eax;
jmp ext_loop;
ext:
exit_while2:
mov eax, dDxSize;
add esi,2;
add dword ptr Dtmp,eax;
dec ebx; //for(i=0;i<by;i++)
jnz loop_for1; //
exit_for1:
pop es;
};
}
void PutCmprsImgNOTCliping(int x, int y, int yl, LPVOID Stmp, LPVOID dest )
{
DWORD j;
LPVOID Dtmp = (LPVOID)( (char*)dest + y * dDxSize + (x * 2 ));
j = yl;
_asm{
push es;
push ds;
pop es;
mov edx,Dtmp;
mov esi,Stmp;
mov ebx,j;
xor eax,eax;
xor ecx,ecx;
loop_1:
or bx,bx; // if(SY==0)
jz exit_1;
mov edi,edx;
loop_2:
cmp word ptr[esi],0xffff;
jz exit_2;
mov ax,[esi];
add edi,eax; //0 skip
mov cx,[esi+2]; //load data num
add esi,4;
shr ecx,2; //move DATA
jnc Next2; //
movsw; //
Next2: //
rep movsd; //
jmp loop_2;
exit_2:
add esi,2;
add edx,dDxSize;
dec bx;
jmp loop_1;
exit_1:
pop es;
};
}
void PutCompressedImage(int x, int y, Spr *sp )
{
int lx, rx, ty, by , IsC=0;
if( sp == NULL ) return;
if( sp->img == NULL ) return;
int xl = sp->xl;
int yl = sp->yl;
if( xl == 0 ) return;
if( yl == 0 ) return;
x -= sp->ox;
y -= sp->oy;
if( x >= SCREEN_WIDTH ) return;
else if( x + xl < 0 ) return;
if( y >= SCREEN_HEIGHT ) return;
else if( y + yl < 0 ) return;
rx = xl;
lx = 0;
ty = 0;
by = yl;
if( x + xl >= (SCREEN_WIDTH-1) )
{
rx -= x + xl - (SCREEN_WIDTH-1);
IsC = 1;
}
if( x < 0 )
{
lx = 0 - x;
x = 0;
rx -= lx;
IsC = 1;
}
if( y + yl >= SCREEN_HEIGHT )
{
by -= y + yl - SCREEN_HEIGHT;
IsC = 1;
}
if( y < 0 )
{
ty = 0 - y;
y = 0;
by -= ty;
IsC = 1;
}
if( sp->img == NULL ) return;
if( IsC )
{
PutCmprsImgCliping( x, y, sp->img, g_DestBackBuf, lx, rx+1, ty, by);
}
else
{
PutCmprsImgNOTCliping( x, y, sp->yl, sp->img, g_DestBackBuf );
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
// Put Sprite Normally...
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void PutCmprsImgClipingOneColor(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by, WORD color)
{
int l;
LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
_asm{
mov ecx,rx;
shl ecx,1;
mov rx,ecx;
mov ecx,lx;
shl ecx,1;
mov lx,ecx;
}
_asm{
push es;
push ds;
pop es;
xor eax,eax;
mov esi,Stmp;
mov ecx,ty;
or ecx,ecx;
jz exit_1;
loop_1:
cmp word ptr[esi],0xffff;
jz exit_xxxx;
mov ax,[esi+2]
add esi,4;
add esi,eax;
jmp loop_1;
exit_xxxx:
add esi,2;
loop loop_1;
exit_1:
}
_asm{
mov ebx, by; //
or ebx,ebx;
jz exit_for1;
loop_for1:
xor edx,edx;
mov edi,Dtmp;
test lx,0xffff; //if(lx)
jz exit_if1;
loop_while1:
cmp word ptr[esi],0xffff; //while(*stmp != 0xffff)
jz exit_while1; //
add dx,[esi];
cmp edx,lx; //if(j>lx)
jle jmp_if1; //
sub edx,lx; //j-=lx
add edi,edx; //dtmp+=j
jmp jmp_0416;//****************************************************
jmp_if1:///////////////////////////////////////
mov ax,[esi + 2];
add esi,4;
add edx,eax;
add esi,eax; //
cmp edx,lx; //
jle loop_while1;
sub edx,lx;
sub esi,edx;
mov eax,edx;
xor edx,edx;
jmp jmp_0429; //4.29
exit_while1: //end while(*stmp != 0xffff)*/
exit_if1: //end if(lx)
loop_while2:
cmp word ptr[esi],0xffff;
jz exit_while2;
movzx eax,word ptr[esi];
add edi,eax; //dtmp+=*stmp
add dx,ax; //j+=*stmp
jmp_0416:
mov ax,[esi + 2];
add esi,4;
jmp_0429:
mov ecx,eax; //l=k=*stmp
mov l,eax;
add eax,edx;
cmp eax, rx;
jle exit_if0;
cmp edx, rx;
jg exit_if0;
mov ecx, rx;
sub ecx,edx;
exit_if0:
cmp edx, rx;
jg else_if;
mov ax, color
shl eax, 16
mov ax, color
add edx, l; //j+=l;
sub l,ecx; //l-k;
add esi, ecx;
sub edi, 2
add ecx, 4
shr ecx,2; //move DATA
jnc Next2_1; //
stosw; //
Next2_1: //
rep stosd; //
sub edi, 2
add esi,l;
jmp loop_while2;
else_if:
add esi,l;
ext_loop:
cmp word ptr[esi],0xffff;
jz ext;
mov ax,[esi+2];
add esi,4;
add esi,eax;
jmp ext_loop;
ext:
exit_while2:
mov eax, dDxSize;
add esi,2;
add dword ptr Dtmp,eax;
dec ebx; //for(i=0;i<by;i++)
jnz loop_for1; //
exit_for1:
pop es;
};
}
void PutCmprsImgNOTClipingOneColor(int x, int y, int yl, LPVOID Stmp, LPVOID dest, WORD color )
{
DWORD j;
LPVOID Dtmp = (LPVOID)( (char*)dest + y * dDxSize + (x * 2 ));
j = yl;
_asm{
push es;
push ds;
pop es;
mov edx,Dtmp;
mov esi,Stmp;
// mov ebx,j;
mov ax, color;
shl eax, 16;
mov ax, color;
xor ebx,ebx;
xor ecx,ecx;
loop_1:
cmp j,0; // if(SY==0)
jz exit_1;
mov edi,edx;
loop_2:
cmp word ptr[esi],0xffff;
jz exit_2;
mov bx,[esi];
add edi,ebx; //0 skip
mov cx,[esi+2]; //load data num
add esi,4;
add esi, ecx;
sub edi, 2
add ecx, 4;
shr ecx, 2;
jnc Next2; //
stosw; //
Next2: //
rep stosd; //
sub edi, 2
jmp loop_2;
exit_2:
add esi,2;
add edx,dDxSize;
sub j, 1;
jmp loop_1;
exit_1:
pop es;
};
}
void PutCompressedImageOneColor(int x, int y, Spr *sp, WORD color )
{
int lx, rx, ty, by , IsC=0;
int ey = SCREEN_HEIGHT - 128;
if( sp == NULL ) return;
if( sp->img == NULL ) return;
int xl = sp->xl;
int yl = sp->yl;
if( xl == 0 ) return;
if( yl == 0 ) return;
x -= sp->ox;
y -= sp->oy;
if( x >= SCREEN_WIDTH -1 ) return;
else if( x + xl < 1 ) return;
if( y >= ey ) return;
else if( y + yl < 0 ) return;
rx = xl;
lx = 1;
ty = 0;
by = yl;
if( x + xl >= SCREEN_WIDTH-1)
{
rx -= x + xl - (SCREEN_WIDTH-1);
IsC = 1;
}
if( x < 1 )
{
lx = 1 - x;
x = 1;
rx -= lx;
IsC = 1;
}
if( y + yl >= SCREEN_HEIGHT )
{
by -= y + yl - ey;
IsC = 1;
}
if( y < 0 )
{
ty = 0 - y;
y = 0;
by -= ty;
IsC = 1;
}
if( IsC )
{
PutCmprsImgClipingOneColor( x, y, sp->img, g_DestBackBuf, lx, rx, ty, by, color);
}
else
{
PutCmprsImgNOTClipingOneColor( x, y, sp->yl, sp->img, g_DestBackBuf, color );
}
}
///////////////////////////////////////////////////////////////////////////// Put Sprite Normally...
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
//
//
//////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////
void PutCmprsImgVoidCliping(int x, int y, LPVOID Stmp, LPVOID dest, int lx, int rx, int ty, int by)
{
int l;
LPVOID Dtmp = (LPVOID)((char*)dest + y * dDxSize + (x * 2));
_asm{
mov ecx,rx;
shl ecx,1;
mov rx,ecx;
mov ecx,lx;
shl ecx,1;
mov lx,ecx;
}
_asm{
push es;
push ds;
pop es;
xor eax,eax;
mov esi,Stmp;
mov ecx,ty;
or ecx,ecx;
jz exit_1;
loop_1:
cmp word ptr[esi],0xffff;
jz exit_xxxx;
mov ax,[esi+2]
add esi,4;
add esi,eax;
jmp loop_1;
exit_xxxx:
add esi,2;
loop loop_1;
exit_1:
}
_asm{
mov ebx, by; //
or ebx,ebx;
jz exit_for1;
loop_for1:
xor edx,edx;
mov edi,Dtmp;
test lx,0xffff; //if(lx)
jz exit_if1;
loop_while1:
cmp word ptr[esi],0xffff; //while(*stmp != 0xffff)
jz exit_while1; //
add dx,[esi];
cmp edx,lx; //if(j>lx)
jle jmp_if1; //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -