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

(*
> Here are some ANIVGA v1.2 fades I am releasing to public domain:
> { FEB-01-94 Added more FadeIn routines: Curtains, Blinds.  MaxFade CONST. }
  As  I posted some time ago, there's a bug in the GetImage() routine in
  V1.2  (which  can  easily  be  fixed by adding "dec(x1,StartVirtualX);
  dec(y1,StartVirtualY);  dec(x2,StartVirtualX); dec(y2,StartVirtualY);"
  at the beginning of the GetImage() procedure).
  If you did so, you can code your fade's kernel as follows:

  kai.rohrbacher@logo.ka.sub.org
*)

PROCEDURE SweepOutVertical(pa, time: WORD; seam: BOOLEAN);    {JH New! }
{ in: pa    = page, which contents will be made visible }
{     time  = time (in milliseconds) for this action (approx.) }
{     seam  =TRUE/FALSE for: show curtain seam in actual drawing color}
{     color =seam color (if seam=TRUE)}
{     1-PAGE= (visible) graphic page on which to draw }
{out: - }
{rem: the contents of page "pa" has been copied to page 1-PAGE }
CONST n=Succ(YMAX);      {number of executions of the delay loop }
      centerY = YMAX DIV 2; {middle of screen }
VAR y, counter: WORD;
    ClockTicks: LONGINT ABSOLUTE $40:$6C;
    t: LONGINT;
    temp: REAL;
    p1: POINTER;
    p2: POINTER;
BEGIN {SweepOutVertical}
 t := ClockTicks;
 counter := 0;
 temp := 0.0182*time/n;

 {upward }
 FOR y := centerY DOWNTO 0 DO
  BEGIN
   IF seam
    THEN BEGIN
          Line(StartVirtualX,y+StartVirtualY,
               StartVirtualX+XMAX,y+StartVirtualY,1-PAGE);
           {downward }
          Line(StartVirtualX,YMAX-y+StartVirtualY,
               StartVirtualX+XMAX,YMAX-y+StartVirtualY,1-PAGE);
         END;
   INC(counter);
   WHILE (ClockTicks < (t+counter*temp)) DO BEGIN END;
 {upward }
   p2 := GetImage(StartVirtualX,y+StartVirtualY,
                  StartVirtualX+XMAX,y+StartVirtualY,pa);
   PutImage(StartVirtualX,y+StartVirtualY,p2,1-PAGE);
   FreeImageMem(p2);
 {downward }
   p1 := GetImage(StartVirtualX,YMAX-y+StartVirtualY,
                  StartVirtualX+XMAX,YMAX-y+StartVirtualY,pa);
   PutImage(StartVirtualX,YMAX-y+StartVirtualY,p1,1-PAGE);
   FreeImageMem(p1);
  END;
END;  {SweepOutVertical}

PROCEDURE SweepOutHorizontal(pa, time: WORD; seam: BOOLEAN);  {JH New! }
{ in: pa    = page, which contents will be made visible }
{     time  = time (in milliseconds) for this action (approx.) }
{     seam  =TRUE/FALSE for: show curtain seam in actual drawing color}
{     color =seam color (if seam=TRUE)}
{     1-PAGE= (visible) graphic page on which to draw }
{out: - }
{rem: the contents of page "pa" has been copied to page 1-PAGE }
CONST n = Succ(XMAX);      {number of executions of the delay loop }
      centerX = XMAX DIV 2; {middle of screen }
VAR x, counter: WORD;
    ClockTicks: LONGINT ABSOLUTE $40:$6C;
    t: LONGINT;
    temp: REAL;
    p1: POINTER;
    p2: POINTER;
BEGIN {SweepOutHorizontal}
 t := ClockTicks;
 counter := 0;
 temp := 0.0182*time/n;

 {right_to_left }
 FOR x := centerX DOWNTO 0 DO
  BEGIN
   IF seam
    THEN BEGIN
          Line(x+StartVirtualX,StartVirtualY,
               x+StartVirtualX,StartVirtualY+YMAX,1-PAGE);
          {left_to_right }
          Line(XMAX-x+StartVirtualX,StartVirtualY,
               XMAX-x+StartVirtualX,StartVirtualY+YMAX,1-PAGE);
         END;
   INC(counter);
   WHILE (ClockTicks < (t+counter*temp)) DO BEGIN END;
 {right_to_left }
   p2 := GetImage(x+StartVirtualX,StartVirtualY,
                  x+StartVirtualX,StartVirtualY+YMAX,pa);
   PutImage(x+StartVirtualX,StartVirtualY,p2,1-PAGE);
   FreeImageMem(p2);
 {left_to_right }
   p1 := GetImage(XMAX-x+StartVirtualX,StartVirtualY,
                  XMAX-x+StartVirtualX,StartVirtualY+YMAX,pa);
   PutImage(XMAX-x+StartVirtualX,StartVirtualY,p1,1-PAGE);
   FreeImageMem(p1);
  END;
END;  {SweepOutHorizontal}

...and they will work with any (StartVirtualX,StartVirtualY) values.
(I  omitted  the "color:=white" stuff so that the seam is drwan in the
actual drawing color).


BTW:  As we are talking about fades, here's another one, check it out!
With  this one, the picture creeps out from the middle line to the top
and bottom (as if you look at an image folded at its middle line which
becomes opened slowly).
I  saw  that one in the opening sequence of EPIC's OVERKILL, and found
it looks nice.

PROCEDURE VerticalExpand(pa,time:WORD);
{ in: pa    = page, which contents will be made visible }
{     time  = time (in milliseconds) for this action (approx.) }
{out: - }
{rem: the contents of page "pa" has been copied to page visualPage }
CONST n = (YMAX+1)*(YMAX+1) DIV 8; {number of executions of the delay loop}
VAR ClockTicks:^LONGINT; {LONGINT ABSOLUTE $40:$6C geht nicht}
    t: LONGINT;
    temp,mitte,step,akku:REAL;
    lines,y:INTEGER;

 PROCEDURE CopyLine(von,nach:WORD);
 { in: von = zu kopierende Zeile von Seite pa}
 {     nach= Zielzeile in Seite visualPage dafuer}
 VAR p1:POINTER;
 BEGIN
  p1 := GetImage(StartVirtualX,von+StartVirtualY,
                 StartVirtualX+XMAX,von+StartVirtualY,pa);
  PutImage(StartVirtualX,nach+StartVirtualY,p1,visualPage);
  FreeImageMem(p1);
 END;

BEGIN
 ClockTicks:=Ptr(Seg0040,$6C);
 t := ClockTicks^;
 counter := 0;
 temp := 0.0182*time/n;

 mitte:=YMAX/2;
 FOR lines:=1 TO ((YMAX+1) SHR 1)-1 DO
  BEGIN
   step:=YMAX/(lines SHL 1);
   akku:=step;
   FOR y:=0 TO lines-1 DO
    BEGIN
     CopyLine(TRUNC(mitte-akku),(YMAX+1) SHR 1 -y-1);
     CopyLine(TRUNC(mitte+akku),(YMAX+1) SHR 1 +y);
     akku:=akku+step;
     INC(counter);
     WHILE (ClockTicks^ < (t+counter*temp)) DO BEGIN END;
    END;
  END;

 {Cleanup:}
 lines:=YMAX SHR 1;
 FOR y:=0 TO YMAX SHR 1 DO
  BEGIN
   CopyLine( lines-y,lines-y);
   CopyLine( lines+y,lines+y);
   INC(counter);
   WHILE (ClockTicks^ < (t+counter*temp)) DO BEGIN END;
  END;
 IF Odd(YMAX)
  THEN CopyLine(YMAX,YMAX);
END;
{
  I  gave  it  the fade constant "Fade_VerticalExpand=29", so in routine
  FadeIn() extend the CASE clause by:
     Fade_VerticalExpand: VerticalExpand(pa,ti);
}


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