update for HEAD-2003091401
[reactos.git] / drivers / dd / vga / display / objects / screen.c
1 #include "../vgaddi.h"
2
3 static WORD PaletteBuffer[] = {
4    16, 0, // 16 entries, start with 0
5    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
6 };
7
8 static BYTE ColorBuffer[] = {
9   16, // 16 entries
10   0, 0,
11   0,  // start with 0
12   0x00, 0x00, 0x00, 0x00, // black
13   0x2A, 0x00, 0x15, 0x00, // red
14   0x00, 0x2A, 0x15, 0x00, // green
15   0x2A, 0x2A, 0x15, 0x00, // brown
16   0x00, 0x00, 0x2A, 0x00, // blue
17   0x2A, 0x15, 0x2A, 0x00, // magenta
18   0x15, 0x2A, 0x2A, 0x00, // cyan
19   0x21, 0x22, 0x23, 0x00, // dark gray
20   0x30, 0x31, 0x32, 0x00, // light gray
21   0x3F, 0x00, 0x00, 0x00, // bright red
22   0x00, 0x3F, 0x00, 0x00, // bright green
23   0x3F, 0x3F, 0x00, 0x00, // bright yellow
24   0x00, 0x00, 0x3F, 0x00, // bright blue
25   0x3F, 0x00, 0x3F, 0x00, // bright magenta
26   0x00, 0x3F, 0x3F, 0x00, // bright cyan
27   0x3F, 0x3F, 0x3F, 0x00  // bright white
28 };
29
30 DWORD getAvailableModes(HANDLE Driver,
31                         PVIDEO_MODE_INFORMATION *modeInformation,
32                         DWORD *ModeSize)
33 {
34   ULONG Temp;
35   VIDEO_NUM_MODES modes;
36   PVIDEO_MODE_INFORMATION VideoTemp;
37
38   // get number of modes supported
39   if (EngDeviceIoControl(Driver,
40                          IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES,
41                          NULL,
42                          0,
43                          &modes,
44                          sizeof(VIDEO_NUM_MODES),
45                          &Temp))
46   {
47     // get modes failed
48     return(0);
49   }
50
51   *ModeSize = modes.ModeInformationLength;
52
53   // allocate buffer for the mini-port to write the modes in
54   *modeInformation = (PVIDEO_MODE_INFORMATION)
55                       EngAllocMem(0, modes.NumModes *
56                                   modes.ModeInformationLength, ALLOC_TAG);
57
58   if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL)
59   {
60     // couldn't allocate buffer
61     return 0;
62   }
63
64   // Ask the mini-port to fill in the available modes.
65   if (EngDeviceIoControl(Driver,
66                          IOCTL_VIDEO_QUERY_AVAIL_MODES,
67                          NULL,
68                          0,
69                          *modeInformation,
70                          modes.NumModes * modes.ModeInformationLength,
71                          &Temp))
72   {
73     // failed to query modes
74     EngFreeMem(*modeInformation);
75     *modeInformation = (PVIDEO_MODE_INFORMATION) NULL;
76
77     return(0);
78   }
79
80   // Which modes supported by miniport driver are also suppoted by us, the
81   // display driver
82
83   Temp = modes.NumModes;
84   VideoTemp = *modeInformation;
85
86   // Reject mode if it's not 4 planes or not graphic or not 1 bits per pel
87   while (Temp--)
88   {
89     if ((VideoTemp->NumberOfPlanes != 4 ) ||
90         !(VideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) ||
91         (VideoTemp->BitsPerPlane != 1) ||
92         BROKEN_RASTERS(VideoTemp->ScreenStride, VideoTemp->VisScreenHeight))
93
94     {
95       VideoTemp->Length = 0;
96     }
97
98     VideoTemp = (PVIDEO_MODE_INFORMATION)(((PUCHAR)VideoTemp) + modes.ModeInformationLength);
99   }
100
101   return modes.NumModes;
102 }
103
104 BOOL InitVGA(PPDEV ppdev, BOOL bFirst)
105 {
106   ULONG ReturnedDataLength;
107   VIDEO_MEMORY VideoMemory;
108   VIDEO_MEMORY_INFORMATION VideoMemoryInfo;
109
110   char* vidmem;
111
112   ppdev->sizeSurf.cx = 640;
113   ppdev->sizeSurf.cy = 480;
114   ppdev->ModeNum = 12;
115
116   // Set the mode that was requested
117   if (EngDeviceIoControl(ppdev->KMDriver,
118                          IOCTL_VIDEO_SET_CURRENT_MODE,
119                          &ppdev->ModeNum,
120                          sizeof(VIDEO_MODE),
121                          NULL,
122                          0,
123                          &ReturnedDataLength)) {
124     return(FALSE);
125   }
126
127   // set up internal palette
128   if (EngDeviceIoControl(ppdev->KMDriver,
129                          IOCTL_VIDEO_SET_PALETTE_REGISTERS,
130                          (PVOID) PaletteBuffer,
131                          sizeof (PaletteBuffer),
132                          NULL,
133                          0,
134                          &ReturnedDataLength)) {
135      return(FALSE);
136   }
137
138   // set up the DAC
139   if (EngDeviceIoControl(ppdev->KMDriver,
140                           IOCTL_VIDEO_SET_COLOR_REGISTERS,
141                           (PVOID) ColorBuffer,
142                           sizeof (ColorBuffer),
143                           NULL,
144                           0,
145                           &ReturnedDataLength)) {
146     return(FALSE);
147   }
148
149 /*
150
151 gotta fix this up.. it prevents drawing to vidmem right now
152
153     if (bFirst) {
154       // map video memory into virtual memory
155       VideoMemory.RequestedVirtualAddress = NULL;
156
157       if (EngDeviceIoControl(ppdev->KMDriver,
158                              IOCTL_VIDEO_MAP_VIDEO_MEMORY,
159                              (PVOID) &VideoMemory,
160                              sizeof (VIDEO_MEMORY),
161                              (PVOID) &VideoMemoryInfo,
162                              sizeof (VideoMemoryInfo),
163                              &ReturnedDataLength)) {
164          // Failed to map to virtual memory
165          return (FALSE);
166       }
167
168       ppdev->fbScreen = VideoMemoryInfo.FrameBufferBase;
169    }
170 */
171   return TRUE;
172 }