mirror of
https://github.com/reactos/reactos.git
synced 2024-08-31 07:38:48 +00:00
289 lines
9.5 KiB
C
289 lines
9.5 KiB
C
#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_ */
|