mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-12-04 10:27:18 +01:00
798 lines
26 KiB
ObjectPascal
798 lines
26 KiB
ObjectPascal
{ $Id$
|
|
|
|
******************************************************************************
|
|
|
|
Free Pascal conversion (c) 1999 Sebastian Guenther
|
|
|
|
LibGGI API interface
|
|
|
|
Copyright (C) 1997 Jason McMullan [jmcc@ggi-project.org]
|
|
Copyright (C) 1997 Steffen Seeger [seeger@ggi-project.org]
|
|
Copyright (C) 1998 Andrew Apted [andrew@ggi-project.org]
|
|
Copyright (C) 1998 Andreas Beck [becka@ggi-project.org]
|
|
Copyright (C) 1998-1999 Marcus Sundberg [marcus@ggi-project.org]
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a
|
|
copy of this software and associated documentation files (the "Software"),
|
|
to deal in the Software without restriction, including without limitation
|
|
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
and/or sell copies of the Software, and to permit persons to whom the
|
|
Software is furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
THE AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
******************************************************************************
|
|
*}
|
|
|
|
|
|
{$MODE objfpc}
|
|
{$PACKRECORDS C}
|
|
{$LINKLIB c}
|
|
|
|
unit GGI;
|
|
|
|
interface
|
|
|
|
uses GII;
|
|
|
|
const
|
|
|
|
libggi = 'ggi';
|
|
|
|
|
|
{******************************************************************************
|
|
LibGGI datatypes and structures
|
|
******************************************************************************}
|
|
|
|
GGI_AUTO = 0;
|
|
|
|
type
|
|
|
|
TGGICoord = record
|
|
x, y: SmallInt;
|
|
end;
|
|
|
|
TGGIPixel = LongWord;
|
|
|
|
TGGIAttr = LongWord;
|
|
|
|
const
|
|
|
|
ATTR_FGCOLOR = $0000FF00; // fgcolor clut index
|
|
ATTR_BGCOLOR = $000000FF; // bgcolor clut index
|
|
ATTR_NORMAL = $00000000; // normal style
|
|
ATTR_HALF = $00010000; // half intensity
|
|
ATTR_BRIGHT = $00020000; // high intensity
|
|
ATTR_INTENSITY = $00030000; // mask to get intensity
|
|
ATTR_UNDERLINE = $00040000; // underline attribute
|
|
ATTR_BOLD = $00080000; // bold style
|
|
ATTR_ITALIC = $00100000; // italic style
|
|
ATTR_REVERSE = $00200000; // reverse fg/bg
|
|
ATTR_BLINK = $00800000; // enable blinking
|
|
ATTR_FONT = $FF000000; // font table
|
|
|
|
function ATTR_COLOR(fg, bg: Integer): Integer;
|
|
|
|
type
|
|
|
|
PGGIColor = ^TGGIColor;
|
|
|
|
TGGIColor = record
|
|
r, g, b, a: SmallInt;
|
|
end;
|
|
|
|
PGGIClut = ^TGGIClut;
|
|
|
|
TGGIClut = record
|
|
size: SmallInt;
|
|
data: PGGIColor;
|
|
end;
|
|
|
|
const GGI_COLOR_PRECISION = 16; // 16 bit per R,G, B value
|
|
|
|
// Graphtypes
|
|
|
|
type TGGIGraphType = LongWord;
|
|
|
|
const
|
|
|
|
GT_DEPTH_SHIFT = 0;
|
|
GT_SIZE_SHIFT = 8;
|
|
GT_SUBSCHEME_SHIFT = 16;
|
|
GT_SCHEME_SHIFT = 24;
|
|
|
|
GT_DEPTH_MASK = $ff shl GT_DEPTH_SHIFT;
|
|
GT_SIZE_MASK = $ff shl GT_SIZE_SHIFT;
|
|
GT_SUBSCHEME_MASK = $ff shl GT_SUBSCHEME_SHIFT;
|
|
GT_SCHEME_MASK = $ff shl GT_SCHEME_SHIFT;
|
|
|
|
// Macros to extract info from a ggi_graphtype.
|
|
|
|
function GT_DEPTH(x: Integer): Integer;
|
|
function GT_SIZE(x: Integer): Integer;
|
|
function GT_SUBSCHEME(x: Integer): Integer;
|
|
function GT_SCHEME(x: Integer): Integer;
|
|
|
|
{procedure GT_SETDEPTH(gt, x: Integer);
|
|
procedure GT_SETSIZE(gt, x: Integer);
|
|
procedure GT_SETSUBSCHEME(gt, x: Integer);
|
|
procedure GT_SETSCHEME(gt, x: Integer);}
|
|
|
|
|
|
const
|
|
|
|
// Enumerated schemes
|
|
|
|
GT_TEXT = 1 shl GT_SCHEME_SHIFT;
|
|
GT_TRUECOLOR = 2 shl GT_SCHEME_SHIFT;
|
|
GT_GREYSCALE = 3 shl GT_SCHEME_SHIFT;
|
|
GT_PALETTE = 4 shl GT_SCHEME_SHIFT;
|
|
GT_STATIC_PALETTE = 5 shl GT_SCHEME_SHIFT;
|
|
|
|
// Subschemes
|
|
GT_SUB_REVERSE_ENDIAN = 1 shl GT_SUBSCHEME_SHIFT;
|
|
GT_SUB_HIGHBIT_RIGHT = 2 shl GT_SUBSCHEME_SHIFT;
|
|
GT_SUB_PACKED_GETPUT = 4 shl GT_SUBSCHEME_SHIFT;
|
|
|
|
// Macro that constructs a graphtype
|
|
function GT_CONSTRUCT(depth, scheme, size: Integer): Integer;
|
|
|
|
|
|
const
|
|
|
|
// Common graphtypes
|
|
|
|
GT_TEXT16 = 4 or GT_TEXT or (16 shl GT_SIZE_SHIFT);
|
|
GT_TEXT32 = 8 or GT_TEXT or (32 shl GT_SIZE_SHIFT);
|
|
GT_1BIT = 1 or GT_PALETTE or (1 shl GT_SIZE_SHIFT);
|
|
GT_2BIT = 2 or GT_PALETTE or (2 shl GT_SIZE_SHIFT);
|
|
GT_4BIT = 4 or GT_PALETTE or (4 shl GT_SIZE_SHIFT);
|
|
GT_8BIT = 8 or GT_PALETTE or (8 shl GT_SIZE_SHIFT);
|
|
GT_15BIT = 15 or GT_TRUECOLOR or (16 shl GT_SIZE_SHIFT);
|
|
GT_16BIT = 16 or GT_TRUECOLOR or (16 shl GT_SIZE_SHIFT);
|
|
GT_24BIT = 24 or GT_TRUECOLOR or (24 shl GT_SIZE_SHIFT);
|
|
GT_32BIT = 24 or GT_TRUECOLOR or (32 shl GT_SIZE_SHIFT);
|
|
GT_AUTO = 0;
|
|
GT_INVALID = $ffffffff;
|
|
|
|
// ggi_mode structure
|
|
|
|
type
|
|
|
|
TGGIMode = record // requested by user and changed by driver
|
|
Frames: LongInt; // frames needed
|
|
Visible: TGGICoord; // vis. pixels, may change slightly
|
|
Virt: TGGICoord; // virtual pixels, may change
|
|
Size: TGGICoord; // size of visible in mm
|
|
GraphType: TGGIGraphType; // which mode ?
|
|
dpp: TGGICoord; // dots per pixel
|
|
end;
|
|
|
|
|
|
{******************************************************************************
|
|
LibGGI specific events
|
|
******************************************************************************}
|
|
|
|
const
|
|
|
|
GGI_CMDFLAG_LIBGGI = GII_CMDFLAG_EXTERNAL shr 1;
|
|
|
|
{ Tell target that the application should not/should be halted when the
|
|
display is unmapped. The default is to halt the application.}
|
|
|
|
GGICMD_NOHALT_ON_UNMAP = GII_CMDFLAG_EXTERNAL or GGI_CMDFLAG_LIBGGI or GII_CMDFLAG_NODATA or 1;
|
|
GGICMD_HALT_ON_UNMAP = GII_CMDFLAG_EXTERNAL or GGI_CMDFLAG_LIBGGI or GII_CMDFLAG_NODATA or 2;
|
|
|
|
{ Requests the application to switch target/mode, or to stop drawing on
|
|
the visual.
|
|
The latter is only sent if the application has explicitly requested
|
|
GGICMD_NOHALT_ON_UNMAP. When a GGI_REQSW_UNMAP request is sent the
|
|
application should respond by sending a GGICMD_ACKNOWLEDGE_SWITCH event
|
|
as quickly as possible. After the acknowledge event is sent the
|
|
application must not draw onto the visual until it recieves an evExpose
|
|
event, which tells the application that the visual is mapped back again.
|
|
}
|
|
|
|
GGICMD_REQUEST_SWITCH = GII_CMDFLAG_EXTERNAL or GGI_CMDFLAG_LIBGGI or 1;
|
|
|
|
// Used for 'request' field in ggi_cmddata_switchrequest
|
|
GGI_REQSW_UNMAP = 1;
|
|
GGI_REQSW_MODE = 2;
|
|
GGI_REQSW_TARGET = 4;
|
|
|
|
type
|
|
|
|
TGGICmdDataSwitchRequest = record
|
|
Request: LongWord;
|
|
Mode: TGGIMode;
|
|
target: array[0..63] of Char;
|
|
end;
|
|
|
|
const
|
|
|
|
GGICMD_ACKNOWLEDGE_SWITCH = GII_CMDFLAG_EXTERNAL or GGI_CMDFLAG_LIBGGI or GII_CMDFLAG_NODATA or 3;
|
|
|
|
|
|
type
|
|
|
|
TGGIVisual = Pointer;
|
|
TGGIResource = Pointer;
|
|
|
|
|
|
// Flags and frames
|
|
|
|
TGGIFlags = LongWord;
|
|
|
|
const
|
|
|
|
GGIFLAG_ASYNC = 1;
|
|
|
|
{******************************************************************************
|
|
Misc macros
|
|
******************************************************************************}
|
|
|
|
// Swap the bytes in a 16 respective 32 bit unsigned number
|
|
function GGI_BYTEREV16(x: Integer): Integer;
|
|
function GGI_BYTEREV32(x: LongWord): LongWord;
|
|
|
|
// Swap the bitgroups in an 8 bit unsigned number
|
|
function GGI_BITREV4(x: Integer): Integer;
|
|
function GGI_BITREV2(x: Integer): Integer;
|
|
function GGI_BITREV1(x: Integer): Integer;
|
|
|
|
|
|
{******************************************************************************
|
|
Information that can be returned to user apps
|
|
******************************************************************************}
|
|
|
|
// Bitmeaning defines
|
|
|
|
const
|
|
|
|
GGI_BM_TYPE_NONE = 0; // This bit is not in use
|
|
|
|
|
|
// Bit influences color of displayed pixel
|
|
|
|
GGI_BM_TYPE_COLOR = $010000;
|
|
|
|
GGI_BM_SUB_RED = $0100;
|
|
GGI_BM_SUB_GREEN = $0200;
|
|
GGI_BM_SUB_BLUE = $0300;
|
|
|
|
GGI_BM_SUB_CYAN = $1000;
|
|
GGI_BM_SUB_MAGENTA = $1100;
|
|
GGI_BM_SUB_YELLOW = $1200;
|
|
GGI_BM_SUB_K = $1300;
|
|
|
|
GGI_BM_SUB_Y = $2000;
|
|
GGI_BM_SUB_U = $2100;
|
|
GGI_BM_SUB_V = $2200;
|
|
|
|
GGI_BM_SUB_CLUT = $f000; // This bit Color or attrib ?
|
|
|
|
|
|
// Bit changes appearance of pixel/glyph
|
|
|
|
GGI_BM_TYPE_ATTRIB = $020000;
|
|
|
|
GGI_BM_SUB_ALPHA = $0100;
|
|
|
|
GGI_BM_SUB_BLINK = $1000;
|
|
GGI_BM_SUB_INTENSITY = $1100;
|
|
GGI_BM_SUB_UNDERLINE = $1200;
|
|
GGI_BM_SUB_BOLD = $1300;
|
|
GGI_BM_SUB_ITALIC = $1400;
|
|
|
|
GGI_BM_SUB_FGCOL = $2000;
|
|
GGI_BM_SUB_BGCOL = $2100;
|
|
|
|
GGI_BM_SUB_TEXNUM = $3000;
|
|
GGI_BM_SUB_FONTSEL = $3100; // select different font banks
|
|
GGI_BM_SUB_PALSEL = $3200; // select different palettes
|
|
GGI_BM_SUB_MODESEL = $3300; // select different palettes
|
|
|
|
// Bit that influence drawing logic
|
|
|
|
GI_BM_TYPE_LOGIC = $030000;
|
|
|
|
GGI_BM_SUB_ZBUFFER = $0100;
|
|
GGI_BM_SUB_WRITEPROT = $1000;
|
|
GGI_BM_SUB_WINDOWID = $2000;
|
|
|
|
|
|
|
|
|
|
// Pixelformat for ggiGet/Put* buffers and pixellinearbuffers */
|
|
|
|
type
|
|
|
|
PGGIPixelFormat = ^TGGIPixelFormat;
|
|
|
|
TGGIPixelFormat = record
|
|
depth: Integer; // Number of significant bits
|
|
size: Integer; // Physical size in bits
|
|
|
|
|
|
{* Simple and common things first :
|
|
*
|
|
* Usage of the mask/shift pairs:
|
|
* If new_value is the _sizeof(ggi_pixel)*8bit_ value of the thing
|
|
* you want to set, you do
|
|
*
|
|
* *pointer &= ~???_mask; // Mask out old bits
|
|
* *pointer |= (new_value>>shift) & ???_mask;
|
|
*
|
|
* The reason to use 32 bit and "downshifting" is alignment
|
|
* and extensibility. You can easily adjust to other datasizes
|
|
* with a simple addition ...
|
|
*}
|
|
|
|
// Simple colors:
|
|
red_mask: TGGIPixel; // Bitmask of red bits
|
|
red_shift: Integer; // Shift for red bits
|
|
|
|
green_mask: TGGIPixel; // Bitmask of green bits
|
|
green_shift: Integer; // Shift for green bits
|
|
|
|
blue_mask: TGGIPixel; // Bitmask of blue bits
|
|
blue_shift: Integer; // Shift for blue bits
|
|
|
|
// A few common attributes:
|
|
alpha_mask: TGGIPixel; // Bitmask of alphachannel bits
|
|
alpha_shift: Integer; // Shift for alpha bits
|
|
|
|
clut_mask: TGGIPixel; // Bitmask of bits for the clut
|
|
clut_shift: Integer; // Shift for bits for the clut
|
|
|
|
fg_mask: TGGIPixel; // Bitmask of foreground color
|
|
fg_shift: Integer; // Shift for foreground color
|
|
|
|
bg_mask: TGGIPixel; // Bitmask of background color
|
|
bg_shift: Integer; // Shift for background color
|
|
|
|
texture_mask: TGGIPixel; // Bitmask of the texture (for
|
|
// textmodes - the actual character)
|
|
texture_shift: Integer; // Shift for texture
|
|
|
|
// Now if this does not suffice you might want to parse the following
|
|
// to find out what each bit does:
|
|
bitmeaning: array[0..SizeOf(TGGIPixel) * 8 - 1] of LongWord;
|
|
|
|
// Shall we keep those?
|
|
flags: LongWord; // Pixelformat flags
|
|
|
|
stdformat: LongWord; // Standard format identifier
|
|
|
|
{* This one has only one use for the usermode application:
|
|
* To quickly check, if two buffers are identical. If both
|
|
* stdformats are the same and _NOT_ 0 (which means "WEIRD"),
|
|
* you may use things like memcpy between them which will have
|
|
* the desired effect ...
|
|
*}
|
|
end;
|
|
|
|
const
|
|
|
|
// Pixelformat flags
|
|
GGI_PF_REVERSE_ENDIAN = 1;
|
|
GGI_PF_HIGHBIT_RIGHT = 2;
|
|
GGI_PF_HAM = 4;
|
|
GGI_PF_EXTENDED = 8;
|
|
|
|
|
|
{******************************************************************************
|
|
DirectBuffer
|
|
******************************************************************************}
|
|
|
|
type
|
|
|
|
TGGIBufferLayout = (
|
|
blPixelLinearBuffer,
|
|
blPixelPlanarBuffer,
|
|
blExtended,
|
|
|
|
blLastBufferLayout
|
|
);
|
|
|
|
|
|
PGGIPixelLinearBuffer = ^TGGIPixelLinearBuffer;
|
|
|
|
TGGIPixelLinearBuffer = record
|
|
stride: Integer; // bytes per row
|
|
pixelformat: PGGIPixelFormat; // format of the pixels
|
|
end;
|
|
|
|
|
|
PGGIPixelPlanarBuffer = ^TGGIPixelPlanarBuffer;
|
|
|
|
TGGIPixelPlanarBuffer = record
|
|
next_line: Integer; // bytes until next line
|
|
next_plane: Integer; // bytes until next plane
|
|
pixelformat: PGGIPixelFormat; // format of the pixels
|
|
end;
|
|
|
|
// Buffer types
|
|
|
|
const
|
|
|
|
GGI_DB_NORMAL = 1; // "frame" is valid when set
|
|
GGI_DB_EXTENDED = 2;
|
|
GGI_DB_MULTI_LEFT = 4;
|
|
GGI_DB_MULTI_RIGHT = 8;
|
|
|
|
// Flags that may be 'or'ed with the buffer type
|
|
GGI_DB_SIMPLE_PLB = $01000000;
|
|
{ GGI_DB_SIMPLE_PLB means that the buffer has the following properties:
|
|
type = GGI_DB_NORMAL
|
|
read = write
|
|
noaccess = 0
|
|
align = 0
|
|
layout = blPixelLinearBuffer
|
|
}
|
|
|
|
type
|
|
|
|
PGGIDirectBuffer = ^TGGIDirectBuffer;
|
|
|
|
TGGIDirectBuffer = record
|
|
BufferType: LongWord; // buffer type
|
|
frame: Integer; // framenumber (GGI_DB_NORMAL)
|
|
|
|
// access info
|
|
resource: TGGIResource; // If non-NULL you must acquire the
|
|
// buffer before using it
|
|
read: Pointer; // buffer address for reads
|
|
write:Pointer; // buffer address for writes
|
|
page_size: LongWord; // zero for true linear buffers
|
|
|
|
noaccess: LongWord;
|
|
{bitfield. bit x set means you may _not_ access this DB at the
|
|
width of 2^x bytes. Usually 0, but _check_ it.}
|
|
|
|
align: LongWord;
|
|
{bitfield. bit x set means you may only access this DB at the
|
|
width of 2^x bytes, when the access is aligned to a multiple
|
|
of 2^x. Note that bit 0 is a bit bogus here, but it should
|
|
be always 0, as then ((noaccess|align)==0) is a quick check
|
|
for "no restrictions". }
|
|
|
|
layout: TGGIBufferLayout;
|
|
|
|
// The actual buffer info. Depends on layout.
|
|
buffer: record
|
|
case Integer of
|
|
0: (plb: TGGIPixelLinearBuffer);
|
|
1: (plan: TGGIPixelPlanarBuffer);
|
|
2: (extended: Pointer);
|
|
end;
|
|
end;
|
|
|
|
|
|
{******************************************************************************
|
|
Resource management
|
|
******************************************************************************}
|
|
|
|
// Access types
|
|
|
|
const
|
|
|
|
GGI_ACTYPE_READ = 1 shl 0;
|
|
GGI_ACTYPE_WRITE = 1 shl 1;
|
|
|
|
|
|
{******************************************************************************
|
|
LibGGI function definitions
|
|
******************************************************************************}
|
|
|
|
// Enter and leave the library
|
|
|
|
function ggiInit: Integer; cdecl; external libggi;
|
|
procedure ggiExit; cdecl; external libggi;
|
|
procedure ggiPanic(format: PChar; args: array of const); cdecl; external libggi;
|
|
|
|
|
|
// Open a new visual - use display 'NULL' for the default visual
|
|
function ggiOpen(display: PChar; args: array of const): TGGIVisual; cdecl; external libggi;
|
|
function ggiClose(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
// Get/Set info
|
|
function ggiSetFlags(vis: TGGIVisual; flags: TGGIFlags): Integer; cdecl; external libggi;
|
|
function ggiGetFlags(vis: TGGIVisual): TGGIFlags; cdecl; external libggi;
|
|
|
|
function ggiAddFlags(vis: TGGIVisual; flags: TGGIFlags): Integer;
|
|
function ggiRemoveFlags(vis: TGGIVisual; flags: TGGIFlags): Integer;
|
|
|
|
function ggiGetPixelFormat(vis: TGGIVisual): PGGIPixelFormat; cdecl; external libggi;
|
|
|
|
|
|
// DirectBuffer (DB) functions
|
|
function ggiDBGetNumBuffers(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
function ggiDBGetBuffer(vis: TGGIVisual; bufnum: Integer): PGGIDirectBuffer; cdecl; external libggi;
|
|
|
|
// Resource functions
|
|
function ggiResourceAcquire(res: TGGIResource; actype: LongWord): Integer;
|
|
function ggiResourceRelease(res: TGGIResource): Integer;
|
|
function ggiResourceFastAcquire(res: TGGIResource; actype: LongWord): Integer; cdecl; external libggi;
|
|
function ggiResourceFastRelease(res: TGGIResource): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Library management
|
|
|
|
const GGI_MAX_APILEN = 1024;
|
|
|
|
function ggiGetAPI(vis: TGGIVisual; num: Integer; APIName, arguments: PChar): Integer; cdecl; external libggi;
|
|
|
|
const GGI_CHG_APILIST = 1;
|
|
|
|
function ggiIndicateChange(vis: TGGIVisual; WhatChanged: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Mode management
|
|
|
|
function ggiSetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
|
|
function ggiGetMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
|
|
function ggiCheckMode(visual: TGGIVisual; var tm: TGGIMode): Integer; cdecl; external libggi;
|
|
function ggiSetTextMode(visual: TGGIVisual; cols, rows, vcols, vrows, fontx, fonty: Integer; AType: TGGIGraphType): Integer; cdecl; external libggi;
|
|
function ggiCheckTextMode(visual: TGGIVisual; cols, rows, vcols, vrows, fontx, fonty: Integer; var SuggestedMode: TGGIMode): Integer; cdecl; external libggi;
|
|
function ggiSetGraphMode(visual: TGGIVisual; x, y, xv, yv: Integer; AType: TGGIGraphType): Integer; cdecl; external libggi;
|
|
function ggiCheckGraphMode(visual: TGGIVisual; x, y, xv, yv: Integer; AType: TGGIGraphType; var SuggestedMode: TGGIMode): Integer; cdecl; external libggi;
|
|
function ggiSetSimpleMode(visual: TGGIVisual; xsize, ysize, frames: Integer; AType: TGGIGraphType): Integer; cdecl; external libggi;
|
|
function ggiCheckSimpleMode(visual: TGGIVisual; xsize, ysize, frames: Integer; AType: TGGIGraphType; var md: TGGIMode): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Print all members of the mode struct
|
|
|
|
function ggiSPrintMode(s: PChar; var m: TGGIMode): Integer; cdecl; external libggi;
|
|
// function ggiFPrintMode(s: PFile; var m: TGGIMode): Integer; cdecl; external libggi;
|
|
// #define ggiPrintMode(m) ggiFPrintMode(stdout,(m))
|
|
|
|
|
|
// Fill a mode struct from the text string s
|
|
|
|
function ggiParseMode(s: PChar; var m: TGGIMode): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Flush all pending operations to the display device
|
|
|
|
// Normal flush
|
|
function ggiFlush(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
// Flush only the specified region if it would improve performance */
|
|
function ggiFlushRegion(vis: TGGIVisual; x, y, w, h: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Graphics context
|
|
|
|
function ggiSetGCForeground(vis: TGGIVisual; Color: TGGIPixel): Integer; cdecl; external libggi;
|
|
function ggiGetGCForeground(vis: TGGIVisual; var Color: TGGIPixel): Integer; cdecl; external libggi;
|
|
function ggiSetGCBackground(vis: TGGIVisual; Color: TGGIPixel): Integer; cdecl; external libggi;
|
|
function ggiGetGCBackground(vis: TGGIVisual; var Color: TGGIPixel): Integer; cdecl; external libggi;
|
|
function ggiSetGCClipping(vis: TGGIVisual; left, top, right, bottom: Integer): Integer; cdecl; external libggi;
|
|
function ggiGetGCClipping(vis: TGGIVisual; var left, top, right, bottom: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Color palette manipulation
|
|
function ggiMapColor(vis: TGGIVisual; Color: TGGIColor): TGGIPixel; cdecl; external libggi;
|
|
function ggiUnmapPixel(vis: TGGIVisual; pixel: TGGIPixel; var Color: TGGIColor): Integer; cdecl; external libggi;
|
|
function ggiPackColors(vis: TGGIVisual; var buf; var cols: TGGIColor; len: Integer): Integer; cdecl; external libggi;
|
|
function ggiUnpackPixels(vis: TGGIVisual; var buf; var cols: TGGIColor; len: Integer): Integer; cdecl; external libggi;
|
|
function ggiGetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
|
|
function ggiSetPalette(vis: TGGIVisual; s, len: Integer; var cmap: TGGIColor): Integer; cdecl; external libggi;
|
|
function ggiSetColorfulPalette(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
const GGI_PALETTE_DONTCARE = -1;
|
|
|
|
|
|
// Gamma map manipulation
|
|
|
|
function ggiGetGamma(vis: TGGIVisual; var r, g, b: Double): Integer; cdecl; external libggi;
|
|
function ggiSetGamma(vis: TGGIVisual; r, g, b: Double): Integer; cdecl; external libggi;
|
|
function ggiGetGammaMap(vis: TGGIVisual; s, len: Integer; var gammamap: TGGIColor): Integer; cdecl; external libggi;
|
|
function ggiSetGammaMap(vis: TGGIVisual; s, len: Integer; var gammamap: TGGIColor): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Origin handling
|
|
|
|
function ggiSetOrigin(vis: TGGIVisual; x, y: Integer): Integer; cdecl; external libggi;
|
|
function ggiGetOrigin(vis: TGGIVisual; var x, y: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Frame handling
|
|
|
|
function ggiSetDisplayFrame(vis: TGGIVisual; FrameNo: Integer): Integer; cdecl; external libggi;
|
|
function ggiSetReadFrame(vis: TGGIVisual; FrameNo: Integer): Integer; cdecl; external libggi;
|
|
function ggiSetWriteFrame(vis: TGGIVisual; FrameNo: Integer): Integer; cdecl; external libggi;
|
|
|
|
function ggiGetDisplayFrame(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
function ggiGetReadFrame(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
function ggiGetWriteFrame(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Generic drawing routines
|
|
|
|
function ggiFillscreen(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
function ggiDrawPixel(vis: TGGIVisual; x, y: Integer): Integer; cdecl; external libggi;
|
|
function ggiPutPixel(vis: TGGIVisual; x, y: Integer; pixel: TGGIPixel): Integer; cdecl; external libggi;
|
|
function ggiGutPixel(vis: TGGIVisual; x, y: Integer; var pixel: TGGIPixel): Integer; cdecl; external libggi;
|
|
|
|
function ggiDrawLine(vis: TGGIVisual; x, y, xe, ye: Integer): Integer; cdecl; external libggi;
|
|
function ggiDrawHLine(vis: TGGIVisual; x, y, w: Integer): Integer; cdecl; external libggi;
|
|
function ggiPutHLine(vis: TGGIVisual; x, y, w: Integer; var buf): Integer; cdecl; external libggi;
|
|
function ggiGetHLine(vis: TGGIVisual; x, y, w: Integer; var buf): Integer; cdecl; external libggi;
|
|
|
|
function ggiDrawVLine(vis: TGGIVisual; x, y, h: Integer): Integer; cdecl; external libggi;
|
|
function ggiPutVLine(vis: TGGIVisual; x, y, h: Integer; var buf): Integer; cdecl; external libggi;
|
|
function ggiGetVLine(vis: TGGIVisual; x, y, h: Integer; var buf): Integer; cdecl; external libggi;
|
|
|
|
function ggiDrawBox(vis: TGGIVisual; x, y, w, h: Integer): Integer; cdecl; external libggi;
|
|
function ggiPutBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
|
|
function ggiGetBox(vis: TGGIVisual; x, y, w, h: Integer; var buffer): Integer; cdecl; external libggi;
|
|
function ggiCopyBox(vis: TGGIVisual; x, y, w, h, nx, ny: Integer): Integer; cdecl; external libggi;
|
|
function ggiCrossBlit(src: TGGIVisual; sx, sy, w, h: Integer; dst: TGGIVisual; dx, dy: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Text drawing routines
|
|
|
|
function ggiPutc(vis: TGGIVisual; x, y: Integer; c: Char): Integer; cdecl; external libggi;
|
|
function ggiPuts(vis: TGGIVisual; x, y: Integer; str: PChar): Integer; cdecl; external libggi;
|
|
function ggiGetCharSize(vis: TGGIVisual; var width, height: Integer): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Event handling
|
|
|
|
//###function ggiEventPoll(vis: TGGIVisual; mask: TGIIEventMask; var t: TTimeVal): TGIIEventMask; cdecl; external libggi;
|
|
function ggiEventsQueued(vis: TGGIVisual; mask: TGIIEventMask): Integer; cdecl; external libggi;
|
|
function ggiEventRead(vis: TGGIVisual; var Event: TGIIEvent; mask: TGIIEventMask): Integer; cdecl; external libggi;
|
|
function ggiSetEventMask(vis: TGGIVisual; EventMask: TGIIEventMask): Integer; cdecl; external libggi;
|
|
function ggiGetEventMask(vis: TGGIVisual): TGIIEventMask; cdecl; external libggi;
|
|
function ggiEventSend(vis: TGGIVisual; var Event: TGIIEvent): Integer; cdecl; external libggi;
|
|
function ggiJoinInputs(vis: TGGIVisual; Input: TGIIInput): TGIIInput; cdecl; external libggi;
|
|
|
|
function ggiAddEventMask(vis: TGGIVisual; Mask: TGIIEventMask): Integer;
|
|
function ggiRemoveEventMask(vis: TGGIVisual; Mask: TGIIEventMask): Integer;
|
|
|
|
|
|
// Convenience functions
|
|
|
|
function ggiKbhit(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
function ggiGetc(vis: TGGIVisual): Integer; cdecl; external libggi;
|
|
|
|
|
|
// Extension handling
|
|
|
|
type
|
|
TGGILibID = Pointer;
|
|
TGGIExtID = Integer; {Don't rely on that !}
|
|
TGGIParamChangeProc = function(Visual: TGGIVisual; WhatChanged: Integer): Integer;
|
|
|
|
function ggiExtensionRegister(name: PChar; size: Integer;
|
|
ParamChange: TGGIParamChangeProc): TGGIExtID; cdecl; external libggi;
|
|
function ggiExtensionUnregister(id: TGGIExtID): Integer; cdecl; external libggi;
|
|
function ggiExtensionAttach(Visual: TGGIVisual; id: TGGIExtID): Integer; cdecl; external libggi;
|
|
function ggiExtensionDetach(Visual: TGGIVisual; id: TGGIExtID): Integer; cdecl; external libggi;
|
|
function ggiExtensionLoadDL(Visual: TGGIVisual; filename, args: PChar; ArgPtr: Pointer): TGGILibID; cdecl; external libggi;
|
|
|
|
|
|
|
|
// ===================================================================
|
|
// ===================================================================
|
|
|
|
implementation
|
|
|
|
|
|
function ATTR_COLOR(fg, bg: Integer): Integer;
|
|
begin
|
|
Result := (bg and $ff) or ((fg and $ff) shl 8);
|
|
end;
|
|
|
|
function GT_DEPTH(x: Integer): Integer;
|
|
begin
|
|
Result := (x and GT_DEPTH_MASK) shr GT_DEPTH_SHIFT;
|
|
end;
|
|
|
|
function GT_SIZE(x: Integer): Integer;
|
|
begin
|
|
Result := (x and GT_SIZE_MASK) shr GT_SIZE_SHIFT;
|
|
end;
|
|
|
|
function GT_SUBSCHEME(x: Integer): Integer;
|
|
begin
|
|
Result := x and GT_SUBSCHEME_MASK;
|
|
end;
|
|
|
|
function GT_SCHEME(x: Integer): Integer;
|
|
begin
|
|
Result := x and GT_SCHEME_MASK;
|
|
end;
|
|
|
|
function GT_CONSTRUCT(depth, scheme, size: Integer): Integer;
|
|
begin
|
|
Result := depth or scheme or (size shl GT_SIZE_SHIFT);
|
|
end;
|
|
|
|
|
|
|
|
function GGI_BYTEREV16(x: Integer): Integer;
|
|
begin
|
|
Result := (x shl 8) or (x shr 8);
|
|
end;
|
|
|
|
function GGI_BYTEREV32(x: LongWord): LongWord;
|
|
begin
|
|
Result := (x shl 24) or ((x and $ff00) shl 8) or
|
|
((x and $ff0000) shr 8) or (x shr 24);
|
|
end;
|
|
|
|
function GGI_BITREV4(x: Integer): Integer;
|
|
begin
|
|
Result := (x shr 4) or (x shl 4);
|
|
end;
|
|
|
|
function GGI_BITREV2(x: Integer): Integer;
|
|
begin
|
|
Result := (x shr 6) or ((x and $30) shr 2) or ((x and $0c) shl 2) or (x shl 6);
|
|
end;
|
|
|
|
function GGI_BITREV1(x: Integer): Integer;
|
|
begin
|
|
Result := (x shr 7) or ((x and $40) shr 5) or ((x and $20) shr 3) or
|
|
((x and $10) shr 1) or ((x and 8) shl 1) or ((x and 4) shl 3) or
|
|
((x and 2) shl 4) or (x shl 7);
|
|
end;
|
|
|
|
function ggiAddFlags(vis: TGGIVisual; flags: TGGIFlags): Integer;
|
|
begin
|
|
Result := ggiSetFlags(vis, ggiGetFlags(vis) or flags);
|
|
end;
|
|
|
|
function ggiRemoveFlags(vis: TGGIVisual; flags: TGGIFlags): Integer;
|
|
begin
|
|
Result := ggiSetFlags(vis, ggiGetFlags(vis) and not flags);
|
|
end;
|
|
|
|
function ggiResourceAcquire(res: TGGIResource; actype: LongWord): Integer;
|
|
begin
|
|
if res = nil then Result := 0
|
|
else Result := ggiResourceFastAcquire(res, actype);
|
|
end;
|
|
|
|
function ggiResourceRelease(res: TGGIResource): Integer;
|
|
begin
|
|
if res = nil then Result := 0
|
|
else Result := ggiResourceFastRelease(res);
|
|
end;
|
|
|
|
function ggiAddEventMask(vis: TGGIVisual; Mask: TGIIEventMask): Integer;
|
|
begin
|
|
Result := ggiSetEventMask(vis, ggiGetEventMask(vis) or mask);
|
|
end;
|
|
|
|
function ggiRemoveEventMask(vis: TGGIVisual; Mask: TGIIEventMask): Integer;
|
|
begin
|
|
Result := ggiSetEventMask(vis, ggiGetEventMask(vis) and not mask);
|
|
end;
|
|
|
|
|
|
end.
|
|
|
|
|
|
{
|
|
$Log$
|
|
Revision 1.2 1999-11-12 18:47:34 sg
|
|
* Fixed a small typo...
|
|
|
|
Revision 1.1 1999/11/10 14:14:34 sg
|
|
* Added to CVS
|
|
|
|
}
|