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