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