Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / win32ss / drivers / displays / vga / vgaddi.h
diff --git a/win32ss/drivers/displays/vga/vgaddi.h b/win32ss/drivers/displays/vga/vgaddi.h
new file mode 100644 (file)
index 0000000..e2b4ef4
--- /dev/null
@@ -0,0 +1,288 @@
+#ifndef _VGADDI_PCH_
+#define _VGADDI_PCH_
+
+#define _WINBASE_
+#define _WINDOWS_H
+#include <stdarg.h>
+#include <windef.h>
+#include <wingdi.h>
+#include <winddi.h>
+#include <winioctl.h>
+#include <ntddvdeo.h>
+#include <ioaccess.h>
+
+#include "vgavideo/vgavideo.h"
+
+#ifndef NDEBUG
+#define DPRINT DbgPrint
+#else
+#define DPRINT
+#endif
+#define DPRINT1 DbgPrint
+
+/* FIXME - what a headers mess.... */
+
+#define DDKFASTAPI __fastcall
+#define FASTCALL __fastcall
+
+ULONG DbgPrint(PCCH Format,...);
+
+static __inline BOOLEAN
+RemoveEntryList(
+  IN PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  PLIST_ENTRY OldBlink;
+
+  OldFlink = Entry->Flink;
+  OldBlink = Entry->Blink;
+  OldFlink->Blink = OldBlink;
+  OldBlink->Flink = OldFlink;
+  return (OldFlink == OldBlink);
+}
+
+static __inline VOID
+InsertHeadList(
+  IN PLIST_ENTRY  ListHead,
+  IN PLIST_ENTRY  Entry)
+{
+  PLIST_ENTRY OldFlink;
+  OldFlink = ListHead->Flink;
+  Entry->Flink = OldFlink;
+  Entry->Blink = ListHead;
+  OldFlink->Blink = Entry;
+  ListHead->Flink = Entry;
+}
+
+static __inline VOID
+InitializeListHead(
+  IN PLIST_ENTRY  ListHead)
+{
+  ListHead->Flink = ListHead->Blink = ListHead;
+}
+
+/***********************************************************/
+
+#define DS_SOLIDBRUSH  0x00000001
+#define DS_GREYBRUSH   0x00000002
+#define DS_BRUSH       0x00000004
+#define DS_DIB         0x00000008
+
+#define POW2(stride) (!((stride) & ((stride)-1)))   // TRUE if stride is power of 2
+#define BROKEN_RASTERS(stride,cy) ((!(POW2(stride))) && ((stride*cy) > 0x10000))
+
+#define ENUM_RECT_LIMIT   50
+
+typedef struct _RECT_ENUM
+{
+  ULONG c;
+  RECTL arcl[ENUM_RECT_LIMIT];
+} RECT_ENUM;
+
+// Cursor coordinates
+typedef struct  _XYPAIR
+{
+  USHORT  x;
+  USHORT  y;
+} XYPAIR;
+
+typedef struct _SAVED_SCREEN_BITS
+{
+  BOOL Free;
+  DWORD Offset;
+  ULONG Size;
+  LIST_ENTRY ListEntry;
+} SAVED_SCREEN_BITS, *PSAVED_SCREEN_BITS;
+
+// Cursor states
+#define CURSOR_COLOR     0x00000004
+#define CURSOR_HW        0x00000010
+#define CURSOR_HW_ACTIVE 0x00000020
+#define CURSOR_ANIMATE   0x00000040
+
+typedef struct _PDEV
+{
+  ULONG fl; // driver flags
+
+  // Handles
+  HANDLE KMDriver;
+  HDEV   GDIDevHandle;   // engine's handle to PDEV
+  HSURF  SurfHandle;     // engine's handle to surface
+  PVOID  AssociatedSurf; // associated surface
+
+  // Cursor
+  XYPAIR xyHotSpot; // cursor hotspot
+
+  // Pointer
+  PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // HW Pointer Attributes
+  PSAVED_SCREEN_BITS ImageBehindCursor;
+  ULONG   XorMaskStartOffset;         // Start offset of hardware pointer
+                                      //  XOR mask relative to AND mask for
+                                      //  passing to HW pointer
+  DWORD   PointerAttributes;          // Size of buffer allocated
+  DWORD   flPreallocSSBBufferInUse;   // True if preallocated saved screen
+                                      //  bits buffer is in use
+  PUCHAR  pjPreallocSSBBuffer;        // Pointer to preallocated saved screen
+                                      //  bits buffer, if there is one
+  ULONG   ulPreallocSSBSize;          // Size of preallocated saved screen
+                                      //  bits buffer
+  VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
+  PUCHAR  pucDIB4ToVGAConvBuffer;     // DIB4->VGA conversion table buffer
+  PUCHAR  pucDIB4ToVGAConvTables;     // Pointer to DIB4->VGA conversion
+
+  // Misc
+  ULONG  ModeNum;   // mode index for current VGA mode
+
+  SIZEL  sizeSurf;  // displayed size of the surface
+  PBYTE  fbScreen;  // pointer to the frame buffer
+  RECTL  SavedBitsRight;  // invisible part right of screen
+  RECTL  SavedBitsBottom; // invisible part at the bottom of the screen
+  BOOL   BitsSaved;       // TRUE if bits are currently saved
+  SIZEL  sizeMem;         // actual size (in pixels) of video memory
+  LONG   NumScansUsedByPointer; // # scans of offscreen memory used by
+
+} PDEV, *PPDEV;
+
+typedef struct {
+  RECTL BankBounds; // Pixels addressable in this bank
+  ULONG BankOffset; // Offset of bank start from bitmap start if linearly addressable
+} BANK_INFO, *PBANK_INFO;
+
+typedef enum {
+  JustifyTop = 0,
+  JustifyBottom,
+} BANK_JUST;
+
+// bank control function vector
+//typedef VOID (*PFN_BankControl)(PDEVSURF, ULONG, BANK_JUST);
+typedef VOID (*PFN_BankControl)(PVOID, ULONG, BANK_JUST);
+
+// DEVSURF -- definition of a surface as seen and used by the various VGA
+// drivers
+
+typedef struct _DEVSURF
+{
+  IDENT ident;  // Identifier for debugging ease
+  ULONG flSurf; // DS_ flags as defined below
+  BYTE  Color;  // Solid color surface if DS_SOLIDBRUSH
+
+// If DS_SOLIDBRUSH, the following fields are undefined and not guaranteed to
+// have been allocated!
+
+  BYTE  Format;     // BMF_*, BMF_PHYSDEVICE
+  BYTE  jReserved1; // Reserved
+  BYTE  jReserved2; // Reserved
+  PPDEV ppdev;      // Pointer to associated PDEV
+  SIZEL sizeSurf;   // Size of the surface
+  ULONG NextScan;   // Offset from scan  "n" to "n+1"
+  ULONG NextPlane;  // Offset from plane "n" to "n+1"
+  PVOID Scan0;      // Pointer to scan 0 of bitmap
+                    // (actual address of start of bank, for banked VGA surface)
+  PVOID StartBmp;   // Pointer to start of bitmap
+  PVOID Conv;       // Pointer to DIB/Planer conversion buffer
+
+// Banking variables; used only for banked VGA surfaces
+
+  PVIDEO_BANK_SELECT BankSelectInfo;
+  ULONG       Bank2RWSkip;            // Offset from one bank index to next to make two 32K banks appear to be
+                                      // one seamless 64K bank
+  PFN         pfnBankSwitchCode;
+  VIDEO_BANK_TYPE BankingType;
+  ULONG       BitmapSize;             // Length of bitmap if there were no banking, in CPU addressable bytes
+  ULONG PtrBankScan;       // Last scan line in pointer work bank
+  RECTL WindowClip1;       // Single-window banking clip rect
+  RECTL WindowClip2[2];    // Double-window banking clip rects for
+                           //  windows 0 & 1
+  ULONG WindowBank[2];     // Current banks mapped into windows
+                           //  0 & 1 (used in 2 window mode only)
+  PBANK_INFO  BankInfo;         // Pointer to array of bank clip info
+  ULONG       BankInfoLength;    // Length of pbiBankInfo, in entries
+  PBANK_INFO  BankInfo2RW;      // Same as above, but for 2RW window
+  ULONG       BankInfo2RWLength; // case
+  PFN_BankControl pfnBankControl;     // Pointer to bank control function
+  PFN_BankControl pfnBankControl2Window; // Pointer to double-window bank
+                                      //  control function
+  PVOID BitmapStart;   // Single-window bitmap start pointer (adjusted as
+                       // necessary to make window map in at proper offset)
+  PVOID BitmapStart2Window[2];   // Double-window window 0 and 1 bitmap start
+  PVOID BankBufferPlane0;        // Pointer to temp buffer capable of
+                                 // storing one full bank for plane 0 for 1
+                                 // R/W case; capable of storing  one full
+                                 // bank height of edge bytes for all four
+                                 // planes for the 1R/1W case. Also used to
+                                 // point to text building buffer in all
+                                 // cases. This is the pointer used to
+                                 // dealloc bank working storage for all
+                                 // four planes
+
+  // The following 3 pointers used by 1 R/W banked devices
+  PVOID       BankBufferPlane1; // Like above, but for plane 1
+  PVOID       BankBufferPlane2; // Like above, but for plane 2
+  PVOID       BankBufferPlane3; // Like above, but for plane 3
+  ULONG       TempBufferSize;   // Full size of temp buffer pointed to
+                                // by pvBankBufferPlane0
+
+  ULONG       ajBits[1];           // Bits will start here for device bitmaps
+  PSAVED_SCREEN_BITS ssbList;      // Pointer to start of linked list of
+                                    //  saved screen bit blocks
+} DEVSURF, *PDEVSURF;
+
+typedef VOID (*PFN_ScreenToScreenBlt)(PDEVSURF, PRECTL, PPOINTL, INT);
+
+// BMF_PHYSDEVICE format type
+
+#define BMF_PHYSDEVICE  0xFF
+#define BMF_DFB         0xFE
+
+// Identifiers used in debugging (DEVSURF.ident)
+
+#define PDEV_IDENT      ('V' + ('P' << 8) + ('D' << 16) + ('V' << 24))
+#define DEVSURF_IDENT   ('V' + ('S' << 8) + ('R' << 16) + ('F' << 24))
+
+BOOL InitVGA(PPDEV ppdev, BOOL bFirst); // screen.c: initialize VGA mode
+BOOL DeinitVGA(PPDEV ppdev); // screen.c: Free resources allocated in InitVGA
+
+#define DRIVER_EXTRA_SIZE 0
+#define ALLOC_TAG  'agvD' // Dvga tag
+#define DLL_NAME  L"vga" // DLL name in Unicode
+
+#define MAX_SCAN_WIDTH              2048  // pixels
+#define DRIVER_OFFSCREEN_REFRESHED  0x04L // if not set, don't use offscreen memory
+#define PLANAR_PELS_PER_CPU_ADDRESS 8
+#define PACKED_PELS_PER_CPU_ADDRESS 2
+
+BOOL VGAtoGDI(
+  SURFOBJ *Dest, SURFOBJ *Source, SURFOBJ *Mask, XLATEOBJ *ColorTranslation,
+  RECTL   *DestRect, POINTL *SourcePoint);
+
+VOID
+VGADDI_BltFromSavedScreenBits(ULONG DestX,
+                             ULONG DestY,
+                             PSAVED_SCREEN_BITS Src,
+                             ULONG SizeX,
+                             ULONG SizeY);
+VOID
+VGADDI_BltToSavedScreenBits(PSAVED_SCREEN_BITS Dest,
+                           ULONG SourceX,
+                           ULONG SourceY,
+                           ULONG SizeX,
+                           ULONG SizeY);
+VOID
+VGADDI_FreeSavedScreenBits(PSAVED_SCREEN_BITS SavedBits);
+PSAVED_SCREEN_BITS
+VGADDI_AllocSavedScreenBits(ULONG Size);
+VOID
+VGADDI_InitializeOffScreenMem(ULONG Start, ULONG Length);
+
+BOOL InitPointer(PPDEV ppdev);
+DWORD getAvailableModes(HANDLE Driver,
+                        PVIDEO_MODE_INFORMATION *modeInformation,
+                        DWORD *ModeSize);
+
+VOID FASTCALL
+vgaReadScan(int x, int y, int w, void *b);
+
+VOID FASTCALL
+vgaWriteScan(int x, int y, int w, void *b);
+
+#endif /* _VGADDI_PCH_ */