|
|
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.