[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]
{
I have a nifty all integer scale routine for vga 320x200 that I wouldn't
mind seeing in swag. It is really a pretty simple scale, and demonstrates
the principle of an all-integer approach clearly. I'll try to attach it to this
message.
this is a nifty little scale procedure I dreamed up while I was bored
one day. It uses an all integer approach and I think it is roughly as
fast as gfx, although it doesn't support scaling backwards like gfx
does. this is free for all to use.}
var
scarr : record
x,y : array[0..320] of word;
end;
function min(x,y:word):word;
begin
if x < y then min := x else min := y;
end;
procedure scalepic(x1,y1,x2,y2:word; sxsize,sysize:word; var picdata);
{
(x1,y1)(x2,y2) top left and bottom right corners of DESTINATION rect.
sxsize,sysize is the x and y sizes of the SOURCE image
picdata is your SOURCE picture.}
var
s1,o1,x,y,a,b,c,d : word;
ax,ay : boolean;
begin
s1 := seg(picdata);
o1 := ofs(picdata);
if (x2 = x1) or (y2 = y1) then exit;
for x := 0 to x2 - x1 do
scarr.x[x] := longint(x)*longint(sxsize) div (x2-x1);
{you can remove the typecasting ONLY if you know you won't be
scaling to a DESTINATION of over 255 pixels. otherwise, you'll get
a buncha junk}
for x := 0 to y2 - y1 do
scarr.y[x] := x*sysize div (y2-y1);
for x := x1 to min(x2-1,317) do
for y := y1 to min(y2,199) do
{vseg is a word denoting the segment of your virtual screen}
mem[vseg:y*320+x] := mem[s1:o1+scarr.y[y-y1]*sxsize+scarr.x[x-x1]];
end;
[Back to GRAPHICS SWAG index] [Back to Main SWAG index] [Original]