{
  This file is part of the Free Pascal run time library.

  A file in Amiga system run time library.
  Copyright (c) 2003 by Nils Sjöholm.
  member of the Amiga RTL development team.

  This is a unit for guigfx.library

  See the file COPYING.FPC, included in this distribution,
  for details about the copyright.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

**********************************************************************}
{
  History:

  First version of this unit.
  15 Jan 2003.

  Changed cardinal > longword.
  Changed startcode for unit.
  12 Feb 2003.

  nils.sjoholm@mailbox.swipnet.se Nils Sjoholm
}

{$mode objfpc}
{$I useamigasmartlink.inc}
{$ifdef use_amiga_smartlink}
   {$smartlink on}
{$endif use_amiga_smartlink}

UNIT GUIGFX;

INTERFACE
USES Exec,utility,agraphics;

VAR GuiGFXBase : pLibrary;

const
    GUIGFXNAME : PChar = 'guigfx.library';


  {
        $VER: guigfx.h 17.2 (9.2.2000)

        guigfx.library definitions

        © 1997-2000 TEK neoscientists
   }

  {
        Tags
    }

  const
     GGFX_Dummy = 4567 + TAG_USER;
  { strictly private  }
     GGFX_Owner = GGFX_Dummy + 0;
     GGFX_HSType = GGFX_Dummy + 1;
     GGFX_DitherMode = GGFX_Dummy + 2;
     GGFX_DitherAmount = GGFX_Dummy + 3;
     GGFX_AutoDither = GGFX_Dummy + 4;
     GGFX_DitherThreshold = GGFX_Dummy + 5;
     GGFX_AspectX = GGFX_Dummy + 6;
     GGFX_AspectY = GGFX_Dummy + 7;
     GGFX_PixelFormat = GGFX_Dummy + 8;
     GGFX_Palette = GGFX_Dummy + 9;
     GGFX_PaletteFormat = GGFX_Dummy + 10;
     GGFX_NumColors = GGFX_Dummy + 11;
     GGFX_Precision = GGFX_Dummy + 12;
     GGFX_Weight = GGFX_Dummy + 13;
     GGFX_Ratio = GGFX_Dummy + 14;
     GGFX_SourceWidth = GGFX_Dummy + 15;
     GGFX_SourceHeight = GGFX_Dummy + 16;
     GGFX_SourceX = GGFX_Dummy + 17;
     GGFX_SourceY = GGFX_Dummy + 18;
     GGFX_DestWidth = GGFX_Dummy + 19;
     GGFX_DestHeight = GGFX_Dummy + 20;
     GGFX_DestX = GGFX_Dummy + 21;
     GGFX_DestY = GGFX_Dummy + 22;
     GGFX_CallBackHook = GGFX_Dummy + 23;
     GGFX_ErrorCode = GGFX_Dummy + 24;
     GGFX_MaxAllocPens = GGFX_Dummy + 25;
     GGFX_BufferSize = GGFX_Dummy + 26;
     GGFX_AlphaPresent = GGFX_Dummy + 27;
     GGFX_Independent = GGFX_Dummy + 28;
     GGFX_ModeID = GGFX_Dummy + 29;
     GGFX_PenTable = GGFX_Dummy + 30;
  { obsolete  }
     GGFX_License = GGFX_Dummy + 31;
     GGFX_BGColor = GGFX_Dummy + 32;
     GGFX_UseMask = GGFX_Dummy + 33;
     GGFX_RastLock = GGFX_Dummy + 34;
     GGFX_FormatName = GGFX_Dummy + 35;
  {
        Picture Attributes
    }
     PICATTR_Dummy = 123 + TAG_USER;
     PICATTR_Width = PICATTR_Dummy + 0;
     PICATTR_Height = PICATTR_Dummy + 1;
     PICATTR_RawData = PICATTR_Dummy + 2;
     PICATTR_PixelFormat = PICATTR_Dummy + 3;
     PICATTR_AspectX = PICATTR_Dummy + 4;
     PICATTR_AspectY = PICATTR_Dummy + 5;
     PICATTR_AlphaPresent = PICATTR_Dummy + 6;
  {
        Picture Methods
    }
     PICMTHD_CROP = 1;
     PICMTHD_RENDER = 2;
     PICMTHD_SCALE = 3;
     PICMTHD_MIX = 4;
     PICMTHD_SETALPHA = 5;
     PICMTHD_MIXALPHA = 6;
     PICMTHD_MAPDRAWHANDLE = 7;
     PICMTHD_CREATEALPHAMASK = 8;
     PICMTHD_TINT = 9;
     PICMTHD_TEXTURE = 10;
     PICMTHD_SET = 11;
     PICMTHD_TINTALPHA = 12;
     PICMTHD_INSERT = 13;
     PICMTHD_FLIPX = 14;
     PICMTHD_FLIPY = 15;
     PICMTHD_CHECKAUTODITHER = 16;
     PICMTHD_NEGATIVE = 17;
     PICMTHD_AUTOCROP = 18;
     PICMTHD_CONVOLVE = 19;
  {
        hook message types
    }
     GGFX_MSGTYPE_LINEDRAWN = 1;
  {
        picture locking
    }
     LOCKMODE_DRAWHANDLE = 1;
     LOCKMODE_FORCE = 1 shl 8;
     LOCKMODE_MASK = $ff;

  {
        bitmap attributes
        (strictly internal)
    }

  const
     BMAPATTR_Width = 0 + TAG_USER;
     BMAPATTR_Height = 1 + TAG_USER;
     BMAPATTR_Depth = 2 + TAG_USER;
     BMAPATTR_CyberGFX = 3 + TAG_USER;
     BMAPATTR_BitMapFormat = 4 + TAG_USER;
     BMAPATTR_PixelFormat = 5 + TAG_USER;
     BMAPATTR_Flags = 6 + TAG_USER;


