[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]
{
LOU DUCHEZ
> When I open the window, I want to give it a shadow, in C what you
>would do is switch the 2nd bit of each character.
Shadowing here. You'll need "Crt" for this to work:
}
procedure atshadow(x1, y1, x2, y2 : byte);
{ Makes a "shadow" to the right of and below a screen region, by setting the
foreground there to low intensity and the background to black. }
type
videolocation = record
videodata : char;
videoattribute : byte;
end;
var
xbegin, xend,
ybegin, yend,
xcnt, ycnt : byte;
videosegment : word;
monosystem : boolean;
vidptr : ^videolocation;
begin
{ Determine location of video memory. }
monosystem := (lastmode in [0, 2, 7]);
if monosystem then
videosegment := $b000
else
videosegment := $b800;
{ Determine the x coordinates where the shadowing begins and ends on the
lower edge. (Basically two spaces to the right of the box.) }
xbegin := x1 + 2;
xend := x2 + 2;
{ Determine the y coordinates where the shadowing begins and ends on the
right. (Basically one row below the box.) }
ybegin := y1 + 1;
yend := y2 + 1;
ycnt := ybegin;
while (ycnt <= yend) and (ycnt <= 25) do
begin
{ This loop goes through each row, putting in the shadows on the right and
bottom. First thing to check on each pass: if we're not below the region
to shadow, shade only to the right. Otherwise, start at the left. }
if ycnt > y2 then
xcnt := xbegin
else
xcnt := x2 + 1;
vidptr := ptr(videosegment, 2 * (80 * (ycnt - 1) + (xcnt - 1)));
while (xcnt <= xend) and (xcnt <= 80) do
begin
{ This loop does the appropriate shadowing for this row. }
vidptr^.videoattribute := vidptr^.videoattribute and $07; { SHADOW! }
xcnt := xcnt + 1;
inc(vidptr);
end;
ycnt := ycnt + 1;
end;
end;
[Back to SCREEN SWAG index] [Back to Main SWAG index] [Original]