Browse Source

+ initial version

Tomas Hajny 26 years ago
parent
commit
051ec27f30
1 changed files with 335 additions and 0 deletions
  1. 335 0
      rtl/os2/dive.pas

+ 335 - 0
rtl/os2/dive.pas

@@ -0,0 +1,335 @@
+{****************************************************************************
+
+    $Id$
+
+                             DIVE interface unit
+                     FPC Pascal Runtime Library for OS/2
+             Copyright (c) 1999 by Karoly Balogh (aka Charlie/INQ)
+
+ The FPC Pascal runtime library is distributed under the Library GNU Public
+ License v2. So is this unit. The Library GNU Public License requires you to
+ distribute the source code of this unit with any product that uses it.
+ Because the EMX library isn't under the LGPL, we grant you an exception to
+ this, and that is, when you compile a program with the FPK Pascal compiler,
+ you do not need to ship source code with that program, AS LONG AS YOU ARE
+ USING UNMODIFIED CODE! If you modify this code, you MUST change the next
+ line:
+
+ <This an official, unmodified FPK Pascal source code file.>
+
+ Send us your modified files, we can work together if you want!
+
+ FPK-Pascal 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.  See the
+ Library GNU General Public License for more details.
+
+ You should have received a copy of the Library GNU General Public License
+ along with FPK-Pascal; see the file COPYING.LIB.  If not, write to
+ the Free Software Foundation, 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+
+****************************************************************************}
+
+Unit DIVE;
+
+{Warning: This code is alfa. Future versions of this unit will propably
+ not be compatible.}
+
+Interface
+
+Uses OS2Def, PMWin;
+
+Const Max_Dive_Instances = 64;
+
+      DIVE_Success                       = $00000000;
+      DIVE_Err_Invalid_Instance          = $00001000;
+      DIVE_Err_Source_Format             = $00001001;
+      DIVE_Err_Destination_Format        = $00001002;
+      DIVE_Err_Blitter_Not_Setup         = $00001003;
+      DIVE_Err_Insufficient_Length       = $00001004;
+      DIVE_Err_Too_Many_Instances        = $00001005;
+      DIVE_Err_No_Direct_Access          = $00001006;
+      DIVE_Err_Not_Bank_Switched         = $00001007;
+      DIVE_Err_Invalid_Bank_Number       = $00001008;
+      DIVE_Err_FB_Not_Acquired           = $00001009;
+      DIVE_Err_FB_Already_Acquired       = $0000100A;
+      DIVE_Err_Acquire_Failed            = $0000100B;
+      DIVE_Err_Bank_Switch_Failed        = $0000100C;
+      DIVE_Err_Deacquire_Failed          = $0000100D;
+      DIVE_Err_Invalid_Palette           = $0000100E;
+      DIVE_Err_Invalid_Destination_RECTL = $0000100F;
+      DIVE_Err_Invalid_Buffer_Number     = $00001010;
+      DIVE_Err_SSMDD_Not_Installed       = $00001011;
+      DIVE_Err_Buffer_Already_Accessed   = $00001012;
+      DIVE_Err_Buffer_Not_Accessed       = $00001013;
+      DIVE_Err_Too_Many_Bufffers         = $00001014;
+      DIVE_Err_Allocation_Error          = $00001015;
+      DIVE_Err_Invalid_Linesize          = $00001016;
+      DIVE_Err_Fatal_Exception           = $00001017;
+      DIVE_Err_Invalid_Conversion        = $00001018;
+      DIVE_Err_VSD_Error                 = $00001019;
+      DIVE_Err_Color_Support             = $0000101A;
+      DIVE_Err_Out_Of_Range              = $0000101B;
+      DIVE_Warn_No_Size                  = $00001100;
+
+      DIVE_Buffer_Screen                 = $00000000;
+      DIVE_Buffer_Graphics_Plane         = $00000001;
+      DIVE_Buffer_Alternate_Plane        = $00000002;
+
+      DIVE_Fully_Visible                 = $FFFFFFFF;
+
+      { * Use either of the two defines as the bRGB2Entries pointer to have DIVE  * }
+      { * query and set the physical or default palette as source or destination. * }
+
+      DIVE_Palette_Physical = $00000000;
+      DIVE_Palette_Default  = $FFFFFFFF;
+
+Type  FourCC = cardinal;
+      HDIVE  = cardinal;
+
+      { * Blitter setup structures * }
+      TSetup_Blitter = Record
+        ulStructLen : cardinal; { * ulStructLen tells how much of the structure is used.     * }
+                             { * Comments here show appropriate values, so don't count ;) * }
+
+        fInvert     : cardinal; { * Image is inverted on blit * }
+                             { * fInvert use: * }
+                             { * %0001 = 01 = $01 horizontal flip * }
+                             { * %0010 = 02 = $02 vertical flip   * }
+
+        { * This is the mark for 8 bytes * }
+
+        fccSrcColorFormat : FourCC;   { * Source data format * }
+        ulSrcWidth        : cardinal;    { * Width in pels  * }
+        ulSrcHeight       : cardinal;    { * Height in pels * }
+                                      { * The following are for displaying a sub-portion of the image. * }
+        ulSrcPosX         : cardinal;    { * X Position of source data * }
+        ulSrcPosY         : cardinal;    { * Y Position of source data * }
+
+        { * This is the mark for 28 bytes * }
+
+        ulDitherType      : cardinal;    { * Dither type * }
+
+        { * 32 byte mark * }
+
+        fccDstColorFormat : FourCC;   { * Destination color format   * }
+        ulDstWidth        : cardinal;    { * Destination width in pels  * }
+        ulDstHeight       : cardinal;    { * Destination height in pels * }
+        lDstPosX          : LongInt;
+        lDstPosY          : LongInt;
+
+        { * 52 byte mark * }
+
+        lScreenPosX       : LongInt;
+        lScreenPosY       : LongInt;
+
+        { * 60 byte mark * }
+
+        ulNumDstRects     : cardinal;
+        pVisDstRects      : PRectl; { * This is a pointer to an array of visible rectangles. * }
+
+        { * 68 bytes = fully used * }
+       End;
+
+      PSetup_Blitter = ^TSetup_Blitter;
+
+      { * Stuff for DiveQueryCaps() * }
+      TDIVE_CAPS = Record
+        ulStructLen   : cardinal;  { * SizeOf(TDIVE_CAPS)       * }
+        ulPlaneCount  : cardinal;  { * Number of defined planes * }
+
+        { * Following info applies to ulPlaneID * }
+        fScreenDirect : cardinal;  { * Direct screen access (was type BOOL in C) * }
+        fBankSwitched : cardinal;  { * VRAM bank-switched? (was type BOOL in C) * }
+        ulDepth       : cardinal;  { * Number of bits per pixel * }
+        ulHorizontalResolution : cardinal;
+        ulVerticalResolution   : cardinal;
+        ulScanLineBytes        : cardinal;
+        fccColorEncoding       : FourCC;
+        ulApertureSize         : cardinal;
+
+        ulInputFormats   : cardinal;   { * Number of input color formats * }
+        ulOutputFormats  : cardinal;
+        ulFormatLength   : cardinal;   { * Length of format buffer * }
+        pFormatData      : Pointer; { * Pointer to format buffer of FOURCC's * }
+       End;
+
+      PDIVE_CAPS = ^TDIVE_CAPS;
+
+Function DiveQueryCaps(Var DiveCaps : PDIVE_CAPS; ulPlaneBufNum : cardinal) : cardinal; cdecl;
+
+Function DiveOpen(Var phDiveInst : cardinal; fNonScreenInstance : cardinal;
+                  Var ppFrameBuffer : Pointer) : cardinal; cdecl;
+Function DiveClose(hDiveInst : cardinal) : cardinal; cdecl;
+
+Function DiveSetupBlitter(hDiveInst : cardinal; pSetupBlitter : PSetup_Blitter) : cardinal; cdecl;
+Function DiveBlitImage(hDiveInst : cardinal; ulSrcBufNumber : cardinal; ulDstBufNumber : cardinal) : cardinal; cdecl;
+
+Function DiveAcquireFrameBuffer(hDiveInst : cardinal; prectlDst : PRectl) : cardinal; cdecl;
+Function DiveDeacquireFrameBuffer(hDiveInst : cardinal) : cardinal; cdecl;
+Function DiveCalcFrameBufferAddress(hDiveInst           : cardinal;
+                                    prectlDest          : PRectl;
+                                Var pDestinationAddress : Pointer;
+                                Var ulBankNumber        : cardinal;
+                                Var ulRemLinesInBank    : cardinal) : cardinal; cdecl;
+Function DiveSwitchBank(hDiveInst : cardinal; ulBankNumber : cardinal) : cardinal; cdecl;
+
+{ Notes on DiveAllocImageBuffer:
+  If pbImageBuffer is not NULL, the buffer is associated rather than
+  allocated.  If pbImageBuffer is not NULL and the buffer number
+  pointed to by pulBufferNumber is non-zero, a new buffer pointer is
+  associated with the buffer number.  Even though no memory is
+  allocated by DiveAllocImageBuffer when user-allocated buffers are
+  associated, DiveFreeImageBuffer should be called to release the
+  buffer association to avoid using up available buffer indexes.
+  The specified line size will be used if a buffer is allocated in
+  system memory, or if a user buffer is associated.  If the
+  specified line size is zero, the allocated line size is rounded up
+  to the nearest DWORD boundry. }
+
+Function DiveAllocImageBuffer(hDiveInst       : cardinal;
+                          Var ulBufferNumber  : cardinal;
+                              fccColorSpace   : FourCC;
+                              ulWidth         : cardinal;
+                              ulHeight        : cardinal;
+                              ulLineSizeBytes : cardinal;
+                          Var bImageBuffer    : Pointer) : cardinal; cdecl;
+Function DiveFreeImageBuffer(hDiveInst : cardinal; ulBufferNumber : cardinal) : cardinal; cdecl;
+
+Function DiveBeginImageBufferAccess(hDiveInst              : cardinal;
+                                    ulBufferNumber         : cardinal;
+                                Var pbImageBuffer          : Pointer;
+                                Var ulBufferScanLineBytes  : cardinal;
+                                Var ulBufferScanLines      : cardinal) : cardinal; cdecl;
+Function DiveEndImageBufferAccess(hDiveInst : cardinal; ulBufferNumber : cardinal) : cardinal; cdecl;
+
+
+{/* Notes on palettes:
+      Neither DiveSetSourcePalette nor DiveSetDestinationPalette API's will set
+      the physical palette.  If your application MUST set the PHYSICAL palette,
+      try using no more than 236 entries (the middle 236: 10-245, thus leaving
+      the top and bottom 10 entries for the Workplace Shell).  If your
+      application MUST use ALL 256 entries, it must do so as a full-screen
+      (i.e. maximized) application.  Remember, No WM_REALIZEPALETTE message
+      will be sent to other running applications, meaning they will not redraw
+      and their colors will be all wrong.  It is not recommended that a
+      developer use these commands:
+
+   To set physical palette, do the following:
+            hps = WinGetPS ( HWND_DESKTOP );
+            hdc = GpiQueryDevice ( hps );
+            GpiCreateLogColorTable ( hps, LCOL_PURECOLOR | LCOL_REALIZABLE,
+                           LCOLF_CONSECRGB, 0, 256, (PLONG)plRGB2Entries );
+            Gre32EntrY3 ( hdc, 0L, 0x000060C6L );
+            WinInvalidateRect ( HWND_DESKTOP, (PRECTL)NULL, TRUE );
+            WinReleasePS ( hps );
+
+   To reset physical palette, do the following:
+            hps = WinGetPS ( HWND_DESKTOP );
+            hdc = GpiQueryDevice ( hps );
+            Gre32EntrY3 ( hdc, 0L, 0x000060C7L );
+            WinInvalidateRect ( HWND_DESKTOP, (PRECTL)NULL, TRUE );
+            WinReleasePS ( hps );
+*/}
+
+Function DiveSetDestinationPalette(hDiveInst    : cardinal;
+                                   ulStartIndex : cardinal;
+                                   ulNumEntries : cardinal;
+                               Var bRGB2Entries : Pointer) : cardinal; cdecl;
+
+Function DiveSetSourcePalette(hDiveInst    : cardinal;
+                              ulStartIndex : cardinal;
+                              ulNumEntries : cardinal;
+                          Var bRGB2Entries : Pointer) : cardinal; cdecl;
+
+Function DiveSetTransparentBlitMode(hDiveInst    : cardinal;
+                                    ulStartIndex : cardinal;
+                                    ulValue1     : cardinal;
+                                    ulValue2     : cardinal) : cardinal; cdecl;
+
+Implementation
+
+Function DiveQueryCaps(Var DiveCaps : PDIVE_CAPS; ulPlaneBufNum : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 1;
+
+Function DiveOpen(Var phDiveInst : cardinal; fNonScreenInstance : cardinal; Var ppFrameBuffer : Pointer) : cardinal; cdecl;
+External 'DIVE' Index 2;
+
+Function DiveClose(hDiveInst : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 3;
+
+Function DiveSetupBlitter(hDiveInst : cardinal; pSetupBlitter : PSetup_Blitter) : cardinal; cdecl;
+External 'DIVE' Index 4;
+
+Function DiveBlitImage(hDiveInst : cardinal; ulSrcBufNumber : cardinal; ulDstBufNumber : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 5;
+
+Function DiveAcquireFrameBuffer(hDiveInst : cardinal; prectlDst : PRectl) : cardinal; cdecl;
+External 'DIVE' Index 6;
+
+Function DiveDeacquireFrameBuffer(hDiveInst : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 8;
+
+Function DiveCalcFrameBufferAddress(hDiveInst           : cardinal;
+                                    prectlDest          : PRectl;
+                                Var pDestinationAddress : Pointer;
+                                Var ulBankNumber        : cardinal;
+                                Var ulRemLinesInBank    : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 11;
+
+Function DiveSwitchBank(hDiveInst : cardinal; ulBankNumber : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 7;
+
+
+Function DiveAllocImageBuffer(hDiveInst       : cardinal;
+                          Var ulBufferNumber  : cardinal;
+                              fccColorSpace   : FourCC;
+                              ulWidth         : cardinal;
+                              ulHeight        : cardinal;
+                              ulLineSizeBytes : cardinal;
+                          Var bImageBuffer    : Pointer) : cardinal; cdecl;
+External 'DIVE' Index 12;
+
+Function DiveFreeImageBuffer(hDiveInst      : cardinal;
+                             ulBufferNumber : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 13;
+
+Function DiveBeginImageBufferAccess(hDiveInst              : cardinal;
+                                    ulBufferNumber         : cardinal;
+                                Var pbImageBuffer          : Pointer;
+                                Var ulBufferScanLineBytes  : cardinal;
+                                Var ulBufferScanLines      : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 14;
+
+Function DiveEndImageBufferAccess(hDiveInst : cardinal; ulBufferNumber : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 15;
+
+Function DiveSetDestinationPalette(hDiveInst    : cardinal;
+                                   ulStartIndex : cardinal;
+                                   ulNumEntries : cardinal;
+                               Var bRGB2Entries : Pointer) : cardinal; cdecl;
+External 'DIVE' Index 9;
+
+Function DiveSetSourcePalette(hDiveInst    : cardinal;
+                              ulStartIndex : cardinal;
+                              ulNumEntries : cardinal;
+                          Var bRGB2Entries : Pointer) : cardinal; cdecl;
+External 'DIVE' Index 10;
+
+Function DiveSetTransparentBlitMode(hDiveInst    : cardinal;
+                                    ulStartIndex : cardinal;
+                                    ulValue1     : cardinal;
+                                    ulValue2     : cardinal) : cardinal; cdecl;
+External 'DIVE' Index 18;
+
+Begin
+End.
+
+{
+  $Log$
+  Revision 1.1  1999-10-01 11:17:09  hajny
+    + initial version
+
+
+}