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

    {
    SEAN PALMER

    Well, I got a wild hair up my butt and decided to convert that
    bitmap scaler I posted into an inline assembler procedure (mostly)
    It's now quite a bit faster...

    by Sean Palmer
    public domain
    }

    {bitmaps are limited to 256x256 (duh)}

    type
      fixed = record
        case boolean of
          true  : (w : longint);
          false : (f, i : word);
        end;

    const
      bmp : array [0..3, 0..3] of byte =
        ((0, 1, 2, 3),
         (1, 2, 3, 4),
         (2, 3, 4, 5),
         (3, 4, 5, 6));
    var
      bmp2 : array [0..63, 0..63] of byte;
      i, j : integer;

    procedure scaleBitmap(var bitmap; x, y : byte; x1, y1, x2, y2 : word);
    var
      s, w, h    : word;  {xSkip,width,height}
      sx, sy, cy : fixed; {xinc, yinc, ySrcPos}
    begin
      w    := x2 - x1 + 1;
      h    := y2 - y1 + 1;
      sx.w := x * $10000 div w;
      sy.w := y * $10000 div h;
      s    := 320-w;
      cy.w := 0;
      asm
        push ds
        mov  ds, word ptr bitmap+2;
        mov  ax, $A000
        mov  es, ax  {setup screen seg}
        cld
        mov  ax, 320
        mul  y1
        add  ax, x1
        mov  di, ax {calc screen adr}
       @L2:
        mov  ax, cy.i
        mul  x
        mov  bx, ax
        add  bx, word ptr bitmap {offset}
        mov  cx, w
        mov  si, 0     {fraction of src adr (bx.si)}
        mov  dx, sx.f
       @L:
        mov  al, [bx]
        stosb
        add  si, dx
        adc  bx, sx.i    {if carry or sx.i<>0, new source pixel}
        loop @L
        add  di, s     {skip to next screen row}
        mov  ax, sy.f
        mov  bx, sy.i
        add  cy.f, ax
        adc  cy.i, bx
        dec  word ptr h
        jnz  @L2
        pop  ds
      end;
    end;

    begin
      for i := 0 to 63 do   {init bmp2}
        for j := 0 to 63 do
          bmp2[j, i] := j + (i xor $19) + 32;
      asm
        mov ax, $13
        int $10
      end;   {init vga mode 13h}
      for i := 2 to 99 do                 {test bmp}
        scaleBitMap(bmp, 4, 4, 0, 0, i * 2 - 1, i * 2 - 1);
      for i := 99 downto 2 do
        scaleBitMap(bmp, 4, 4, 0, 0, i * 2 - 1, 197);
      for i := 1 to 66 do                 {test bmp2}
        scaleBitMap(bmp2, 64, 64, 0, 0, i * 2 - 1, i * 3 - 1);
      for i := 66 downto 1 do
        scaleBitMap(bmp2, 64, 64, 0, 0, i * 2 - 1, i * 2 - 1 + 66);
      asm
        mov ax, $3
        int $10
      end;      {restore text mode}
    end.

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