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

    {
    WILBERT VAN LEIJEN

    > I am looking for a way to get an Image into a pointer (besides arrays)
    > and write it to my disk. I am using arrays right now, and works fine, but
    > When  I get big images I run out of mem fast...  :: IBUF : array [1..30000]
    > of byte; getimage(x1,y1,x2,y2,IBUF); repeat Write(f,IBUF[NUM]); num:=num+1;
    > until num=sizeof(ibuf);
    > This works as long as I dont try to grab a large image.

    These "large images" are in fact stored in "planes", chunks of up to 64 kByte
    in size. You must understand the VGA architecture to store these in a file.
    The only VGA video mode that keeps all data (from the programmer's point of
    view) into a single data space is mode 13h (320x200 with 256 colours): a simple
    array [1..200, 1..320] of Byte.  The other video modes require you to access
    the VGA hardware: take for example 640x480 by 16 colours: 4 planes of 38,400
    bytes (Red, Green, Blue and Intensity).  Together with the colour information
    as returned by BIOS call INT 10h/AX=1012h they make up the picture.

    Here's how you select a plane:
    }

    Procedure SwitchBitplane(plane : Byte); Assembler;

    ASM
      MOV   DX, 3C4h
      MOV   AL, 2
      OUT   DX, AL
      INC   DX
      MOV   AL, plane
      OUT   DX, AL
    end;

    {
    Assume the video mode to be 12h (640x480/16 colours), BitplaneSize = 38400, and
    Bitplane is an Array[0..3] of pointer to an array [1..38400] of Byte:
    }
          For i := 0 to 3 Do
            Begin
              SwitchBitplane(1 shl i);
              Move(Bitplane[i]^, Ptr($A000, $0000)^, BitplaneSize);
            end;
    {
    This is a snippet of code lifted from my VGAGRAB package; a TSR that dumps
    graphic information (any standard VGA mode) to a disk file by pressing
    <PrtScr>, plus a few demo programs written in TP - with source code.  Available
    on FTP sites.
    }

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