📄 vram.inc
字号:
{$IFNDEF vram}
{$DEFINE vram}
{$I RECT.INC}
{$IFDEF clipping}
{$I CLIP.INC}
{$ENDIF}
const
{methods of pasting}
mtNone =-1;
mtMovsd =-2;
mtTransparent =-3; {color 0 is transparent}
mtFlipX =-4;
mtFlipXTransparent=-5; {color 0 is transparent}
mtPalette =256;
{0..255 => semitransparency (0..transparent, 255..opaque)}
{otherwise - pointer to appropriate palette array}
procedure moveTransparent(var src;var dest;bytes:dword); assembler;
asm
mov ecx,bytes
jecxz @end
mov edi,dest
mov esi,src
shr ecx,1
shr ecx,1
jecxz @1_
mov edx,0FFh
@1:
push ecx
lodsd
mov ebx,[edi]
push edi
mov ecx,4
@1a:
mov edi,eax
and edi,edx
jnz @1b
mov edi,ebx
and edi,edx
or eax,edi
@1b:
rol edx,8
loop @1a
pop edi
stosd
pop ecx
loop @1
@1_:
xchg ecx,eax
mov ecx,3
and ecx,bytes
jecxz @end
@2:
lodsb
or eax,eax
jz @3
mov [edi],al
@3:
inc edi
loop @2
@end:
end; {moveTransparent}
procedure moveHalftransparent(var src;var dest;bytes:dword); assembler;
asm
mov esi,src
mov ecx,dest
jecxz @end
mov edi,ecx
mov ecx,bytes
jecxz @end
xor eax,eax
xor ebx,ebx
@1:
mov bl,[esi]
lodsb
add eax,ebx
shr eax,1
stosb
loop @1
@end:
end; {moveHalftransparent}
procedure moveSemitransparent(var src;var dest;bytes,transparency:dword); assembler;
asm
mov esi,src
mov ecx,dest
jecxz @end
mov edi,ecx
mov ecx,bytes
jecxz @end
mov edx,transparency
mov dh,dl
not dl
xor eax,eax
@1:
mov al,[edi]
mul dl
mov ebx,eax
lodsb
mul dh
add eax,ebx
mov al,ah
stosb
loop @1
@end:
end; {moveSemitransparent}
procedure moveFlipX(var src;var dest;bytes:dword); assembler;
asm
mov esi,src
mov edi,dest
or edi,edi
jz @end
mov ecx,bytes
jecxz @end
mov ebx,4
mov edx,ecx
add esi,ecx
sub esi,ebx
shr ecx,1
shr ecx,1
jecxz @2
@1:
mov eax,[esi]
sub esi,ebx
xchg ah,al
rol eax,16
xchg ah,al
stosd
loop @1
@2:
dec ebx
add esi,ebx
and edx,ebx
jz @end
dec ebx
@3:
lodsb
sub esi,ebx
stosb
dec edx
jnz @3
@end:
end; {moveFlipX}
procedure moveFlipXTransparent(var src;var dest;bytes:dword); assembler;
asm
mov esi,src
mov edi,dest
or edi,edi
jz @end
mov ecx,bytes
jecxz @end
add esi,ecx
dec esi
mov ebx,-2
xor eax,eax
@1:
lodsb
add esi,ebx
or eax,eax
jz @2
stosb
loop @1
jmp @end
@2:
inc edi
loop @1
@end:
end; {moveFlipXTransparent}
procedure pasteLine(s,d:pointer; size,method:longint);
var i:longint;
begin
if (d=nil) or (size=0) or (method=mtNone) or (method=0) then exit;
if (method=mtMovsd) or (method=mtPalette-1) then
move(s^,d^,size)
else if method=mtTransparent then
moveTransparent(s^,d^,size)
else if method=mtFlipX then
moveFlipX(s^,d^,size)
else if method=mtFlipXTransparent then
moveFlipXTransparent(s^,d^,size)
else if dword(method)<mtPalette-1 then
moveSemitransparent(s^,d^,size,method)
else
for i:=1 to byte(pointer(method)^) do
chgTo(s,d,i,byte(pointer(method+i)^),size);
end; {pasteLine}
{$ENDIF}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -