unit screens;

{
  Written by Kevin Epstein

  I was recently working on an assignment for school and I needed to come
  up with a way to save a portion of the screen so I could over write that
  piece of screen and then restore it later.

  Generally simple code is good code so the following code for saving and
  restoring portions of the screen is reasonably simple to understand.

  The following unit allows you to save a portion of screen to memory and
  then later restore that screen. NOTE. The size of the image should not
  be larger than 64K since GETIMAGE cannot handle anything that requires
  64K or more. If you do try to save a screen too large your system will
  probably hang. Rememmber that all the screens are saved to memory, so 
  be sure to restore screens as soon as possible to free up memory.

  This code may be used and distributed freely.
  If you would like to contact me, you can either E - Mail me at KEP@USA.NET
  or write to me at :

  P.O.Box 2896
  Edenvale
  1610
  South Africa

P.S works better than Edelmans saving to file, ha ha ha }

interface

uses graph;

var memarr : array[1..10] of word;
    parr   : array[1..10] of pointer;

function checkmem(index : integer) : boolean;
procedure savexy(x,y,x1,y1,index : integer);
procedure restorexy(x,y,index : integer);

implementation

function checkmem;
var result : word;
    i      : integer;
begin
     result := 0;
     for i := 1 to index do
         result := result + memarr[index];
     if result < (memavail - 65536) then checkmem := true {reserve 64K}
     else
     checkmem := false;
end;

procedure savexy;
begin
     memarr[index] := imagesize(x,y,x1,y1);
     if not checkmem(memarr[index]) then exit; {trap for no memory}
     getmem(parr[index],memarr[index]);
     getimage(x,y,x1,y1,parr[index]^);
end;


procedure restorexy;
begin
     putimage(x,y,parr[index]^,normalput);
     release(parr[index]);
     parr[index] := nil;
     memarr[index] := 0;
end;

end.
