**[**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**]**