FUNCTION AddPaletteA(psm : POINTER; palette : POINTER; tags : pTagItem) : POINTER;
FUNCTION AddPictureA(psm : POINTER; pic : POINTER; tags : pTagItem) : POINTER;
FUNCTION AddPixelArrayA(psm : POINTER; _array : POINTER; width : WORD; height : WORD; tags : pTagItem) : POINTER;
FUNCTION ClonePictureA(pic : POINTER; tags : pTagItem) : POINTER;
FUNCTION CreateDirectDrawHandleA(drawhandle : POINTER; sw : WORD; sh : WORD; dw : WORD; dh : WORD; tags : pTagItem) : POINTER;
FUNCTION CreatePenShareMapA(tags : pTagItem) : POINTER;
FUNCTION CreatePictureBitMapA(drawhandle : POINTER; pic : POINTER; tags : pTagItem) : pBitMap;
FUNCTION CreatePictureMaskA(pic : POINTER; mask : pCHAR; maskwidth : WORD; tags : pTagItem) : BOOLEAN;
PROCEDURE DeleteDirectDrawHandle(ddh : POINTER);
PROCEDURE DeletePenShareMap(psm : POINTER);
PROCEDURE DeletePicture(pic : POINTER);
FUNCTION DirectDrawTrueColorA(ddh : POINTER; _array : pULONG; x : WORD; y : WORD; tags : pTagItem) : BOOLEAN;
FUNCTION DoPictureMethodA(pic : POINTER; method : longword; arguments : pULONG) : longword;
FUNCTION DrawPictureA(drawhandle : POINTER; pic : POINTER; x : WORD; y : WORD; tags : pTagItem) : BOOLEAN;
FUNCTION GetPictureAttrsA(pic : POINTER; tags : pTagItem) : longword;
FUNCTION IsPictureA(filename : pCHAR; tags : pTagItem) : BOOLEAN;
FUNCTION LoadPictureA(filename : pCHAR; tags : pTagItem) : POINTER;
FUNCTION LockPictureA(pic : POINTER; mode : longword; args : pULONG) : longword;
FUNCTION MakePictureA(_array : POINTER; width : WORD; height : WORD; tags : pTagItem) : POINTER;
FUNCTION MapPaletteA(drawhandle : POINTER; palette : POINTER; pentab : pCHAR; tags : pTagItem) : BOOLEAN;
FUNCTION MapPenA(drawhandle : POINTER; rgb : longword; tags : pTagItem) : LONGINT;
FUNCTION ObtainDrawHandleA(psm : POINTER; a1arg : pRastPort; cm : pColorMap; tags : pTagItem) : POINTER;
FUNCTION ReadPictureA(a0arg : pRastPort; colormap : pColorMap; x : WORD; y : WORD; width : WORD; height : WORD; tags : pTagItem) : POINTER;
PROCEDURE ReleaseDrawHandle(drawhandle : POINTER);
PROCEDURE RemColorHandle(colorhandle : POINTER);
PROCEDURE UnLockPicture(pic : POINTER; mode : longword);
{
 Functions and procedures with array of const go here
}
FUNCTION AddPalette(psm : POINTER; palette : POINTER; const tags : Array Of Const) : POINTER;
FUNCTION AddPicture(psm : POINTER; pic : POINTER; const tags : Array Of Const) : POINTER;
FUNCTION AddPixelArray(psm : POINTER; _array : POINTER; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;
FUNCTION ClonePicture(pic : POINTER; const tags : Array Of Const) : POINTER;
FUNCTION CreateDirectDrawHandle(drawhandle : POINTER; sw : WORD; sh : WORD; dw : WORD; dh : WORD; const tags : Array Of Const) : POINTER;
FUNCTION CreatePenShareMap(const tags : Array Of Const) : POINTER;
FUNCTION CreatePictureBitMap(drawhandle : POINTER; pic : POINTER; const tags : Array Of Const) : pBitMap;
FUNCTION CreatePictureMask(pic : POINTER; mask : pCHAR; maskwidth : WORD; const tags : Array Of Const) : BOOLEAN;
FUNCTION DirectDrawTrueColor(ddh : POINTER; _array : pULONG; x : WORD; y : WORD; const tags : Array Of Const) : BOOLEAN;
FUNCTION DoPictureMethod(pic : POINTER; method : longword; const arguments : Array Of Const) : longword;
FUNCTION DrawPicture(drawhandle : POINTER; pic : POINTER; x : WORD; y : WORD; const tags : Array Of Const) : BOOLEAN;
FUNCTION GetPictureAttrs(pic : POINTER; const tags : Array Of Const) : longword;
FUNCTION IsPicture(filename : pCHAR; const tags : Array Of Const) : BOOLEAN;
FUNCTION LoadPicture(filename : pCHAR; const tags : Array Of Const) : POINTER;
FUNCTION LockPicture(pic : POINTER; mode : longword; const args : Array Of Const) : longword;
FUNCTION MakePicture(_array : POINTER; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;
FUNCTION MapPalette(drawhandle : POINTER; palette : POINTER; pentab : pCHAR; const tags : Array Of Const) : BOOLEAN;
FUNCTION MapPen(drawhandle : POINTER; rgb : longword; const tags : Array Of Const) : LONGINT;
FUNCTION ObtainDrawHandle(psm : POINTER; a1arg : pRastPort; cm : pColorMap; const tags : Array Of Const) : POINTER;
FUNCTION ReadPicture(a0arg : pRastPort; colormap : pColorMap; x : WORD; y : WORD; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;

{You can remove this include and use a define instead}
{$I useautoopenlib.inc}
{$ifdef use_init_openlib}
procedure InitGUIGFXLibrary;
{$endif use_init_openlib}

{This is a variable that knows how the unit is compiled}
var
    GUIGFXIsCompiledHow : longint;

IMPLEMENTATION

uses
{$ifndef dont_use_openlib}
amsgbox,
{$endif dont_use_openlib}
tagsarray,longarray;

FUNCTION AddPaletteA(psm : POINTER; palette : POINTER; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L psm,A0
        MOVEA.L palette,A1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -072(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION AddPictureA(psm : POINTER; pic : POINTER; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L psm,A0
        MOVEA.L pic,A1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -066(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION AddPixelArrayA(psm : POINTER; _array : POINTER; width : WORD; height : WORD; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L psm,A0
        MOVEA.L _array,A1
        MOVE.L  width,D0
        MOVE.L  height,D1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -078(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION ClonePictureA(pic : POINTER; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -048(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION CreateDirectDrawHandleA(drawhandle : POINTER; sw : WORD; sh : WORD; dw : WORD; dh : WORD; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVE.L  sw,D0
        MOVE.L  sh,D1
        MOVE.L  dw,D2
        MOVE.L  dh,D3
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -168(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION CreatePenShareMapA(tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L tags,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -090(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION CreatePictureBitMapA(drawhandle : POINTER; pic : POINTER; tags : pTagItem) : pBitMap;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVEA.L pic,A1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -132(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION CreatePictureMaskA(pic : POINTER; mask : pCHAR; maskwidth : WORD; tags : pTagItem) : BOOLEAN;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVEA.L mask,A1
        MOVE.L  maskwidth,D0
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -186(A6)
        MOVEA.L (A7)+,A6
        TST.W   D0
        BEQ.B   @end
        MOVEQ   #1,D0
  @end: MOVE.B  D0,@RESULT
  END;
END;

PROCEDURE DeleteDirectDrawHandle(ddh : POINTER);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L ddh,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -174(A6)
        MOVEA.L (A7)+,A6
  END;
END;

PROCEDURE DeletePenShareMap(psm : POINTER);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L psm,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -096(A6)
        MOVEA.L (A7)+,A6
  END;
END;

PROCEDURE DeletePicture(pic : POINTER);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -054(A6)
        MOVEA.L (A7)+,A6
  END;
END;

FUNCTION DirectDrawTrueColorA(ddh : POINTER; _array : pULONG; x : WORD; y : WORD; tags : pTagItem) : BOOLEAN;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L ddh,A0
        MOVEA.L _array,A1
        MOVE.L  x,D0
        MOVE.L  y,D1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -180(A6)
        MOVEA.L (A7)+,A6
        TST.W   D0
        BEQ.B   @end
        MOVEQ   #1,D0
  @end: MOVE.B  D0,@RESULT
  END;
END;

FUNCTION DoPictureMethodA(pic : POINTER; method : longword; arguments : pULONG) : longword;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVE.L  method,D0
        MOVEA.L arguments,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -138(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION DrawPictureA(drawhandle : POINTER; pic : POINTER; x : WORD; y : WORD; tags : pTagItem) : BOOLEAN;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVEA.L pic,A1
        MOVE.L  x,D0
        MOVE.L  y,D1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -114(A6)
        MOVEA.L (A7)+,A6
        TST.W   D0
        BEQ.B   @end
        MOVEQ   #1,D0
  @end: MOVE.B  D0,@RESULT
  END;
END;

FUNCTION GetPictureAttrsA(pic : POINTER; tags : pTagItem) : longword;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -144(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION IsPictureA(filename : pCHAR; tags : pTagItem) : BOOLEAN;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L filename,A0
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -162(A6)
        MOVEA.L (A7)+,A6
        TST.W   D0
        BEQ.B   @end
        MOVEQ   #1,D0
  @end: MOVE.B  D0,@RESULT
  END;
END;

FUNCTION LoadPictureA(filename : pCHAR; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L filename,A0
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -036(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION LockPictureA(pic : POINTER; mode : longword; args : pULONG) : longword;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVE.L  mode,D0
        MOVEA.L args,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -150(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION MakePictureA(_array : POINTER; width : WORD; height : WORD; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L _array,A0
        MOVE.L  width,D0
        MOVE.L  height,D1
        MOVEA.L tags,A1
        MOVEA.L GuiGFXBase,A6
        JSR     -030(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION MapPaletteA(drawhandle : POINTER; palette : POINTER; pentab : pCHAR; tags : pTagItem) : BOOLEAN;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVEA.L palette,A1
        MOVEA.L pentab,A2
        MOVEA.L tags,A3
        MOVEA.L GuiGFXBase,A6
        JSR     -120(A6)
        MOVEA.L (A7)+,A6
        TST.W   D0
        BEQ.B   @end
        MOVEQ   #1,D0
  @end: MOVE.B  D0,@RESULT
  END;
END;

FUNCTION MapPenA(drawhandle : POINTER; rgb : longword; tags : pTagItem) : LONGINT;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVEA.L rgb,A1
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -126(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION ObtainDrawHandleA(psm : POINTER; a1arg : pRastPort; cm : pColorMap; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L psm,A0
        MOVEA.L a1arg,A1
        MOVEA.L cm,A2
        MOVEA.L tags,A3
        MOVEA.L GuiGFXBase,A6
        JSR     -102(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

FUNCTION ReadPictureA(a0arg : pRastPort; colormap : pColorMap; x : WORD; y : WORD; width : WORD; height : WORD; tags : pTagItem) : POINTER;
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L a0arg,A0
        MOVEA.L colormap,A1
        MOVE.L  x,D0
        MOVE.L  y,D1
        MOVE.L  width,D2
        MOVE.L  height,D3
        MOVEA.L tags,A2
        MOVEA.L GuiGFXBase,A6
        JSR     -042(A6)
        MOVEA.L (A7)+,A6
        MOVE.L  D0,@RESULT
  END;
END;

PROCEDURE ReleaseDrawHandle(drawhandle : POINTER);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L drawhandle,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -108(A6)
        MOVEA.L (A7)+,A6
  END;
END;

PROCEDURE RemColorHandle(colorhandle : POINTER);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L colorhandle,A0
        MOVEA.L GuiGFXBase,A6
        JSR     -084(A6)
        MOVEA.L (A7)+,A6
  END;
END;

PROCEDURE UnLockPicture(pic : POINTER; mode : longword);
BEGIN
  ASM
        MOVE.L  A6,-(A7)
        MOVEA.L pic,A0
        MOVE.L  mode,D0
        MOVEA.L GuiGFXBase,A6
        JSR     -156(A6)
        MOVEA.L (A7)+,A6
  END;
END;

{
 Functions and procedures with array of const go here
}
FUNCTION AddPalette(psm : POINTER; palette : POINTER; const tags : Array Of Const) : POINTER;
begin
    AddPalette := AddPaletteA(psm , palette , readintags(tags));
end;

FUNCTION AddPicture(psm : POINTER; pic : POINTER; const tags : Array Of Const) : POINTER;
begin
    AddPicture := AddPictureA(psm , pic , readintags(tags));
end;

FUNCTION AddPixelArray(psm : POINTER; _array : POINTER; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;
begin
    AddPixelArray := AddPixelArrayA(psm , _array , width , height , readintags(tags));
end;

FUNCTION ClonePicture(pic : POINTER; const tags : Array Of Const) : POINTER;
begin
    ClonePicture := ClonePictureA(pic , readintags(tags));
end;

FUNCTION CreateDirectDrawHandle(drawhandle : POINTER; sw : WORD; sh : WORD; dw : WORD; dh : WORD; const tags : Array Of Const) : POINTER;
begin
    CreateDirectDrawHandle := CreateDirectDrawHandleA(drawhandle , sw , sh , dw , dh , readintags(tags));
end;

FUNCTION CreatePenShareMap(const tags : Array Of Const) : POINTER;
begin
    CreatePenShareMap := CreatePenShareMapA(readintags(tags));
end;

FUNCTION CreatePictureBitMap(drawhandle : POINTER; pic : POINTER; const tags : Array Of Const) : pBitMap;
begin
    CreatePictureBitMap := CreatePictureBitMapA(drawhandle , pic , readintags(tags));
end;

FUNCTION CreatePictureMask(pic : POINTER; mask : pCHAR; maskwidth : WORD; const tags : Array Of Const) : BOOLEAN;
begin
    CreatePictureMask := CreatePictureMaskA(pic , mask , maskwidth , readintags(tags));
end;

FUNCTION DirectDrawTrueColor(ddh : POINTER; _array : pULONG; x : WORD; y : WORD; const tags : Array Of Const) : BOOLEAN;
begin
    DirectDrawTrueColor := DirectDrawTrueColorA(ddh , _array , x , y , readintags(tags));
end;

FUNCTION DoPictureMethod(pic : POINTER; method : longword; const arguments : Array Of Const) : longword;
begin
    DoPictureMethod := DoPictureMethodA(pic , method , readinlongs(arguments));
end;

FUNCTION DrawPicture(drawhandle : POINTER; pic : POINTER; x : WORD; y : WORD; const tags : Array Of Const) : BOOLEAN;
begin
    DrawPicture := DrawPictureA(drawhandle , pic , x , y , readintags(tags));
end;

FUNCTION GetPictureAttrs(pic : POINTER; const tags : Array Of Const) : longword;
begin
    GetPictureAttrs := GetPictureAttrsA(pic , readintags(tags));
end;

FUNCTION IsPicture(filename : pCHAR; const tags : Array Of Const) : BOOLEAN;
begin
    IsPicture := IsPictureA(filename , readintags(tags));
end;

FUNCTION LoadPicture(filename : pCHAR; const tags : Array Of Const) : POINTER;
begin
    LoadPicture := LoadPictureA(filename , readintags(tags));
end;

FUNCTION LockPicture(pic : POINTER; mode : longword; const args : Array Of Const) : longword;
begin
    LockPicture := LockPictureA(pic , mode , readinlongs(args));
end;

FUNCTION MakePicture(_array : POINTER; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;
begin
    MakePicture := MakePictureA(_array , width , height , readintags(tags));
end;

FUNCTION MapPalette(drawhandle : POINTER; palette : POINTER; pentab : pCHAR; const tags : Array Of Const) : BOOLEAN;
begin
    MapPalette := MapPaletteA(drawhandle , palette , pentab , readintags(tags));
end;

FUNCTION MapPen(drawhandle : POINTER; rgb : longword; const tags : Array Of Const) : LONGINT;
begin
    MapPen := MapPenA(drawhandle , rgb , readintags(tags));
end;

FUNCTION ObtainDrawHandle(psm : POINTER; a1arg : pRastPort; cm : pColorMap; const tags : Array Of Const) : POINTER;
begin
    ObtainDrawHandle := ObtainDrawHandleA(psm , a1arg , cm , readintags(tags));
end;

FUNCTION ReadPicture(a0arg : pRastPort; colormap : pColorMap; x : WORD; y : WORD; width : WORD; height : WORD; const tags : Array Of Const) : POINTER;
begin
    ReadPicture := ReadPictureA(a0arg , colormap , x , y , width , height , readintags(tags));
end;

const
    { Change VERSION and LIBVERSION to proper values }

    VERSION : string[2] = '0';
    LIBVERSION : longword = 0;

{$ifdef use_init_openlib}
  {$Info Compiling initopening of guigfx.library}
  {$Info don't forget to use InitGUIGFXLibrary in the beginning of your program}

var
    guigfx_exit : Pointer;

procedure CloseguigfxLibrary;
begin
    ExitProc := guigfx_exit;
    if GuiGFXBase <> nil then begin
        CloseLibrary(GuiGFXBase);
        GuiGFXBase := nil;
    end;
end;

procedure InitGUIGFXLibrary;
begin
    GuiGFXBase := nil;
    GuiGFXBase := OpenLibrary(GUIGFXNAME,LIBVERSION);
    if GuiGFXBase <> nil then begin
        guigfx_exit := ExitProc;
        ExitProc := @CloseguigfxLibrary;
    end else begin
        MessageBox('FPC Pascal Error',
        'Can''t open guigfx.library version ' + VERSION + #10 +
        'Deallocating resources and closing down',
        'Oops');
        halt(20);
    end;
end;

begin
    GUIGFXIsCompiledHow := 2;
{$endif use_init_openlib}

{$ifdef use_auto_openlib}
  {$Info Compiling autoopening of guigfx.library}

var
    guigfx_exit : Pointer;

procedure CloseguigfxLibrary;
begin
    ExitProc := guigfx_exit;
    if GuiGFXBase <> nil then begin
        CloseLibrary(GuiGFXBase);
        GuiGFXBase := nil;
    end;
end;

begin
    GuiGFXBase := nil;
    GuiGFXBase := OpenLibrary(GUIGFXNAME,LIBVERSION);
    if GuiGFXBase <> nil then begin
        guigfx_exit := ExitProc;
        ExitProc := @CloseguigfxLibrary;
        GUIGFXIsCompiledHow := 1;
    end else begin
        MessageBox('FPC Pascal Error',
        'Can''t open guigfx.library version ' + VERSION + #10 +
        'Deallocating resources and closing down',
        'Oops');
        halt(20);
    end;

{$endif use_auto_openlib}

{$ifdef dont_use_openlib}
begin
    GUIGFXIsCompiledHow := 3;
   {$Warning No autoopening of guigfx.library compiled}
   {$Warning Make sure you open guigfx.library yourself}
{$endif dont_use_openlib}

END. (* UNIT GUIGFX *)



