123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2016 by Free Pascal development team
- layers.library functions for Amiga OS 4.x
- 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.
- **********************************************************************}
- {$PACKRECORDS 2}
- {$IFNDEF FPC_DOTTEDUNITS}
- unit layers;
- {$ENDIF FPC_DOTTEDUNITS}
- interface
- {$IFDEF FPC_DOTTEDUNITS}
- uses
- Amiga.Core.Exec, Amiga.Core.Agraphics, Amiga.Core.Utility;
- {$ELSE FPC_DOTTEDUNITS}
- uses
- exec, agraphics, utility;
- {$ENDIF FPC_DOTTEDUNITS}
- const
- LAYERSIMPLE = 1;
- LAYERSMART = 2;
- LAYERSUPER = 4;
- LAYEROFFSCREEN = 8; // New for V53 (system private)
- LAYERUPDATING = $10;
- LAYERBACKDROP = $40;
- LAYERREFRESH = $80;
- LAYER_CLIPRECTS_LOST = $100; // during BeginUpdate or during layerop this happens if out of memory
- LAYERIREFRESH = $200;
- LAYERIREFRESH2 = $400;
- LAYERSAVEBACK = $800; // New for V44: Set if clips are saved back
- LAYERHIDDEN = $1000; // New for V45: Layer is invisible
- LAYERSTAYTOP = $2000; // New for V45: Layer can't be moved behind other layers
- LAYERMOVECHANGESSHAPE = $4000; // New for V45: Report MoveLayer() to shapechangehook
- LAYERBACKUP = $8000; // New for V53 (system private)
- ALPHA_PREFIX = $01000000;
- type
- PLayer_Info = ^TLayer_Info;
- TLayer_Info = record
- top_layer: PLayer; // Frontmost layer
- resPtr1: Pointer; // V45 spare
- resPtr2: Pointer; // Another V45 spare
- FreeClipRects: PClipRect; // Implements a backing store of cliprects to avoid frequent re-allocation of cliprects. Private
- Bounds: TRectangle; // clipping bounds of this layer info. All layers are clipped against this
- Lock: TSignalSemaphore; // Layer_Info lock
- gs_Head: TMinList; // linked list of all semaphores of all layers within this layer info
- PrivateReserve3: Smallint; // Private
- ClipRectPool: APTR; // V45: Pool for cliprects (private use only)
- Flags: Word;
- fatten_count: Shortint; // V45 spare, no longer used
- LockLayersCount: Shortint; // Counts # times LockLayers has been called
- PrivateReserve5: smallint; // Private
- BlankHook: PHook; // LayerInfo backfill hook
- LayerInfo_extra: Pointer; // Private
- end;
- const
- NEWLAYERINFO_CALLED = 1;
- LIF_EXTLBOUNDS = $0200; // System private
- LIF_OFFSCREEN = $0400; // System private
- LIF_SYNCCOMPOSE = $0800; // System private
- LIF_SYNCALWAYS = $1000; // System private
- LIF_COLLECTONLY = $2000; // System private
- LIF_IGNORE = $4000; // System private
- LIF_OPTIMIZE = $8000; // System private
- // Special backfill hook values you may want to install here.
- LAYERS_NOBACKFILL = PHook(1); // the value needed to get no backfill hook
- LAYERS_BACKFILL = PHook(0); // the value needed to get the default backfill hook
- // Special codes for ShowLayer(): Give this as target layer where to move your layer to.
- LAYER_BACKMOST = PLayer(0);
- LAYER_FRONTMOST = PLayer(1);
- //CreateBackFillHookA() attributes
- LAYERS_DUMMY = TAG_USER;
- BFHA_APen = LAYERS_DUMMY + 0; // foreground color (def not 0)
- BFHA_BPen = LAYERS_DUMMY + 1; // background color (def not 0)
- BFHA_DrMd = LAYERS_DUMMY + 2; // drawmode (def JAM2)
- BFHA_PatSize = LAYERS_DUMMY + 3; // pattern size, see SetAfPt()
- BFHA_Pattern = LAYERS_DUMMY + 4; // the pattern
- BFHA_BitMap = LAYERS_DUMMY + 5; // bitmap to use as backfill
- BFHA_Width = LAYERS_DUMMY + 6; // width of bm
- BFHA_Height = LAYERS_DUMMY + 7; // height of bm
- BFHA_OffsetX = LAYERS_DUMMY + 8; // x offset into the bm
- BFHA_OffsetY = LAYERS_DUMMY + 9; // y offset into the bm
- //CreateLayerA() attributes
- LAYA_MinX = LAYERS_DUMMY + 30; // upper left corner
- LAYA_MinY = LAYERS_DUMMY + 31; // of layer
- LAYA_MaxX = LAYERS_DUMMY + 32; // lower right corner
- LAYA_MaxY = LAYERS_DUMMY + 33; // of layer
- LAYA_ShapeRegion = LAYERS_DUMMY + 34; // shape of this layer
- LAYA_ShapeHook = LAYERS_DUMMY + 35; // hook to create layer shape
- LAYA_InFrontOf = LAYERS_DUMMY + 36; // create the layer in front of the given one
- LAYA_BitMap = LAYERS_DUMMY + 37; // common bitmap used by all layers
- LAYA_SuperBitMap = LAYERS_DUMMY + 38; // the superbitmap, sets LAYERSUPER
- LAYA_SimpleRefresh = LAYERS_DUMMY + 39; // make it a simple refresh layer
- LAYA_SmartRefresh = LAYERS_DUMMY + 40; // smart refresh layer (default TRUE)
- LAYA_Hidden = LAYERS_DUMMY + 41; // make it invisible
- LAYA_Backdrop = LAYERS_DUMMY + 42; // request backdrop layer
- LAYA_Flags = LAYERS_DUMMY + 43; // layer flags
- LAYA_BackFillHook = LAYERS_DUMMY + 44; // backfill hook for this layer
- LAYA_Behind = LAYERS_DUMMY + 45; // create behind layer (default FALSE)
- LAYA_StayTop = LAYERS_DUMMY + 46; // create a window that stays on top of all other layers
- LAYA_AlphaClips = LAYERS_DUMMY + 47; // alpha shape of this layer
- LAYA_AlphaHook = LAYERS_DUMMY + 48; // hook to create layer alpha shape
- LAYA_Opaqueness = LAYERS_DUMMY + 49; // opaqueness of this layer
- LAYA_Window = LAYERS_DUMMY + 50; // window associated to this layer (system use only)
- LAYA_Padding = LAYERS_DUMMY + 51; // extra padding on layer sides, extending screen redraw area (system use only)
- //SetLayerInfoAttrsA()/GetLayerInfoAttrsA() attributes
- LAYERINFO_BackFillHook = LAYERS_DUMMY + 100; // Backfill hook for this LayerInfo
- LAYERINFO_Bounds = LAYERS_DUMMY + 101; // Clipping bounds for this LayerInfo
- LAYERINFO_OffScreenBitMap = LAYERS_DUMMY + 102; // Common offscreen bitmap for this LayerInfo's layers
- LAYERINFO_ComposeHook = LAYERS_DUMMY + 103; // Compositing hook for this LayerInfo
- LAYERINFO_ComposeLock = LAYERS_DUMMY + 104; // Semaphore protecting compositing hook
- // The message a backfill hook receives
- type
- PBackFillMessage = ^TBackFillMessage;
- TBackFillMessage = record
- Layer: PLayer;
- Bounds: TRectangle;
- OffsetX: LongInt;
- OffsetY: LongInt;
- end;
- // The message a compose hook receives (system private)
- PLayerComposeMsg = ^TLayerComposeMsg;
- TLayerComposeMsg = record
- Action: LongWord;
- LayerInfo: PLayer_Info;
- BackBitMap: PBitMap;
- Bounds: TRectangle;
- end;
- const
- LCM_COMPOSE = 0;
- LCM_DAMAGE = 1;
- LAYERSNAME: PAnsiChar = 'layers.library';
- var
- LayersBase: PLibrary = nil;
- ILayers: PInterface = nil;
- function LayersObtain(): LongWord; syscall ILayers 60;
- function LayersRelease(): LongWord; syscall ILayers 64;
- procedure LayersExpunge(); syscall ILayers 68;
- function LayersClone(): PInterface; syscall ILayers 72;
- procedure InitLayers(Li: PLayer_Info); syscall ILayers 76;
- function CreateUpfrontLayer(Li: PLayer_Info; Bm: PBitMap; X0, Y0, X1, Y1, Flags: LongInt; Bm2: PBitMap): PLayer; syscall ILayers 80;
- function CreateBehindLayer(Li: PLayer_Info; Bm: PBitMap; X0, Y0, X1, Y1, Flags: LongInt; Bm2: PBitMap): PLayer; syscall ILayers 84;
- function UpfrontLayer(Dummy: LongInt; Layer: PLayer): LongInt; syscall ILayers 88;
- function BehindLayer(Dummy: LongInt; Layer: PLayer): LongInt; syscall ILayers 92;
- function MoveLayer(Dummy: LongInt; Layer: PLayer; Dx, Dy: LongInt): LongInt; syscall ILayers 96;
- function SizeLayer(Summy: LongInt; Layer: PLayer; Dx, Dy: LongInt): LongInt; syscall ILayers 100;
- procedure ScrollLayer(Dummy: LongInt; Layer: PLayer; Dx, Dy: LongInt); syscall ILayers 104;
- function BeginUpdate(L: PLayer): LongInt; syscall ILayers 108;
- procedure EndUpdate(Layer: PLayer; Flag: LongWord); syscall ILayers 112;
- function DeleteLayer(Dummy: LongInt; Layer: PLayer): LongInt; syscall ILayers 116;
- procedure LockLayer(Dummy: LongInt; Layer: PLayer); syscall ILayers 120;
- procedure UnlockLayer(Layer: PLayer); syscall ILayers 124;
- procedure LockLayers(Li: PLayer_Info); syscall ILayers 128;
- procedure UnlockLayers(Li: PLayer_Info); syscall ILayers 132;
- procedure LockLayerInfo(Li: PLayer_Info); syscall ILayers 136;
- procedure SwapBitsRastPortClipRect(Rp: PRastPort; Cr: PClipRect); syscall ILayers 140;
- function WhichLayer(Li: PLayer_Info; X, Y: LongInt): PLayer; syscall ILayers 144;
- procedure UnlockLayerInfo(Li: PLayer_Info); syscall ILayers 148;
- function NewLayerInfo: PLayer_Info; syscall ILayers 152;
- procedure DisposeLayerInfo(Li: PLayer_Info); syscall ILayers 156;
- function FattenLayerInfo(Li: PLayer_Info): LongInt; syscall ILayers 160;
- procedure ThinLayerInfo(Li: PLayer_Info); syscall ILayers 164;
- function MoveLayerInFrontOf(LayerToMove: PLayer; OtherLayer: PLayer): LongInt; syscall ILayers 168;
- function InstallClipRegion(Layer: PLayer; const Region: PRegion): PRegion; syscall ILayers 172;
- function MoveSizeLayer(Layer: PLayer; Dx, Dy, Dw, Dh: LongInt): LongInt; syscall ILayers 176;
- function CreateUpfrontHookLayer(Li: PLayer_Info; Bm: PBitMap; X0, Y0, X1, Y1, Flags: LongInt; Hook: PHook; Bm2: PBitMap): PLayer; syscall ILayers 180;
- function CreateBehindHookLayer(Li: PLayer_Info; Bm: PBitMap; X0, Y0, X1, Y1, Flags: LongInt; Hook: PHook; Bm2: PBitMap): PLayer; syscall ILayers 184;
- function InstallLayerHook(Layer: PLayer; Hook: PHook): PHook; syscall ILayers 188;
- function InstallLayerInfoHook(Li: PLayer_Info; const Hook: PHook): PHook; syscall ILayers 192;
- procedure SortLayerCR(Layer: PLayer; Dx, Dy: LongInt); syscall ILayers 196;
- procedure DoHookClipRects(Hook: PHook; RPort: PRastPort; const Rect: PRectangle); syscall ILayers 200;
- function LayerOccluded(Layer: PLayer): LongInt; syscall ILayers 204;
- function HideLayer(Layer: PLayer): LongInt; syscall ILayers 208;
- function ShowLayer(Layer: PLayer): LongInt; syscall ILayers 212;
- function SetLayerInfoBounds(Li: PLayer_Info; Bounds: PRectangle): LongInt; syscall ILayers 216;
- function AllocClipRect(Li: PLayer_Info): PClipRect; syscall ILayers 220;
- procedure FreeClipRect(Li: PLayer_Info; Cr: PClipRect); syscall ILayers 224;
- function CreateLayerA(Li: PLayer_Info; TList: PTagItem): PLayer; syscall ILayers 228;
- // 232 CreateLayer
- function ChangeLayerShape(Layer: PLayer; Region: PRegion; Hook: PHook): PRegion; syscall ILayers 236;
- function CreateBackFillHookA(TList: PTagItem): PHook; syscall ILayers 240;
- // 244 CreateBackFillHook
- procedure DeleteBackFillHook(Hook: PHook); syscall ILayers 248;
- function SetBackFillHookAttrsA(Hook: PHook; Tags: PTagItem): LongWord; syscall ILayers 252;
- // 256 SetBackFillHookAttrs
- function GetBackFillHookAttrsA(Hook: PHook; Tags: PTagItem): LongWord; syscall ILayers 260;
- // 264 GetBackFillHookAttrs
- function ComposeLayersA(L: PLayer; Rect: PRectangle; TagList: PTagItem): LongWord; syscall ILayers 268;
- // 272 ComposeLayers
- function GetOffScreenLayerBitMap(L: PLayer; FallBack: PBitMap; Bounds: PRectangle): LongWord; syscall ILayers 276;
- function SetLayerInfoAttrsA(Li: PLayer_Info; TagList: PTagItem): LongWord; syscall ILayers 280;
- // 284 SetLayerInfoAttrs
- function GetLayerInfoAttrsA(Li: PLayer_Info; TagList: PTagItem): LongWord; syscall ILayers 288;
- // 292 GetLayerInfoAttrs
- function ChangeLayerAlpha(L: PLayer; Clips: PClipRect; Hook: PHook): PClipRect; syscall ILayers 296;
- function SetForegroundAlpha(L: PLayer; TemplatePtr: APTR; TemplateType, BytesPerRow: LongWord; Left, Top: LongInt; Width, Height, Flags: LongWord): LongWord; syscall ILayers 300;
- function SetLayerOpaqueness(L: PLayer; Opaqueness: LongWord): LongWord; syscall ILayers 304;
- function SetLayerOverlayRect(L: PLayer; Left, Top, Width, Height: LongInt; Flags: LongWord): LongWord; syscall ILayers 308;
- implementation
- const
- // Change VERSION and LIBVERSION to proper values
- LIBVERSION : longword = 0;
- initialization
- LayersBase := OpenLibrary(LAYERSNAME, LIBVERSION);
- if Assigned(LayersBase) then
- ILayers := GetInterface(LayersBase, 'main', 1, nil);
- finalization
- if Assigned(ILayers) then
- DropInterface(ILayers);
- if Assigned(LayersBase) then
- CloseLibrary(LayersBase);
- end.
|