#ifndef _VGADDI_PCH_ #define _VGADDI_PCH_ #define _WINBASE_ #define _INC_WINDOWS #include #include #include #include #include #include #include #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_ */