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