home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 8
/
CDASC08.ISO
/
NEWS
/
554
/
JUIN
/
NEWBTMAP.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-10-07
|
2KB
|
87 lines
{─ Fido Pascal Conference ────────────────────────────────────────────── PASCAL ─
Msg : 473 of 619
From : Sean Palmer 1:104/123.0 09 Jun 93 00:14
To : All
Subj : Scaling bitmaps revisite
────────────────────────────────────────────────────────────────────────────────
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...
You guys should be paying me for this stuff!! 8)}
{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;
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;
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;
var i,j:integer;
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.