[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
> 1) I want to write some fast sprite-routines, which can put a sprite EXCEPT
> all pixels with colour 0. The reason is obvious I think (hope :-). But this
> condition requires a compare for each pixel, which slows the routine down f
> too much. Can this be resolved?
I don't know how fast your is, but the following code is pretty darn fast.
It may actually be just as fast as a regular putimage because it doens't have
to send black colors to the vid memory. There are a couple words of warning,
however. The following code will only work for 320x200x256 mode and was
written with a specific getimage format in mind. The format is simple
(xsize:word,ysize:word,image data), but may be different than TP's getimage.
It's all nice and confusing assembler, but it does work effectively.
One last thing: CurBuf is the location of where the image is to be sent. If
you want it sent to the vidmem, set CurBuf := ptr($A000,$0);
}
Procedure PutTransparent(x, y : integer; ImagePtr : pointer; tcolor : byte);
{ Similar to PutImage, but if the color is tcolor, it is not plotted }
label jump1,jump2,jump3,jump4;
var
Addr : word;
cols : word;
bcolor : byte;
begin
Addr := x + (y shl 8) + (y shl 6);
asm
push ds
les di, CurBuf
add di, Addr
lds si, ImagePtr
lodsw
mov dx, ax { image width }
lodsw
mov bx, ax { image height }
jump1:
mov cols,dx
jump2:
mov ax, 0
lodsb
mov bcolor, al
xor al, tcolor
not al
inc ax
shr ax,8
inc ax
mov cx,ax
loop jump3
mov al,bcolor
stosb
mov cx,5
loop jump4
jump3:
inc di
jump4:
mov cx,cols
dec cols
loop jump2
add di, SW
sub di, dx
dec bx
jnz jump1
pop ds
end
end;
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]