[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;

  Addr : word;
  cols : word;
  bcolor : byte;

  Addr := x + (y shl 8) + (y shl 6);

    push ds
    les di, CurBuf
    add di, Addr
    lds si, ImagePtr
    mov dx, ax                         { image width }
    mov bx, ax                         { image height }

    mov cols,dx

      mov ax, 0
      mov bcolor, al
      xor al, tcolor
      not al
      inc ax
      shr ax,8
      inc ax
      mov cx,ax

    loop jump3
        mov al,bcolor
        mov cx,5
      loop jump4
      inc di
      mov cx,cols
      dec cols
  loop jump2

    add di, SW
    sub di, dx
    dec bx
jnz jump1
    pop ds

[Back to GRAPHICS SWAG index]  [Back to Main SWAG index]  [Original]