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