|
|
1.1 ! root 1: /******************************Module*Header*******************************\ ! 2: * Module Name: screen.c ! 3: * ! 4: * Initializes the GDIINFO and DEVINFO structures for DrvEnablePDEV. ! 5: * ! 6: * Copyright (C) 1991-1993 Microsoft Corporation. All rights reserved. ! 7: \**************************************************************************/ ! 8: ! 9: #include "driver.h" ! 10: #include "jzvxl484.h" ! 11: ! 12: // ! 13: // Define forward referenced prototypes. ! 14: // ! 15: ! 16: ! 17: BOOL ! 18: DrvpSetGammaColorPalette( ! 19: IN PPDEV ppdev, ! 20: IN WORD NumberOfEntries, ! 21: IN LDECI4 GammaRed, ! 22: IN LDECI4 GammaGreen, ! 23: IN LDECI4 GammaBlue ! 24: ); ! 25: ! 26: VIDEO_JAGUAR_INFO JaguarInfo; ! 27: ! 28: extern PJAGUAR_FIFO FifoRegs; ! 29: extern PJAGUAR_REGISTERS Jaguar; ! 30: ! 31: #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"} ! 32: #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"} ! 33: #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"} ! 34: ! 35: // ! 36: // This is the basic devinfo for a default driver. This is used as a base and customized based ! 37: // on information passed back from the miniport driver. ! 38: // ! 39: ! 40: const DEVINFO gDevInfoFrameBuffer = { ! 41: (GCAPS_OPAQUERECT | GCAPS_MONO_DITHER), // Graphics capabilities ! 42: SYSTM_LOGFONT, // Default font description ! 43: HELVE_LOGFONT, // ANSI variable font description ! 44: COURI_LOGFONT, // ANSI fixed font description ! 45: 0, // Count of device fonts ! 46: 0, // Preferred DIB format ! 47: 8, // Width of color dither ! 48: 8, // Height of color dither ! 49: 0 // Default palette to use for this device ! 50: }; ! 51: ! 52: /******************************Public*Routine******************************\ ! 53: * bInitSURF ! 54: * ! 55: * Enables the surface. Maps the frame buffer into memory. ! 56: * ! 57: \**************************************************************************/ ! 58: ! 59: BOOL bInitSURF(PPDEV ppdev, BOOL bFirst) ! 60: { ! 61: DWORD returnedDataLength; ! 62: VIDEO_MEMORY videoMemory; ! 63: VIDEO_MEMORY_INFORMATION videoMemoryInformation; ! 64: RECTL Rectl; ! 65: ULONG Index; ! 66: ULONG MaxHeight,MaxWidth; ! 67: // ! 68: // Set the current mode into the hardware. ! 69: // ! 70: ! 71: if (!DeviceIoControl(ppdev->hDriver, ! 72: IOCTL_VIDEO_SET_CURRENT_MODE, ! 73: &(ppdev->ulMode), ! 74: sizeof(ULONG), ! 75: NULL, ! 76: 0, ! 77: &returnedDataLength, ! 78: NULL)) ! 79: { ! 80: DISPDBG((0, "DISP bInitSURF failed IOCTL_SET_MODE\n")); ! 81: return(FALSE); ! 82: } ! 83: ! 84: // ! 85: // If this is the first time we enable the surface we need to map in the ! 86: // memory also. ! 87: // ! 88: ! 89: if (bFirst) ! 90: { ! 91: videoMemory.RequestedVirtualAddress = NULL; ! 92: ! 93: if (!DeviceIoControl(ppdev->hDriver, ! 94: IOCTL_VIDEO_MAP_VIDEO_MEMORY, ! 95: &videoMemory, ! 96: sizeof(VIDEO_MEMORY), ! 97: &videoMemoryInformation, ! 98: sizeof(VIDEO_MEMORY_INFORMATION), ! 99: &returnedDataLength, ! 100: NULL)) ! 101: { ! 102: DISPDBG((0, "DISP bInitSURF failed IOCTL_VIDEO_MAP\n")); ! 103: return(FALSE); ! 104: } ! 105: ! 106: ppdev->pjScreen = (PBYTE)(videoMemoryInformation.FrameBufferBase); ! 107: ! 108: ! 109: // ! 110: // Call the video miniport driver to get virtual address of JAGUAR registers ! 111: // ! 112: ! 113: if (!DeviceIoControl(ppdev->hDriver, ! 114: IOCTL_VIDEO_QUERY_JAGUAR, ! 115: NULL, ! 116: 0, ! 117: &JaguarInfo, ! 118: sizeof(VIDEO_JAGUAR_INFO), ! 119: &returnedDataLength,NULL)) { ! 120: ! 121: DISPDBG((0, " Get Jaguar information failed\n")); ! 122: return(FALSE); ! 123: ! 124: } ! 125: ! 126: // ! 127: // Initialize variables. ! 128: // ! 129: ! 130: Jaguar = (PJAGUAR_REGISTERS)JaguarInfo.VideoControlVirtualBase; ! 131: FifoRegs = (PJAGUAR_FIFO)JaguarInfo.FifoVirtualBase; ! 132: ! 133: Vxl.ScreenBase = (ULONG) videoMemoryInformation.FrameBufferBase; ! 134: Vxl.MemorySize = JaguarInfo.VideoMemoryLength; ! 135: Vxl.FontCacheBase = (PULONG) (Vxl.ScreenBase + Vxl.FontCacheOffset); ! 136: ! 137: // ! 138: // Determine how much off-screen memory is available for a font cache ! 139: // ! 140: ! 141: while (Vxl.CacheSize*GlyphEntrySize > (Vxl.MemorySize - Vxl.FontCacheOffset)) { ! 142: Vxl.CacheSize >>= 1; ! 143: Vxl.CacheIndexMask >>= 1; ! 144: } ! 145: ! 146: // ! 147: // Allocate and initialize the font cache structure ! 148: // ! 149: ! 150: Vxl.CacheTag = (PFONTCACHEINFO) LocalAlloc(LMEM_FIXED,sizeof(FONTCACHEINFO)*Vxl.CacheSize); ! 151: ! 152: if (Vxl.CacheTag == (PFONTCACHEINFO) NULL) { ! 153: DISPDBG((0, "Cache Tag allocation error\n")); ! 154: return(FALSE); ! 155: } ! 156: ! 157: // ! 158: // Initialize the tags to invalid. ! 159: // ! 160: ! 161: for (Index = 0; Index < Vxl.CacheSize; Index++) { ! 162: Vxl.CacheTag[Index].FontId = FreeTag; ! 163: Vxl.CacheTag[Index].GlyphHandle = FreeTag; ! 164: } ! 165: ! 166: // ! 167: // It's a hardware pointer; set up pointer attributes. ! 168: // ! 169: // Allocate space for two DIBs (data/mask) for the pointer. ! 170: // ! 171: ! 172: MaxHeight = ppdev->PointerCapabilities.MaxHeight; ! 173: MaxWidth = (ppdev->PointerCapabilities.MaxWidth + 7) / 8; ! 174: ! 175: ppdev->cjPointerAttributes = ! 176: sizeof(VIDEO_POINTER_ATTRIBUTES) + ! 177: ((sizeof(UCHAR) * MaxWidth * MaxHeight) * 2); ! 178: ! 179: ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES) ! 180: LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, ! 181: ppdev->cjPointerAttributes); ! 182: ! 183: if (ppdev->pPointerAttributes == NULL) { ! 184: DISPDBG((0, "VXL bInitPointer LocalAlloc failed\n")); ! 185: return(FALSE); ! 186: } ! 187: ! 188: ppdev->pPointerAttributes->WidthInBytes = MaxWidth; ! 189: ppdev->pPointerAttributes->Width = ppdev->PointerCapabilities.MaxWidth; ! 190: ppdev->pPointerAttributes->Height = MaxHeight; ! 191: ppdev->pPointerAttributes->Column = 0; ! 192: ppdev->pPointerAttributes->Row = 0; ! 193: ppdev->pPointerAttributes->Enable = 0; ! 194: } ! 195: ! 196: // ! 197: // Send a command to the fifo to clear the screen. ! 198: // ! 199: Rectl.top = Rectl.left = 0; ! 200: Rectl.right = Vxl.ScreenX; ! 201: Rectl.bottom = Vxl.ScreenY; ! 202: DrvpFillRectangle(&Rectl,0); ! 203: ! 204: return(TRUE); ! 205: } ! 206: ! 207: /******************************Public*Routine******************************\ ! 208: * vDisableSURF ! 209: * ! 210: * Disable the surface. Un-Maps the frame in memory. ! 211: * ! 212: \**************************************************************************/ ! 213: ! 214: VOID vDisableSURF(PPDEV ppdev) ! 215: { ! 216: DWORD returnedDataLength; ! 217: VIDEO_MEMORY videoMemory; ! 218: ! 219: videoMemory.RequestedVirtualAddress = (PVOID) ppdev->pjScreen; ! 220: ! 221: if (!DeviceIoControl(ppdev->hDriver, ! 222: IOCTL_VIDEO_UNMAP_VIDEO_MEMORY, ! 223: &videoMemory, ! 224: sizeof(VIDEO_MEMORY), ! 225: NULL, ! 226: 0, ! 227: &returnedDataLength, ! 228: NULL)) ! 229: { ! 230: DISPDBG((0, "DISP vDisableSURF failed IOCTL_VIDEO_UNMAP\n")); ! 231: } ! 232: } ! 233: ! 234: ! 235: /******************************Public*Routine******************************\ ! 236: * bInitPDEV ! 237: * ! 238: * Determine the mode we should be in based on the DEVMODE passed in. ! 239: * Query mini-port to get information needed to fill in the DevInfo and the ! 240: * GdiInfo . ! 241: * ! 242: * BUGBUG Copy this routine from the other display drivers !!! HACK ! 243: * ! 244: \**************************************************************************/ ! 245: ! 246: BOOL ! 247: bInitPDEV( ! 248: PPDEV ppdev, ! 249: PDEVMODEW pDevMode, ! 250: GDIINFO *pGdiInfo, ! 251: DEVINFO *pDevInfo ! 252: ) ! 253: ! 254: { ! 255: ULONG cModes, ulTemp; ! 256: PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoTemp, pVideoModeInformation; ! 257: PVIDEO_MODE_INFORMATION pVideoModeDefault , pVideoModeSelected; ! 258: VIDEO_MODE_INFORMATION VideoModeInformation; ! 259: VIDEO_COLOR_CAPABILITIES colorCapabilities; ! 260: PDEVMODEW DevMode = (PDEVMODEW) pDevMode; ! 261: ULONG cbModeSize; ! 262: ! 263: // ! 264: // Get the enumeration of available modes from the miniport ! 265: // ! 266: ! 267: cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize); ! 268: ! 269: if (cModes == 0) ! 270: { ! 271: return(FALSE); ! 272: } ! 273: ! 274: // ! 275: // Now see if the mini-port has a match for the mode we are requesting. ! 276: // If not default to the first mode provided by the mini-port. ! 277: // ! 278: ! 279: pVideoModeDefault = NULL; ! 280: pVideoModeSelected = NULL; ! 281: pVideoModeInformation = pVideoTemp = pVideoBuffer; ! 282: ! 283: // ! 284: // search the mode table for a matching mode. If no match is found then ! 285: // use the last entry as the default. ! 286: // ! 287: ! 288: while (cModes--) { ! 289: if (pVideoTemp->Length != 0) { ! 290: pVideoModeDefault = pVideoTemp; ! 291: ! 292: if ((pVideoTemp->VisScreenWidth == pDevMode->dmPelsWidth) && ! 293: (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) && ! 294: (pVideoTemp->BitsPerPlane == pDevMode->dmBitsPerPel) && ! 295: (pVideoTemp->Frequency == pDevMode->dmDisplayFrequency)) { ! 296: ! 297: pVideoModeSelected = pVideoTemp; ! 298: break; ! 299: } ! 300: } ! 301: ! 302: pVideoTemp = (PVIDEO_MODE_INFORMATION) ! 303: (((PUCHAR)pVideoTemp) + cbModeSize); ! 304: } ! 305: ! 306: if (pVideoModeSelected == NULL) ! 307: { ! 308: if (pVideoModeDefault == NULL) ! 309: { ! 310: DISPDBG((0, "DISP bInitPDEV no supported mode available")); ! 311: LocalFree(pVideoBuffer); ! 312: ! 313: return(FALSE); ! 314: } ! 315: pVideoModeSelected = pVideoModeDefault; ! 316: } ! 317: ! 318: ! 319: // ! 320: // Set up screen information ! 321: // ! 322: ! 323: VideoModeInformation = *pVideoModeSelected; ! 324: ! 325: // ! 326: // Fill in gdi structures ! 327: // ! 328: ! 329: ppdev->ulMode = VideoModeInformation.ModeIndex; ! 330: ppdev->cxScreen = VideoModeInformation.VisScreenWidth; ! 331: ppdev->cyScreen = VideoModeInformation.VisScreenHeight; ! 332: ppdev->ulBitCount = VideoModeInformation.BitsPerPlane; ! 333: ppdev->lDeltaScreen = VideoModeInformation.ScreenStride; ! 334: ! 335: ppdev->flRed = VideoModeInformation.RedMask; ! 336: ppdev->flGreen = VideoModeInformation.GreenMask; ! 337: ppdev->flBlue = VideoModeInformation.BlueMask; ! 338: ! 339: // ! 340: // Fill in the GDIINFO data structure with the information returned from the ! 341: // kernel driver. ! 342: // ! 343: ! 344: pGdiInfo->ulVersion = 0x1000; // Our driver is version 1.000 ! 345: pGdiInfo->ulTechnology = DT_RASDISPLAY; ! 346: pGdiInfo->ulHorzSize = VideoModeInformation.XMillimeter; ! 347: pGdiInfo->ulVertSize = VideoModeInformation.YMillimeter; ! 348: ! 349: pGdiInfo->ulHorzRes = ppdev->cxScreen; ! 350: pGdiInfo->ulVertRes = ppdev->cyScreen; ! 351: pGdiInfo->cBitsPixel = ppdev->ulBitCount; ! 352: pGdiInfo->cPlanes = 1; ! 353: ! 354: // ! 355: // Fill in the VXL specific data structure. ! 356: // ! 357: ! 358: Vxl.ScreenY = VideoModeInformation.VisScreenHeight; ! 359: Vxl.ScreenX = VideoModeInformation.VisScreenWidth; ! 360: Vxl.JaguarScreenX = VideoModeInformation.ScreenStride; ! 361: ! 362: // !!! ! 363: // The following is a trick: ! 364: // For 8 Bpp, we want 0, 16Bpp we want 1 and 24/32 Bpp 2. ! 365: // (Vxl.JaguarScreenX / Vxl.ScreenX) has values of 1, 2 and 4 ! 366: // respectively for the three possibilities. ! 367: // So shifting by 1 will give us a good result. ! 368: // ! 369: ! 370: Vxl.ColorModeShift = (Vxl.JaguarScreenX / Vxl.ScreenX) >> 1; ! 371: ! 372: // ! 373: // Init Font Cache variables ! 374: // ! 375: ! 376: Vxl.FontCacheOffset = (Vxl.ScreenX*Vxl.ScreenY) << Vxl.ColorModeShift; ! 377: Vxl.CacheIndexMask = MAX_FONT_CACHE_SIZE-1; ! 378: Vxl.CacheSize = MAX_FONT_CACHE_SIZE; ! 379: ! 380: pGdiInfo->flRaster = 0; // DDI reserves flRaster ! 381: ! 382: pGdiInfo->ulLogPixelsX = 96; ! 383: pGdiInfo->ulLogPixelsY = 96; ! 384: ! 385: pGdiInfo->flTextCaps = TC_RA_ABLE; ! 386: ! 387: pGdiInfo->ulDACRed = pVideoModeSelected->NumberRedBits; ! 388: pGdiInfo->ulDACGreen = pVideoModeSelected->NumberGreenBits; ! 389: pGdiInfo->ulDACBlue = pVideoModeSelected->NumberBlueBits; ! 390: ! 391: pGdiInfo->ulAspectX = 0x24; // One-to-one aspect ratio ! 392: pGdiInfo->ulAspectY = 0x24; ! 393: pGdiInfo->ulAspectXY = 0x33; ! 394: ! 395: pGdiInfo->xStyleStep = 1; // A style unit is 3 pels ! 396: pGdiInfo->yStyleStep = 1; ! 397: pGdiInfo->denStyleStep = 3; ! 398: ! 399: pGdiInfo->ptlPhysOffset.x = 0; ! 400: pGdiInfo->ptlPhysOffset.y = 0; ! 401: pGdiInfo->szlPhysSize.cx = 0; ! 402: pGdiInfo->szlPhysSize.cy = 0; ! 403: ! 404: // ! 405: // RGB and CMY color info. ! 406: // ! 407: ! 408: pGdiInfo->ciDevice.Red.x = 6700; ! 409: pGdiInfo->ciDevice.Red.y = 3300; ! 410: pGdiInfo->ciDevice.Red.Y = 0; ! 411: pGdiInfo->ciDevice.Green.x = 2100; ! 412: pGdiInfo->ciDevice.Green.y = 7100; ! 413: pGdiInfo->ciDevice.Green.Y = 0; ! 414: pGdiInfo->ciDevice.Blue.x = 1400; ! 415: pGdiInfo->ciDevice.Blue.y = 800; ! 416: pGdiInfo->ciDevice.Blue.Y = 0; ! 417: pGdiInfo->ciDevice.Cyan.x = 1750; ! 418: pGdiInfo->ciDevice.Cyan.y = 3950; ! 419: pGdiInfo->ciDevice.Cyan.Y = 0; ! 420: pGdiInfo->ciDevice.Magenta.x = 4050; ! 421: pGdiInfo->ciDevice.Magenta.y = 2050; ! 422: pGdiInfo->ciDevice.Magenta.Y = 0; ! 423: pGdiInfo->ciDevice.Yellow.x = 4400; ! 424: pGdiInfo->ciDevice.Yellow.y = 5200; ! 425: pGdiInfo->ciDevice.Yellow.Y = 0; ! 426: pGdiInfo->ciDevice.AlignmentWhite.x = 3127; ! 427: pGdiInfo->ciDevice.AlignmentWhite.y = 3290; ! 428: pGdiInfo->ciDevice.AlignmentWhite.Y = 0; ! 429: ! 430: // ! 431: // Color Gamma adjustment values. ! 432: // ! 433: ! 434: pGdiInfo->ciDevice.RedGamma = 20000; ! 435: pGdiInfo->ciDevice.GreenGamma = 20000; ! 436: pGdiInfo->ciDevice.BlueGamma = 20000; ! 437: ! 438: // ! 439: // No dye correction for raster displays. ! 440: // ! 441: ! 442: pGdiInfo->ciDevice.MagentaInCyanDye = ! 443: pGdiInfo->ciDevice.YellowInCyanDye = ! 444: pGdiInfo->ciDevice.CyanInMagentaDye = ! 445: pGdiInfo->ciDevice.YellowInMagentaDye = ! 446: pGdiInfo->ciDevice.CyanInYellowDye = ! 447: pGdiInfo->ciDevice.MagentaInYellowDye = 0; ! 448: ! 449: pGdiInfo->ulDevicePelsDPI = (pGdiInfo->ulHorzRes * 254) / 3300; ! 450: pGdiInfo->ulPrimaryOrder = PRIMARY_ORDER_CBA; ! 451: pGdiInfo->ulHTPatternSize = HT_PATSIZE_4x4_M; ! 452: pGdiInfo->ulHTOutputFormat = HT_FORMAT_8BPP; ! 453: pGdiInfo->flHTFlags = HT_FLAG_ADDITIVE_PRIMS; ! 454: ! 455: *(pDevInfo) = gDevInfoFrameBuffer; ! 456: ! 457: // ! 458: // Initialize the color mode dependent fields. ! 459: // Set the gamma corrected palette for 16/32 bits per pixel ! 460: // ! 461: ! 462: switch (ppdev->ulBitCount) ! 463: { ! 464: ! 465: case 8: ! 466: ! 467: // ! 468: // It is Palette Managed. ! 469: // ! 470: pDevInfo->flGraphicsCaps |= (GCAPS_PALMANAGED | GCAPS_COLOR_DITHER); ! 471: pGdiInfo->ulNumColors = 20; ! 472: pGdiInfo->ulNumPalReg = 256; ! 473: pDevInfo->iDitherFormat = BMF_8BPP; ! 474: break; ! 475: ! 476: case 16: ! 477: ! 478: pGdiInfo->ulNumColors = 2048; ! 479: pGdiInfo->ulNumPalReg = 0; ! 480: ! 481: pDevInfo->iDitherFormat = BMF_16BPP; ! 482: pGdiInfo->ulHTPatternSize = HT_PATSIZE_2x2_M; ! 483: pGdiInfo->ulHTOutputFormat = HT_FORMAT_16BPP; ! 484: ! 485: // ! 486: // 16 bpp mode is really 5 red,5 green and 5 blue ! 487: // ! 488: ! 489: DrvpSetGammaColorPalette(ppdev, ! 490: 32, ! 491: pGdiInfo->ciDevice.RedGamma, ! 492: pGdiInfo->ciDevice.GreenGamma, ! 493: pGdiInfo->ciDevice.BlueGamma ! 494: ); ! 495: break; ! 496: ! 497: case 24: ! 498: case 32: ! 499: ! 500: pGdiInfo->ulNumColors = 2048; ! 501: pGdiInfo->ulNumPalReg = 0; ! 502: ! 503: // ! 504: // Reset the bit count to 32 since we are really in 32 bits wide ! 505: // ! 506: ! 507: pGdiInfo->cBitsPixel = ppdev->ulBitCount = 32; ! 508: ! 509: pDevInfo->iDitherFormat = BMF_32BPP; ! 510: ! 511: DrvpSetGammaColorPalette(ppdev, ! 512: 256, ! 513: pGdiInfo->ciDevice.RedGamma, ! 514: pGdiInfo->ciDevice.GreenGamma, ! 515: pGdiInfo->ciDevice.BlueGamma ! 516: ); ! 517: ! 518: break; ! 519: ! 520: default: ! 521: ! 522: break; ! 523: } ! 524: ! 525: // ! 526: // Free video buffer from get mode info ! 527: // ! 528: ! 529: LocalFree(pVideoBuffer); ! 530: ! 531: return(TRUE); ! 532: } ! 533: ! 534: ! 535: /******************************Public*Routine******************************\ ! 536: * getAvailableModes ! 537: * ! 538: * Calls the miniport to get the list of modes supported by the kernel driver, ! 539: * and returns the list of modes supported by the diplay driver among those ! 540: * ! 541: * returns the number of entries in the videomode buffer. ! 542: * 0 means no modes are supported by the miniport or that an error occured. ! 543: * ! 544: * NOTE: the buffer must be freed up by the caller. ! 545: * ! 546: \**************************************************************************/ ! 547: ! 548: DWORD getAvailableModes( ! 549: HANDLE hDriver, ! 550: PVIDEO_MODE_INFORMATION *modeInformation, ! 551: DWORD *cbModeSize) ! 552: { ! 553: ULONG ulTemp; ! 554: VIDEO_NUM_MODES modes; ! 555: PVIDEO_MODE_INFORMATION pVideoTemp; ! 556: ! 557: // ! 558: // Get the number of modes supported by the mini-port ! 559: // ! 560: ! 561: if (!DeviceIoControl(hDriver, ! 562: IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES, ! 563: NULL, ! 564: 0, ! 565: &modes, ! 566: sizeof(VIDEO_NUM_MODES), ! 567: &ulTemp, ! 568: NULL)) ! 569: { ! 570: DISPDBG((0, "jzvxl484.dll getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n")); ! 571: return(0); ! 572: } ! 573: ! 574: *cbModeSize = modes.ModeInformationLength; ! 575: ! 576: // ! 577: // Allocate the buffer for the mini-port to write the modes in. ! 578: // ! 579: ! 580: *modeInformation = (PVIDEO_MODE_INFORMATION) ! 581: LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT, ! 582: modes.NumModes * ! 583: modes.ModeInformationLength); ! 584: ! 585: if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL) ! 586: { ! 587: DISPDBG((0, "jzvxl484.dll getAvailableModes failed LocalAlloc\n")); ! 588: ! 589: return 0; ! 590: } ! 591: ! 592: // ! 593: // Ask the mini-port to fill in the available modes. ! 594: // ! 595: ! 596: if (!DeviceIoControl(hDriver, ! 597: IOCTL_VIDEO_QUERY_AVAIL_MODES, ! 598: NULL, ! 599: 0, ! 600: *modeInformation, ! 601: modes.NumModes * modes.ModeInformationLength, ! 602: &ulTemp, ! 603: NULL)) ! 604: { ! 605: ! 606: DISPDBG((0, "jzvxl484.dll getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n")); ! 607: ! 608: LocalFree(*modeInformation); ! 609: *modeInformation = (PVIDEO_MODE_INFORMATION) NULL; ! 610: ! 611: return(0); ! 612: } ! 613: ! 614: // ! 615: // Now see which of these modes are supported by the display driver. ! 616: // As an internal mechanism, set the length to 0 for the modes we ! 617: // DO NOT support. ! 618: // ! 619: ! 620: ulTemp = modes.NumModes; ! 621: pVideoTemp = *modeInformation; ! 622: ! 623: // ! 624: // Mode is rejected if it is not one plane, or not graphics, or is not ! 625: // one of 8, 16, 24 or 32 bits per pel. ! 626: // ! 627: ! 628: while (ulTemp--) ! 629: { ! 630: if ((pVideoTemp->NumberOfPlanes != 1 ) || ! 631: !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) || ! 632: ((pVideoTemp->BitsPerPlane != 8) && ! 633: (pVideoTemp->BitsPerPlane != 16) && ! 634: (pVideoTemp->BitsPerPlane != 24) && ! 635: (pVideoTemp->BitsPerPlane != 32))) ! 636: { ! 637: pVideoTemp->Length = 0; ! 638: } ! 639: ! 640: pVideoTemp = (PVIDEO_MODE_INFORMATION) ! 641: (((PUCHAR)pVideoTemp) + modes.ModeInformationLength); ! 642: } ! 643: ! 644: return modes.NumModes; ! 645: ! 646: } ! 647: ! 648: ! 649: BOOL ! 650: DrvpSetGammaColorPalette( ! 651: IN PPDEV ppdev, ! 652: IN WORD NumberOfEntries, ! 653: IN LDECI4 GammaRed, ! 654: IN LDECI4 GammaGreen, ! 655: IN LDECI4 GammaBlue ! 656: ) ! 657: /*++ ! 658: ! 659: Routine Description: ! 660: ! 661: This function will set the device palette to a gamma correctec palette for ! 662: 16 or 24 bit per pixel operation ! 663: ! 664: Arguments: ! 665: ! 666: ppdev - device mode structure ! 667: NumberOfEntries - Bits per pixel: the number of color map entries needed ! 668: GammaRed - Gamma value for red gun from devmode structure ! 669: GammaGreen - Gamma value for green gun from devmode structure ! 670: GammaBlue - Gamma value for blue gun from devmode structure ! 671: ! 672: Return Value: ! 673: ! 674: A value of TRUE is returned if the gamma corrected palette is set ! 675: A value of FALSE is returned if there is an error attempting to set the palette. ! 676: ! 677: --*/ ! 678: ! 679: ! 680: { ! 681: ULONG Index,ByteIndex; ! 682: LONG GammaReturn; ! 683: PVIDEO_CLUT pVideoClut; ! 684: ULONG ClutSize; ! 685: DWORD DNumberOfEntries; ! 686: PBYTE pGammaTable; ! 687: ! 688: // ! 689: // Allocate the gamma table used for return data from HT_ ! 690: // ! 691: ! 692: pGammaTable = (PBYTE)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,sizeof(BYTE) * 3 * NumberOfEntries); ! 693: ! 694: if (pGammaTable == NULL) { ! 695: DISPDBG((0, "DrvpSetGammaColorPalette() failed LocalAlloc\n")); ! 696: return(FALSE); ! 697: } ! 698: ! 699: // ! 700: // Gamma values come in UDECI4 format as described in ht.h. This format is a ! 701: // fractional integer format with four decimal places ie: 00020000 = 2.0000 ! 702: // ! 703: ! 704: GammaReturn = HT_ComputeRGBGammaTable(NumberOfEntries, ! 705: 0, ! 706: GammaRed, ! 707: GammaGreen, ! 708: GammaBlue, ! 709: pGammaTable); ! 710: ! 711: if (GammaReturn != NumberOfEntries) { ! 712: DISPDBG((0, "DrvpSetGammaColorPalette() failed HT_ComputeGammaTable\n")); ! 713: return(FALSE); ! 714: } ! 715: ! 716: // ! 717: // Allocate the PalatteEntry to call IOCTL ! 718: // ! 719: ! 720: pVideoClut = (PVIDEO_CLUT)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,MAX_CLUT_SIZE); ! 721: ! 722: if (pVideoClut == NULL) { ! 723: DISPDBG((0, "DrvpSetGammaColorPalette() failed LocalAlloc\n")); ! 724: return(FALSE); ! 725: } ! 726: ! 727: // ! 728: // Translate into paletteentry data ! 729: // Print the results ! 730: // ! 731: ! 732: ByteIndex = 0; ! 733: ! 734: for (Index = 0;Index < NumberOfEntries;Index++ ) { ! 735: pVideoClut->LookupTable[Index].RgbArray.Red = pGammaTable[ByteIndex++]; ! 736: pVideoClut->LookupTable[Index].RgbArray.Green = pGammaTable[ByteIndex++]; ! 737: pVideoClut->LookupTable[Index].RgbArray.Blue = pGammaTable[ByteIndex++]; ! 738: ! 739: } ! 740: ! 741: // ! 742: // Set the other ScreenClut values ! 743: // ! 744: ! 745: pVideoClut->NumEntries = NumberOfEntries; ! 746: pVideoClut->FirstEntry = 0; ! 747: ! 748: // ! 749: // Set this palette through the IOCTL ! 750: // ! 751: ! 752: if (!DeviceIoControl(ppdev->hDriver, ! 753: IOCTL_VIDEO_SET_COLOR_REGISTERS, ! 754: pVideoClut, ! 755: MAX_CLUT_SIZE, ! 756: NULL, ! 757: 0, ! 758: &DNumberOfEntries, ! 759: NULL)) ! 760: { ! 761: DISPDBG((0, "jzvxl484 DrvSetPalette failed DeviceIoControl\n")); ! 762: return(FALSE); ! 763: } ! 764: ! 765: // ! 766: // free memory buffers ! 767: // ! 768: ! 769: LocalFree(pVideoClut); ! 770: LocalFree(pGammaTable); ! 771: ! 772: return(TRUE); ! 773: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.