1 /*
2  * PROJECT:         ReactOS VGA display driver
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * FILE:            win32ss/drivers/displays/vga/main/enable.c
5  * PURPOSE:
6  * PROGRAMMERS:
7  */
8 
9 #include <vgaddi.h>
10 
11 static BOOL VGAInitialized = FALSE;
12 
13 static DRVFN FuncList[] =
14 {
15     /* Required Display driver fuctions */
16     {INDEX_DrvAssertMode, (PFN) DrvAssertMode},
17     {INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV},
18     {INDEX_DrvCopyBits, (PFN) DrvCopyBits},
19     {INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV},
20     {INDEX_DrvDisableSurface, (PFN) DrvDisableSurface},
21     {INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV},
22     {INDEX_DrvEnableSurface, (PFN) DrvEnableSurface},
23     {INDEX_DrvGetModes, (PFN) DrvGetModes},
24     {INDEX_DrvLineTo, (PFN) DrvLineTo},
25     {INDEX_DrvPaint, (PFN) DrvPaint},
26     {INDEX_DrvBitBlt, (PFN) DrvBitBlt},
27     {INDEX_DrvTransparentBlt, (PFN) DrvTransparentBlt},
28     {INDEX_DrvMovePointer, (PFN) DrvMovePointer},
29     {INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape},
30 
31 #if 0
32     /* Optional Display driver functions */
33     {INDEX_, },
34     {INDEX_DescribePixelFormat, (PFN) VGADDIDescribePixelFormat},
35     {INDEX_DrvDitherColor, (PFN) VGADDIDitherColor},
36     {INDEX_DrvFillPath, (PFN) VGADDIFillPath},
37     {INDEX_DrvGetTrueTypeFile, (PFN) VGADDIGetTrueTypeFile},
38     {INDEX_DrvLoadFontFile, (PFN) VGADDILoadFontFile},
39     {INDEX_DrvQueryFont, (PFN) VGADDIQueryFont},
40     {INDEX_DrvQueryFontCaps, (PFN) VGADDIQueryFontCaps},
41     {INDEX_DrvQueryFontData, (PFN) VGADDIQueryFontData},
42     {INDEX_DrvQueryFontFile, (PFN) VGADDIQueryFontFile},
43     {INDEX_DrvQueryFontTree, (PFN) VGADDIQueryFontTree},
44     {INDEX_DrvQueryTrueTypeOutline, (PFN) VGADDIQueryTrueTypeOutline},
45     {INDEX_DrvQueryTrueTypeTable, (PFN) VGADDIQueryTrueTypeTable},
46     {INDEX_DrvRealizeBrush, (PFN) VGADDIRealizeBrush},
47     {INDEX_DrvResetPDEV, (PFN) VGADDIResetPDEV},
48     {INDEX_DrvSetPalette, (PFN) VGADDISetPalette},
49     {INDEX_DrvSetPixelFormat, (PFN) VGADDISetPixelFormat},
50     {INDEX_DrvStretchBlt, (PFN) VGADDIStretchBlt},
51     {INDEX_DrvStrokePath, (PFN) VGADDIStrokePath},
52     {INDEX_DrvSwapBuffers, (PFN) VGADDISwapBuffers},
53     {INDEX_DrvTextOut, (PFN) VGADDITextOut},
54     {INDEX_DrvUnloadFontFile, (PFN) VGADDIUnloadFontFile},
55 #endif
56 };
57 
58 static GDIINFO gaulCap = {
59     GDI_DRIVER_VERSION,    // ulVersion
60     DT_RASDISPLAY,         // ulTechnology
61     0,                     // ulHorzSize
62     0,                     // ulVertSize
63     0,                     // ulHorzRes (filled in at initialization)
64     0,                     // ulVertRes (filled in at initialization)
65     4,                     // cBitsPixel
66     1,                     // cPlanes
67     16,                    // ulNumColors
68     0,                     // flRaster (DDI reserved field)
69 
70     96,                    // ulLogPixelsX (must be set to 96 according to MSDN)
71     96,                    // ulLogPixelsY (must be set to 96 according to MSDN)
72 
73     TC_RA_ABLE | TC_SCROLLBLT,  // flTextCaps
74 
75     6,                     // ulDACRed
76     6,                     // ulDACGreen
77     6,                     // ulDACBlue
78 
79     0x0024,                // ulAspectX  (one-to-one aspect ratio)
80     0x0024,                // ulAspectY
81     0x0033,                // ulAspectXY
82 
83     1,                     // xStyleStep
84     1,                     // yStyleSte;
85     3,                     // denStyleStep
86 
87     { 0, 0 },              // ptlPhysOffset
88     { 0, 0 },              // szlPhysSize
89 
90     0,                     // ulNumPalReg (win3.1 16 color drivers say 0 too)
91 
92 // These fields are for halftone initialization.
93 
94     {                                         // ciDevice, ColorInfo
95         { 6700, 3300, 0 },                      // Red
96         { 2100, 7100, 0 },                      // Green
97         { 1400,  800, 0 },                      // Blue
98         { 1750, 3950, 0 },                      // Cyan
99         { 4050, 2050, 0 },                      // Magenta
100         { 4400, 5200, 0 },                      // Yellow
101         { 3127, 3290, 0 },                      // AlignmentWhite
102         20000,                                  // RedGamma
103         20000,                                  // GreenGamma
104         20000,                                  // BlueGamma
105         0, 0, 0, 0, 0, 0
106     },
107 
108     0,                                         // ulDevicePelsDPI
109     PRIMARY_ORDER_CBA,                         // ulPrimaryOrder
110     HT_PATSIZE_4x4_M,                          // ulHTPatternSize
111     HT_FORMAT_4BPP_IRGB,                       // ulHTOutputFormat
112     HT_FLAG_ADDITIVE_PRIMS,                    // flHTFlags
113 
114     0,                                         // ulVRefresh
115     8,                                         // ulBltAlignment
116     0,                                         // ulPanningHorzRes
117     0,                                         // ulPanningVertRes
118 
119     0,                                         // xPanningAlignment
120     0,                                         // yPanningAlignment
121     0,                                         // cxHTPat
122     0,                                         // cyHTPat
123     NULL,                                      // pHTPatA
124     NULL,                                      // pHTPatB
125     NULL,                                      // pHTPatC
126     0,                                         // flShadeBlend
127     0,                                         // ulPhysicalPixelCharacteristics
128     0                                          // ulPhysicalPixelGamma
129 };
130 
131 // Palette for VGA
132 
133 typedef struct _VGALOGPALETTE
134 {
135     USHORT ident;
136     USHORT NumEntries;
137     PALETTEENTRY PaletteEntry[16];
138 } VGALOGPALETTE;
139 
140 const VGALOGPALETTE VGApalette =
141 {
142 
143     0x400,  // driver version
144     16,     // num entries
145     {
146         { 0x00, 0x00, 0x00, 0x00 }, // 0
147         { 0x80, 0x00, 0x00, 0x00 }, // 1
148         { 0x00, 0x80, 0x00, 0x00 }, // 2
149         { 0x80, 0x80, 0x00, 0x00 }, // 3
150         { 0x00, 0x00, 0x80, 0x00 }, // 4
151         { 0x80, 0x00, 0x80, 0x00 }, // 5
152         { 0x00, 0x80, 0x80, 0x00 }, // 6
153         { 0x80, 0x80, 0x80, 0x00 }, // 7
154         { 0xc0, 0xc0, 0xc0, 0x00 }, // 8
155         { 0xff, 0x00, 0x00, 0x00 }, // 9
156         { 0x00, 0xff, 0x00, 0x00 }, // 10
157         { 0xff, 0xff, 0x00, 0x00 }, // 11
158         { 0x00, 0x00, 0xff, 0x00 }, // 12
159         { 0xff, 0x00, 0xff, 0x00 }, // 13
160         { 0x00, 0xff, 0xff, 0x00 }, // 14
161         { 0xff, 0xff, 0xff, 0x00 } // 15
162     }
163 };
164 
165 // Devinfo structure passed back to the engine in DrvEnablePDEV
166 
167 #define SYSTM_LOGFONT {16,7,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,VARIABLE_PITCH | FF_DONTCARE, L"System"}
168 #define HELVE_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,VARIABLE_PITCH | FF_DONTCARE, L"MS Sans Serif"}
169 #define COURI_LOGFONT {12,9,0,0,400,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_STROKE_PRECIS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE, L"Courier"}
170 
171 DEVINFO devinfoVGA =
172 {
173     (GCAPS_OPAQUERECT | GCAPS_HORIZSTRIKE | GCAPS_ALTERNATEFILL | GCAPS_MONO_DITHER | GCAPS_COLOR_DITHER |
174      GCAPS_WINDINGFILL | GCAPS_DITHERONREALIZE
175     ),       // Graphics capabilities
176 
177     SYSTM_LOGFONT,  // Default font description
178     HELVE_LOGFONT,  // ANSI variable font description
179     COURI_LOGFONT,  // ANSI fixed font description
180     0,              // Count of device fonts
181     BMF_4BPP,       // preferred DIB format
182     8,              // Width of color dither
183     8,              // Height of color dither
184     NULL,           // Default palette to use for this device
185     0               // flGraphicsCaps2
186 };
187 
188 BOOL APIENTRY
189 DrvEnableDriver(IN ULONG EngineVersion,
190                 IN ULONG SizeOfDED,
191                 OUT PDRVENABLEDATA DriveEnableData)
192 {
193     DPRINT("DrvEnableDriver called...\n");
194 
195     vgaPreCalc();
196 
197     VGADDI_InitializeOffScreenMem((SCREEN_X * SCREEN_Y) >> 3, 65536 - ((SCREEN_X * SCREEN_Y) >> 3));
198 
199     DriveEnableData->pdrvfn = FuncList;
200     DriveEnableData->c = sizeof(FuncList) / sizeof(DRVFN);
201     DriveEnableData->iDriverVersion = DDI_DRIVER_VERSION_NT4;
202 
203     return  TRUE;
204 }
205 
206 //    DrvDisableDriver
207 //  DESCRIPTION:
208 //    This function is called by the KMGDI at exit.  It should cleanup.
209 //  ARGUMENTS:
210 //    NONE
211 //  RETURNS:
212 //    NONE
213 
214 VOID APIENTRY
215 DrvDisableDriver(VOID)
216 {
217     return;
218 }
219 
220 //  -----------------------------------------------  Driver Implementation
221 
222 
223 //    DrvEnablePDEV
224 //  DESCRIPTION:
225 //    This function is called after DrvEnableDriver to get information
226 //    about the mode that is to be used.  This function just returns
227 //    information, and should not yet initialize the mode.
228 //  ARGUMENTS:
229 //    IN DEVMODEW *  DM            Describes the mode requested
230 //    IN LPWSTR      LogAddress
231 //    IN ULONG       PatternCount  number of patterns expected
232 //    OUT HSURF *    SurfPatterns  array to contain pattern handles
233 //    IN ULONG       GDIInfoSize   the size of the GDIInfo object passed in
234 //    OUT ULONG *    GDIInfo       GDI Info object
235 //    IN ULONG       DevInfoSize   the size of the DevInfo object passed in
236 //    OUT ULONG *    DevInfo       Device Info object
237 //    IN LPWSTR      DevDataFile   ignore
238 //    IN LPWSTR      DeviceName    Device name
239 //    IN HANDLE      Driver        handle to KM driver
240 //  RETURNS:
241 //    DHPDEV  a handle to a DPev object
242 
243 DHPDEV APIENTRY
244 DrvEnablePDEV(IN DEVMODEW *DM,
245               IN LPWSTR LogAddress,
246               IN ULONG PatternCount,
247               OUT HSURF *SurfPatterns,
248               IN ULONG GDIInfoSize,
249               OUT ULONG *GDIInfo,
250               IN ULONG DevInfoSize,
251               OUT DEVINFO *DevInfo,
252               IN HDEV Dev,
253               IN LPWSTR DeviceName,
254               IN HANDLE Driver)
255 {
256     PPDEV  PDev;
257 
258     PDev = EngAllocMem(FL_ZERO_MEMORY, sizeof(PDEV), ALLOC_TAG);
259     if (PDev == NULL)
260     {
261         DPRINT1("EngAllocMem failed for PDEV\n");
262         return NULL;
263     }
264     PDev->KMDriver = Driver;
265     DPRINT( "PDev: %x, Driver: %x\n", PDev, PDev->KMDriver );
266 
267     gaulCap.ulHorzRes = SCREEN_X;
268     gaulCap.ulVertRes = SCREEN_Y;
269     if (sizeof(GDIINFO) < GDIInfoSize)
270         GDIInfoSize = sizeof(GDIINFO);
271     memcpy(GDIInfo, &gaulCap, GDIInfoSize);
272     DM->dmBitsPerPel = gaulCap.cBitsPixel * gaulCap.cPlanes;
273     DM->dmPelsWidth = gaulCap.ulHorzRes;
274     DM->dmPelsHeight = gaulCap.ulVertRes;
275 
276     devinfoVGA.hpalDefault = EngCreatePalette(PAL_INDEXED, 16, (ULONG *) VGApalette.PaletteEntry, 0, 0, 0);
277     if (sizeof(DEVINFO) < DevInfoSize)
278         DevInfoSize = sizeof(DEVINFO);
279     memcpy(DevInfo, &devinfoVGA, DevInfoSize);
280 
281     return (DHPDEV) PDev;
282 }
283 
284 
285 //    DrvCompletePDEV
286 //  DESCRIPTION
287 //    Called after initialization of PDEV is complete.  Supplies
288 //    a reference to the GDI handle for the PDEV.
289 
290 VOID APIENTRY
291 DrvCompletePDEV(IN DHPDEV PDev,
292                 IN HDEV Dev)
293 {
294     ((PPDEV) PDev)->GDIDevHandle = Dev; // Handle to the DC
295 }
296 
297 
298 BOOL APIENTRY
299 DrvAssertMode(IN DHPDEV DPev,
300               IN BOOL Enable)
301 {
302     PPDEV ppdev = (PPDEV)DPev;
303     ULONG returnedDataLength;
304 
305     if (Enable)
306     {
307         /* Reenable our graphics mode */
308         if (!InitPointer(ppdev))
309         {
310             /* Failed to set pointer */
311             return FALSE;
312         }
313 
314         if (!VGAInitialized)
315         {
316             if (!InitVGA(ppdev, FALSE))
317             {
318                 /* Failed to initialize the VGA */
319                 return FALSE;
320             }
321             VGAInitialized = TRUE;
322       }
323     }
324     else
325     {
326         /* Go back to last known mode */
327         DPRINT( "ppdev: %x, KMDriver: %x", ppdev, ppdev->KMDriver );
328         if (EngDeviceIoControl(ppdev->KMDriver, IOCTL_VIDEO_RESET_DEVICE, NULL, 0, NULL, 0, &returnedDataLength))
329         {
330             /* Failed to go back to mode */
331             return FALSE;
332         }
333         VGAInitialized = FALSE;
334     }
335     return TRUE;
336 }
337 
338 
339 VOID APIENTRY
340 DrvDisablePDEV(IN DHPDEV PDev)
341 {
342     PPDEV ppdev = (PPDEV)PDev;
343 
344     /*  EngDeletePalette(devinfoVGA.hpalDefault); */
345     if (ppdev->pjPreallocSSBBuffer)
346         EngFreeMem(ppdev->pjPreallocSSBBuffer);
347 
348     if (ppdev->pucDIB4ToVGAConvBuffer)
349         EngFreeMem(ppdev->pucDIB4ToVGAConvBuffer);
350 
351     DPRINT("Freeing PDEV\n");
352     EngFreeMem(PDev);
353 }
354 
355 
356 VOID APIENTRY
357 DrvDisableSurface(IN DHPDEV PDev)
358 {
359     PPDEV ppdev = (PPDEV)PDev;
360     PDEVSURF pdsurf = ppdev->AssociatedSurf;
361 
362     DPRINT("KMDriver: %x\n", ppdev->KMDriver);
363     DeinitVGA(ppdev);
364     /* EngFreeMem(pdsurf->BankSelectInfo); */
365 
366     if (pdsurf->BankInfo != NULL)
367         EngFreeMem(pdsurf->BankInfo);
368     if (pdsurf->BankInfo2RW != NULL)
369         EngFreeMem(pdsurf->BankInfo2RW);
370     if (pdsurf->BankBufferPlane0 != NULL)
371         EngFreeMem(pdsurf->BankBufferPlane0);
372     if (ppdev->pPointerAttributes != NULL)
373         EngFreeMem(ppdev->pPointerAttributes);
374 
375     /* free any pending saved screen bit blocks */
376 #if 0
377     pSSB = pdsurf->ssbList;
378     while (pSSB != (PSAVED_SCREEN_BITS) NULL)
379     {
380         /* Point to the next saved screen bits block */
381         pSSBNext = (PSAVED_SCREEN_BITS) pSSB->pvNextSSB;
382 
383         /* Free the current block */
384         EngFreeMem(pSSB);
385         pSSB = pSSBNext;
386     }
387 #endif
388     EngDeleteSurface((HSURF) ppdev->SurfHandle);
389     /* EngFreeMem(pdsurf); */ /* free the surface */
390 }
391 
392 
393 static VOID
394 InitSavedBits(IN PPDEV ppdev)
395 {
396     if (!(ppdev->fl & DRIVER_OFFSCREEN_REFRESHED))
397         return;
398 
399     /* set up rect to right of visible screen */
400     ppdev->SavedBitsRight.left   = ppdev->sizeSurf.cx;
401     ppdev->SavedBitsRight.top    = 0;
402     ppdev->SavedBitsRight.right  = ppdev->sizeMem.cx - PLANAR_PELS_PER_CPU_ADDRESS;
403     ppdev->SavedBitsRight.bottom = ppdev->sizeSurf.cy;
404 
405     if ((ppdev->SavedBitsRight.right <= ppdev->SavedBitsRight.left) ||
406         (ppdev->SavedBitsRight.bottom <= ppdev->SavedBitsRight.top))
407     {
408         ppdev->SavedBitsRight.left   = 0;
409         ppdev->SavedBitsRight.top    = 0;
410         ppdev->SavedBitsRight.right  = 0;
411         ppdev->SavedBitsRight.bottom = 0;
412     }
413 
414     /* set up rect below visible screen */
415     ppdev->SavedBitsBottom.left   = 0;
416     ppdev->SavedBitsBottom.top    = ppdev->sizeSurf.cy;
417     ppdev->SavedBitsBottom.right  = ppdev->sizeMem.cx - PLANAR_PELS_PER_CPU_ADDRESS;
418     ppdev->SavedBitsBottom.bottom = ppdev->sizeMem.cy - ppdev->NumScansUsedByPointer;
419 
420     if ((ppdev->SavedBitsBottom.right <= ppdev->SavedBitsBottom.left) ||
421         (ppdev->SavedBitsBottom.bottom <= ppdev->SavedBitsBottom.top))
422     {
423         ppdev->SavedBitsBottom.left   = 0;
424         ppdev->SavedBitsBottom.top    = 0;
425         ppdev->SavedBitsBottom.right  = 0;
426         ppdev->SavedBitsBottom.bottom = 0;
427     }
428 
429     ppdev->BitsSaved = FALSE;
430 }
431 
432 
433 HSURF APIENTRY
434 DrvEnableSurface(IN DHPDEV PDev)
435 {
436     PPDEV ppdev = (PPDEV)PDev;
437     PDEVSURF pdsurf;
438     DHSURF dhsurf;
439     HSURF hsurf;
440 
441     DPRINT("DrvEnableSurface() called\n");
442 
443     /* Initialize the VGA */
444     if (!VGAInitialized)
445     {
446         if (!InitVGA(ppdev, TRUE))
447             goto error_done;
448         VGAInitialized = TRUE;
449     }
450 
451     /* dhsurf is of type DEVSURF, which is the drivers specialized surface type */
452     dhsurf = (DHSURF)EngAllocMem(0, sizeof(DEVSURF), ALLOC_TAG);
453     if (dhsurf == (DHSURF) 0)
454         goto error_done;
455 
456     pdsurf = (PDEVSURF) dhsurf;
457     pdsurf->ident         = DEVSURF_IDENT;
458     pdsurf->flSurf        = 0;
459     pdsurf->Format        = BMF_PHYSDEVICE;
460     pdsurf->jReserved1    = 0;
461     pdsurf->jReserved2    = 0;
462     pdsurf->ppdev         = ppdev;
463     pdsurf->sizeSurf.cx   = ppdev->sizeSurf.cx;
464     pdsurf->sizeSurf.cy   = ppdev->sizeSurf.cy;
465     pdsurf->NextPlane     = 0;
466     pdsurf->Scan0         = ppdev->fbScreen;
467     pdsurf->BitmapStart   = ppdev->fbScreen;
468     pdsurf->StartBmp      = ppdev->fbScreen;
469     pdsurf->BankInfo      = NULL;
470     pdsurf->BankInfo2RW   = NULL;
471     pdsurf->BankBufferPlane0 = NULL;
472 
473 /*    pdsurf->Conv          = &ConvertBuffer[0]; */
474 
475     if (!InitPointer(ppdev))
476     {
477         DPRINT1("DrvEnablePDEV failed bInitPointer\n");
478         goto error_clean;
479      }
480 
481 /*    if (!SetUpBanking(pdsurf, ppdev))
482     {
483         DPRINT1("DrvEnablePDEV failed SetUpBanking\n");
484         goto error_clean;
485     } BANKING CODE UNIMPLEMENTED */
486 
487     if ((hsurf = EngCreateDeviceSurface(dhsurf, ppdev->sizeSurf, BMF_4BPP)) ==
488         (HSURF)0)
489     {
490         /* Call to EngCreateDeviceSurface failed */
491         DPRINT("EngCreateDeviceSurface call failed\n");
492         goto error_clean;
493     }
494 
495     InitSavedBits(ppdev);
496 
497     if (EngAssociateSurface(hsurf, ppdev->GDIDevHandle, HOOK_BITBLT | HOOK_PAINT | HOOK_LINETO | HOOK_COPYBITS |
498         HOOK_TRANSPARENTBLT))
499     {
500         DPRINT("Successfully associated surface\n");
501         ppdev->SurfHandle = hsurf;
502         ppdev->AssociatedSurf = pdsurf;
503 
504        /* Set up an empty saved screen block list */
505        pdsurf->ssbList = NULL;
506 
507       return hsurf;
508     }
509     DPRINT("EngAssociateSurface() failed\n");
510     EngDeleteSurface(hsurf);
511 
512 error_clean:
513     EngFreeMem(dhsurf);
514 
515 error_done:
516     return (HSURF)0;
517 }
518 
519 
520 ULONG APIENTRY
521 DrvGetModes(IN HANDLE Driver,
522             IN ULONG DataSize,
523             OUT PDEVMODEW DM)
524 {
525     DWORD NumModes;
526     DWORD ModeSize;
527     DWORD OutputSize;
528     DWORD OutputModes = DataSize / (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
529     PVIDEO_MODE_INFORMATION VideoModeInformation, VideoTemp;
530 
531     NumModes = getAvailableModes(Driver,
532                                  (PVIDEO_MODE_INFORMATION *) &VideoModeInformation,
533                                  &ModeSize);
534 
535     if (NumModes == 0)
536         return 0;
537 
538     if (DM == NULL)
539     {
540         OutputSize = NumModes * (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
541     }
542     else
543     {
544         OutputSize=0;
545         VideoTemp = VideoModeInformation;
546 
547         do
548         {
549             if (VideoTemp->Length != 0)
550             {
551                 if (OutputModes == 0)
552                     break;
553 
554                 memset(DM, 0, sizeof(DEVMODEW));
555                 memcpy(DM->dmDeviceName, DLL_NAME, sizeof(DLL_NAME));
556 
557                 DM->dmSpecVersion      = DM_SPECVERSION;
558                 DM->dmDriverVersion    = DM_SPECVERSION;
559                 DM->dmSize             = sizeof(DEVMODEW);
560                 DM->dmDriverExtra      = DRIVER_EXTRA_SIZE;
561                 DM->dmBitsPerPel       = VideoTemp->NumberOfPlanes *
562                                          VideoTemp->BitsPerPlane;
563                 DM->dmPelsWidth        = VideoTemp->VisScreenWidth;
564                 DM->dmPelsHeight       = VideoTemp->VisScreenHeight;
565                 DM->dmDisplayFrequency = VideoTemp->Frequency;
566                 DM->dmDisplayFlags     = 0;
567 
568                 DM->dmFields           = DM_BITSPERPEL       |
569                                          DM_PELSWIDTH        |
570                                          DM_PELSHEIGHT       |
571                                          DM_DISPLAYFREQUENCY |
572                                          DM_DISPLAYFLAGS     ;
573 
574                 /* next DEVMODE entry */
575                 OutputModes--;
576 
577                 DM = (PDEVMODEW) ( ((ULONG_PTR)DM) + sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
578 
579                 OutputSize += (sizeof(DEVMODEW) + DRIVER_EXTRA_SIZE);
580             }
581 
582             VideoTemp = (PVIDEO_MODE_INFORMATION)(((PUCHAR)VideoTemp) + ModeSize);
583 
584         } while (--NumModes);
585     }
586     return OutputSize;
587 }
588 
589 ULONG DbgPrint(PCCH Format,...)
590 {
591     va_list ap;
592     va_start(ap, Format);
593     EngDebugPrint("VGADDI", (PCHAR)Format, ap);
594     va_end(ap);
595     return 0;
596 }
597 
598 /* EOF */
599