e43474b24bf37615d67d6e6a6b3d42227d3d2cc8
[reactos.git] / reactos / win32ss / drivers / displays / vga / vgaddi.h
1 #define _WINBASE_
2 #define _WINDOWS_H
3 #include <stdarg.h>
4 #include <windef.h>
5 #include <wingdi.h>
6 #include <winddi.h>
7 #include <winioctl.h>
8 #include <ntddvdeo.h>
9 #include <ioaccess.h>
10
11 #include "vgavideo/vgavideo.h"
12
13 #ifndef NDEBUG
14 #define DPRINT DbgPrint
15 #else
16 #define DPRINT
17 #endif
18 #define DPRINT1 DbgPrint
19
20 /* FIXME - what a headers mess.... */
21
22 #define DDKFASTAPI __fastcall
23 #define FASTCALL __fastcall
24
25 ULONG DbgPrint(PCCH Format,...);
26
27 static __inline BOOLEAN
28 RemoveEntryList(
29 IN PLIST_ENTRY Entry)
30 {
31 PLIST_ENTRY OldFlink;
32 PLIST_ENTRY OldBlink;
33
34 OldFlink = Entry->Flink;
35 OldBlink = Entry->Blink;
36 OldFlink->Blink = OldBlink;
37 OldBlink->Flink = OldFlink;
38 return (OldFlink == OldBlink);
39 }
40
41 static __inline VOID
42 InsertHeadList(
43 IN PLIST_ENTRY ListHead,
44 IN PLIST_ENTRY Entry)
45 {
46 PLIST_ENTRY OldFlink;
47 OldFlink = ListHead->Flink;
48 Entry->Flink = OldFlink;
49 Entry->Blink = ListHead;
50 OldFlink->Blink = Entry;
51 ListHead->Flink = Entry;
52 }
53
54 static __inline VOID
55 InitializeListHead(
56 IN PLIST_ENTRY ListHead)
57 {
58 ListHead->Flink = ListHead->Blink = ListHead;
59 }
60
61 /***********************************************************/
62
63 #define DS_SOLIDBRUSH 0x00000001
64 #define DS_GREYBRUSH 0x00000002
65 #define DS_BRUSH 0x00000004
66 #define DS_DIB 0x00000008
67
68 #define POW2(stride) (!((stride) & ((stride)-1))) // TRUE if stride is power of 2
69 #define BROKEN_RASTERS(stride,cy) ((!(POW2(stride))) && ((stride*cy) > 0x10000))
70
71 #define ENUM_RECT_LIMIT 50
72
73 typedef struct _RECT_ENUM
74 {
75 ULONG c;
76 RECTL arcl[ENUM_RECT_LIMIT];
77 } RECT_ENUM;
78
79 // Cursor coordinates
80 typedef struct _XYPAIR
81 {
82 USHORT x;
83 USHORT y;
84 } XYPAIR;
85
86 typedef struct _SAVED_SCREEN_BITS
87 {
88 BOOL Free;
89 DWORD Offset;
90 ULONG Size;
91 LIST_ENTRY ListEntry;
92 } SAVED_SCREEN_BITS, *PSAVED_SCREEN_BITS;
93
94 // Cursor states
95 #define CURSOR_COLOR 0x00000004
96 #define CURSOR_HW 0x00000010
97 #define CURSOR_HW_ACTIVE 0x00000020
98 #define CURSOR_ANIMATE 0x00000040
99
100 typedef struct _PDEV
101 {
102 ULONG fl; // driver flags
103
104 // Handles
105 HANDLE KMDriver;
106 HDEV GDIDevHandle; // engine's handle to PDEV
107 HSURF SurfHandle; // engine's handle to surface
108 PVOID AssociatedSurf; // associated surface
109
110 // Cursor
111 XYPAIR xyHotSpot; // cursor hotspot
112
113 // Pointer
114 PVIDEO_POINTER_ATTRIBUTES pPointerAttributes; // HW Pointer Attributes
115 PSAVED_SCREEN_BITS ImageBehindCursor;
116 ULONG XorMaskStartOffset; // Start offset of hardware pointer
117 // XOR mask relative to AND mask for
118 // passing to HW pointer
119 DWORD PointerAttributes; // Size of buffer allocated
120 DWORD flPreallocSSBBufferInUse; // True if preallocated saved screen
121 // bits buffer is in use
122 PUCHAR pjPreallocSSBBuffer; // Pointer to preallocated saved screen
123 // bits buffer, if there is one
124 ULONG ulPreallocSSBSize; // Size of preallocated saved screen
125 // bits buffer
126 VIDEO_POINTER_CAPABILITIES PointerCapabilities; // HW pointer abilities
127 PUCHAR pucDIB4ToVGAConvBuffer; // DIB4->VGA conversion table buffer
128 PUCHAR pucDIB4ToVGAConvTables; // Pointer to DIB4->VGA conversion
129
130 // Misc
131 ULONG ModeNum; // mode index for current VGA mode
132
133 SIZEL sizeSurf; // displayed size of the surface
134 PBYTE fbScreen; // pointer to the frame buffer
135 RECTL SavedBitsRight; // invisible part right of screen
136 RECTL SavedBitsBottom; // invisible part at the bottom of the screen
137 BOOL BitsSaved; // TRUE if bits are currently saved
138 SIZEL sizeMem; // actual size (in pixels) of video memory
139 LONG NumScansUsedByPointer; // # scans of offscreen memory used by
140
141 } PDEV, *PPDEV;
142
143 typedef struct {
144 RECTL BankBounds; // Pixels addressable in this bank
145 ULONG BankOffset; // Offset of bank start from bitmap start if linearly addressable
146 } BANK_INFO, *PBANK_INFO;
147
148 typedef enum {
149 JustifyTop = 0,
150 JustifyBottom,
151 } BANK_JUST;
152
153 // bank control function vector
154 //typedef VOID (*PFN_BankControl)(PDEVSURF, ULONG, BANK_JUST);
155 typedef VOID (*PFN_BankControl)(PVOID, ULONG, BANK_JUST);
156
157 // DEVSURF -- definition of a surface as seen and used by the various VGA
158 // drivers
159
160 typedef struct _DEVSURF
161 {
162 IDENT ident; // Identifier for debugging ease
163 ULONG flSurf; // DS_ flags as defined below
164 BYTE Color; // Solid color surface if DS_SOLIDBRUSH
165
166 // If DS_SOLIDBRUSH, the following fields are undefined and not guaranteed to
167 // have been allocated!
168
169 BYTE Format; // BMF_*, BMF_PHYSDEVICE
170 BYTE jReserved1; // Reserved
171 BYTE jReserved2; // Reserved
172 PPDEV ppdev; // Pointer to associated PDEV
173 SIZEL sizeSurf; // Size of the surface
174 ULONG NextScan; // Offset from scan "n" to "n+1"
175 ULONG NextPlane; // Offset from plane "n" to "n+1"
176 PVOID Scan0; // Pointer to scan 0 of bitmap
177 // (actual address of start of bank, for banked VGA surface)
178 PVOID StartBmp; // Pointer to start of bitmap
179 PVOID Conv; // Pointer to DIB/Planer conversion buffer
180
181 // Banking variables; used only for banked VGA surfaces
182
183 PVIDEO_BANK_SELECT BankSelectInfo;
184 ULONG Bank2RWSkip; // Offset from one bank index to next to make two 32K banks appear to be
185 // one seamless 64K bank
186 PFN pfnBankSwitchCode;
187 VIDEO_BANK_TYPE BankingType;
188 ULONG BitmapSize; // Length of bitmap if there were no banking, in CPU addressable bytes
189 ULONG PtrBankScan; // Last scan line in pointer work bank
190 RECTL WindowClip1; // Single-window banking clip rect
191 RECTL WindowClip2[2]; // Double-window banking clip rects for
192 // windows 0 & 1
193 ULONG WindowBank[2]; // Current banks mapped into windows
194 // 0 & 1 (used in 2 window mode only)
195 PBANK_INFO BankInfo; // Pointer to array of bank clip info
196 ULONG BankInfoLength; // Length of pbiBankInfo, in entries
197 PBANK_INFO BankInfo2RW; // Same as above, but for 2RW window
198 ULONG BankInfo2RWLength; // case
199 PFN_BankControl pfnBankControl; // Pointer to bank control function
200 PFN_BankControl pfnBankControl2Window; // Pointer to double-window bank
201 // control function
202 PVOID BitmapStart; // Single-window bitmap start pointer (adjusted as
203 // necessary to make window map in at proper offset)
204 PVOID BitmapStart2Window[2]; // Double-window window 0 and 1 bitmap start
205 PVOID BankBufferPlane0; // Pointer to temp buffer capable of
206 // storing one full bank for plane 0 for 1
207 // R/W case; capable of storing one full
208 // bank height of edge bytes for all four
209 // planes for the 1R/1W case. Also used to
210 // point to text building buffer in all
211 // cases. This is the pointer used to
212 // dealloc bank working storage for all
213 // four planes
214
215 // The following 3 pointers used by 1 R/W banked devices
216 PVOID BankBufferPlane1; // Like above, but for plane 1
217 PVOID BankBufferPlane2; // Like above, but for plane 2
218 PVOID BankBufferPlane3; // Like above, but for plane 3
219 ULONG TempBufferSize; // Full size of temp buffer pointed to
220 // by pvBankBufferPlane0
221
222 ULONG ajBits[1]; // Bits will start here for device bitmaps
223 PSAVED_SCREEN_BITS ssbList; // Pointer to start of linked list of
224 // saved screen bit blocks
225 } DEVSURF, *PDEVSURF;
226
227 typedef VOID (*PFN_ScreenToScreenBlt)(PDEVSURF, PRECTL, PPOINTL, INT);
228
229 // BMF_PHYSDEVICE format type
230
231 #define BMF_PHYSDEVICE 0xFF
232 #define BMF_DFB 0xFE
233
234 // Identifiers used in debugging (DEVSURF.ident)
235
236 #define PDEV_IDENT ('V' + ('P' << 8) + ('D' << 16) + ('V' << 24))
237 #define DEVSURF_IDENT ('V' + ('S' << 8) + ('R' << 16) + ('F' << 24))
238
239 BOOL InitVGA(PPDEV ppdev, BOOL bFirst); // screen.c: initialize VGA mode
240 BOOL DeinitVGA(PPDEV ppdev); // screen.c: Free resources allocated in InitVGA
241
242 #define DRIVER_EXTRA_SIZE 0
243 #define ALLOC_TAG 'agvD' // Dvga tag
244 #define DLL_NAME L"vga" // DLL name in Unicode
245
246 #define MAX_SCAN_WIDTH 2048 // pixels
247 #define DRIVER_OFFSCREEN_REFRESHED 0x04L // if not set, don't use offscreen memory
248 #define PLANAR_PELS_PER_CPU_ADDRESS 8
249 #define PACKED_PELS_PER_CPU_ADDRESS 2
250
251 BOOL VGAtoGDI(
252 SURFOBJ *Dest, SURFOBJ *Source, SURFOBJ *Mask, XLATEOBJ *ColorTranslation,
253 RECTL *DestRect, POINTL *SourcePoint);
254
255 VOID
256 VGADDI_BltFromSavedScreenBits(ULONG DestX,
257 ULONG DestY,
258 PSAVED_SCREEN_BITS Src,
259 ULONG SizeX,
260 ULONG SizeY);
261 VOID
262 VGADDI_BltToSavedScreenBits(PSAVED_SCREEN_BITS Dest,
263 ULONG SourceX,
264 ULONG SourceY,
265 ULONG SizeX,
266 ULONG SizeY);
267 VOID
268 VGADDI_FreeSavedScreenBits(PSAVED_SCREEN_BITS SavedBits);
269 PSAVED_SCREEN_BITS
270 VGADDI_AllocSavedScreenBits(ULONG Size);
271 VOID
272 VGADDI_InitializeOffScreenMem(ULONG Start, ULONG Length);
273
274 BOOL InitPointer(PPDEV ppdev);
275 DWORD getAvailableModes(HANDLE Driver,
276 PVIDEO_MODE_INFORMATION *modeInformation,
277 DWORD *ModeSize);
278
279 VOID FASTCALL
280 vgaReadScan(int x, int y, int w, void *b);
281
282 VOID FASTCALL
283 vgaWriteScan(int x, int y, int w, void *b);