|
|
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) 1992 Microsoft Corporation
7: \**************************************************************************/
8:
9: #include "driver.h"
10:
11: #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"}
12: #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"}
13: #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"}
14:
15: // This is the basic devinfo for a default driver. This is used as a base and customized based
16: // on information passed back from the miniport driver.
17:
18: const DEVINFO gDevInfoFrameBuffer = {
19: (GCAPS_OPAQUERECT | GCAPS_MONO_DITHER), /* Graphics capabilities */
20: SYSTM_LOGFONT, /* Default font description */
21: HELVE_LOGFONT, /* ANSI variable font description */
22: COURI_LOGFONT, /* ANSI fixed font description */
23: 0, /* Count of device fonts */
24: 0, /* Preferred DIB format */
25: 8, /* Width of color dither */
26: 8, /* Height of color dither */
27: 0 /* Default palette to use for this device */
28: };
29:
30: /******************************Public*Routine******************************\
31: * bInitSURF
32: *
33: * Enables the surface. Maps the frame buffer into memory.
34: *
35: \**************************************************************************/
36:
37: BOOL bInitSURF(PPDEV ppdev, BOOL bFirst)
38: {
39: DWORD returnedDataLength;
40: DWORD MaxWidth, MaxHeight;
41: VIDEO_MEMORY videoMemory;
42: VIDEO_MEMORY_INFORMATION videoMemoryInformation;
43:
44: // Set the current mode into the hardware.
45: if (!DeviceIoControl(ppdev->hDriver,
46: IOCTL_VIDEO_SET_CURRENT_MODE,
47: &(ppdev->ulMode),
48: sizeof(ULONG),
49: NULL,
50: 0,
51: &returnedDataLength,
52: NULL))
53: {
54: RIP("DISP bInitSURF failed IOCTL_SET_MODE\n");
55: return(FALSE);
56: }
57:
58: // If this is the first time we enable the surface we need to map in the
59: // memory also.
60:
61: if (bFirst)
62: {
63: videoMemory.RequestedVirtualAddress = NULL;
64:
65: if (!DeviceIoControl(ppdev->hDriver,
66: IOCTL_VIDEO_MAP_VIDEO_MEMORY,
67: &videoMemory,
68: sizeof(VIDEO_MEMORY),
69: &videoMemoryInformation,
70: sizeof(VIDEO_MEMORY_INFORMATION),
71: &returnedDataLength,
72: NULL))
73: {
74: RIP("DISP bInitSURF failed IOCTL_VIDEO_MAP\n");
75: return(FALSE);
76: }
77:
78: ppdev->pjScreen = (PBYTE)(videoMemoryInformation.FrameBufferBase);
79:
80: // It's a hardware pointer; set up pointer attributes.
81:
82: MaxHeight = ppdev->PointerCapabilities.MaxHeight;
83:
84: // Allocate space for two DIBs (data/mask) for the pointer. If this
85: // device supports a color Pointer, we will allocate a larger bitmap.
86: // If this is a color bitmap we allocate for the largest possible
87: // bitmap because we have no idea of what the pixel depth might be.
88:
89: // Width rounded up to nearest byte multiple
90:
91: if (!(ppdev->PointerCapabilities.Flags & VIDEO_MODE_COLOR_POINTER)) {
92: MaxWidth = (ppdev->PointerCapabilities.MaxWidth + 7) / 8;
93: } else {
94: MaxWidth = ppdev->PointerCapabilities.MaxWidth * sizeof(DWORD);
95: }
96:
97: ppdev->cjPointerAttributes =
98: sizeof(VIDEO_POINTER_ATTRIBUTES) +
99: ((sizeof(UCHAR) * MaxWidth * MaxHeight) * 2);
100:
101: ppdev->pPointerAttributes = (PVIDEO_POINTER_ATTRIBUTES)
102: LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
103: ppdev->cjPointerAttributes);
104:
105: if (ppdev->pPointerAttributes == NULL) {
106:
107: DISPDBG((0, "FRAMEBUF: bInitPointer LocalAlloc failed\n"));
108: return(FALSE);
109: }
110:
111: ppdev->pPointerAttributes->WidthInBytes = MaxWidth;
112: ppdev->pPointerAttributes->Width = ppdev->PointerCapabilities.MaxWidth;
113: ppdev->pPointerAttributes->Height = MaxHeight;
114: ppdev->pPointerAttributes->Column = 0;
115: ppdev->pPointerAttributes->Row = 0;
116: ppdev->pPointerAttributes->Enable = 0;
117: }
118:
119: return(TRUE);
120: }
121:
122: /******************************Public*Routine******************************\
123: * vDisableSURF
124: *
125: * Disable the surface. Un-Maps the frame in memory.
126: *
127: \**************************************************************************/
128:
129: VOID vDisableSURF(PPDEV ppdev)
130: {
131: DWORD returnedDataLength;
132: VIDEO_MEMORY videoMemory;
133:
134: videoMemory.RequestedVirtualAddress = (PVOID) ppdev->pjScreen;
135:
136: if (!DeviceIoControl(ppdev->hDriver,
137: IOCTL_VIDEO_UNMAP_VIDEO_MEMORY,
138: &videoMemory,
139: sizeof(VIDEO_MEMORY),
140: NULL,
141: 0,
142: &returnedDataLength,
143: NULL))
144: {
145: RIP("DISP vDisableSURF failed IOCTL_VIDEO_UNMAP\n");
146: }
147:
148: // We must give up the display.
149: // Call the kernel driver to reset the device to a known state.
150:
151: if (!DeviceIoControl(ppdev->hDriver,
152: IOCTL_VIDEO_RESET_DEVICE,
153: NULL,
154: 0,
155: NULL,
156: 0,
157: &returnedDataLength,
158: NULL))
159: {
160: RIP("DISP vDisableSurf failed IOCTL_VIDEO_RESET_DEVICE");
161: }
162:
163: }
164:
165:
166: /******************************Public*Routine******************************\
167: * bInitPDEV
168: *
169: * Determine the mode we should be in based on the DEVMODE passed in.
170: * Query mini-port to get information needed to fill in the DevInfo and the
171: * GdiInfo .
172: *
173: \**************************************************************************/
174:
175: BOOL bInitPDEV(
176: PPDEV ppdev,
177: DEVMODEW *pDevMode,
178: GDIINFO *pGdiInfo,
179: DEVINFO *pDevInfo)
180: {
181: ULONG cModes;
182: PVIDEO_MODE_INFORMATION pVideoBuffer, pVideoModeSelected, pVideoTemp;
183: VIDEO_COLOR_CAPABILITIES colorCapabilities;
184: ULONG ulTemp;
185: BOOL bSelectDefault;
186: ULONG cbModeSize;
187:
188: //
189: // calls the miniport to get mode information.
190: //
191:
192: cModes = getAvailableModes(ppdev->hDriver, &pVideoBuffer, &cbModeSize);
193:
194: if (cModes == 0)
195: {
196: return(FALSE);
197: }
198:
199: //
200: // Determine if we are looking for a default mode.
201: //
202:
203: if ( ((pDevMode->dmPelsWidth) ||
204: (pDevMode->dmPelsHeight) ||
205: (pDevMode->dmBitsPerPel) ||
206: (pDevMode->dmDisplayFlags) ||
207: (pDevMode->dmDisplayFrequency)) == 0)
208: {
209: bSelectDefault = TRUE;
210: }
211: else
212: {
213: bSelectDefault = FALSE;
214: }
215:
216: //
217: // Now see if the requested mode has a match in that table.
218: //
219:
220: pVideoModeSelected = NULL;
221: pVideoTemp = pVideoBuffer;
222:
223: while (cModes--)
224: {
225: if (pVideoTemp->Length != 0)
226: {
227: if (bSelectDefault ||
228: ((pVideoTemp->VisScreenWidth == pDevMode->dmPelsWidth) &&
229: (pVideoTemp->VisScreenHeight == pDevMode->dmPelsHeight) &&
230: (pVideoTemp->BitsPerPlane *
231: pVideoTemp->NumberOfPlanes == pDevMode->dmBitsPerPel)) )
232: {
233: pVideoModeSelected = pVideoTemp;
234: DISPDBG((3, "framebuf: Found a match\n")) ;
235: break;
236: }
237: }
238:
239: pVideoTemp = (PVIDEO_MODE_INFORMATION)
240: (((PUCHAR)pVideoTemp) + cbModeSize);
241: }
242:
243: //
244: // If no mode has been found, return an error
245: //
246:
247: if (pVideoModeSelected == NULL)
248: {
249: LocalFree(pVideoBuffer);
250: return(FALSE);
251: }
252:
253: //
254: // Fill in the GDIINFO data structure with the information returned from
255: // the kernel driver.
256: //
257:
258: ppdev->ulMode = pVideoModeSelected->ModeIndex;
259: ppdev->cxScreen = pVideoModeSelected->VisScreenWidth;
260: ppdev->cyScreen = pVideoModeSelected->VisScreenHeight;
261: ppdev->ulBitCount = pVideoModeSelected->BitsPerPlane *
262: pVideoModeSelected->NumberOfPlanes;
263: ppdev->lDeltaScreen = pVideoModeSelected->ScreenStride;
264:
265: ppdev->flRed = pVideoModeSelected->RedMask;
266: ppdev->flGreen = pVideoModeSelected->GreenMask;
267: ppdev->flBlue = pVideoModeSelected->BlueMask;
268:
269:
270: pGdiInfo->ulVersion = 0x1000; // Our driver is verion 1.000
271: pGdiInfo->ulTechnology = DT_RASDISPLAY;
272: pGdiInfo->ulHorzSize = pVideoModeSelected->XMillimeter;
273: pGdiInfo->ulVertSize = pVideoModeSelected->YMillimeter;
274:
275: pGdiInfo->ulHorzRes = ppdev->cxScreen;
276: pGdiInfo->ulVertRes = ppdev->cyScreen;
277: pGdiInfo->cBitsPixel = pVideoModeSelected->BitsPerPlane;
278: pGdiInfo->cPlanes = pVideoModeSelected->NumberOfPlanes;
279:
280: pGdiInfo->ulLogPixelsX = 96;
281: pGdiInfo->ulLogPixelsY = 96;
282:
283: #ifdef MIPS
284: if (ppdev->ulBitCount == 8)
285: pGdiInfo->flTextCaps = (TC_RA_ABLE | TC_SCROLLBLT);
286: else
287: #endif
288: pGdiInfo->flTextCaps = TC_RA_ABLE;
289:
290: pGdiInfo->flRaster = 0; // flRaster is reserved by DDI
291:
292: pGdiInfo->ulDACRed = pVideoModeSelected->NumberRedBits;
293: pGdiInfo->ulDACGreen = pVideoModeSelected->NumberGreenBits;
294: pGdiInfo->ulDACBlue = pVideoModeSelected->NumberBlueBits;
295:
296: pGdiInfo->ulAspectX = 0x24; // One-to-one aspect ratio
297: pGdiInfo->ulAspectY = 0x24;
298: pGdiInfo->ulAspectXY = 0x33;
299:
300: pGdiInfo->xStyleStep = 1; // A style unit is 3 pels
301: pGdiInfo->yStyleStep = 1;
302: pGdiInfo->denStyleStep = 3;
303:
304: pGdiInfo->ptlPhysOffset.x = 0;
305: pGdiInfo->ptlPhysOffset.y = 0;
306: pGdiInfo->szlPhysSize.cx = 0;
307: pGdiInfo->szlPhysSize.cy = 0;
308:
309: // RGB and CMY color info.
310:
311: // try to get it from the miniport.
312: // if the miniport doesn ot support this feature, use defaults.
313:
314: if (!DeviceIoControl(ppdev->hDriver,
315: IOCTL_VIDEO_QUERY_COLOR_CAPABILITIES,
316: NULL,
317: 0,
318: &colorCapabilities,
319: sizeof(VIDEO_COLOR_CAPABILITIES),
320: &ulTemp,
321: NULL))
322: {
323:
324: DISPDBG((2, "FRAMEBUF getcolorCapabilities failed \n"));
325:
326: pGdiInfo->ciDevice.Red.x = 6700;
327: pGdiInfo->ciDevice.Red.y = 3300;
328: pGdiInfo->ciDevice.Red.Y = 0;
329: pGdiInfo->ciDevice.Green.x = 2100;
330: pGdiInfo->ciDevice.Green.y = 7100;
331: pGdiInfo->ciDevice.Green.Y = 0;
332: pGdiInfo->ciDevice.Blue.x = 1400;
333: pGdiInfo->ciDevice.Blue.y = 800;
334: pGdiInfo->ciDevice.Blue.Y = 0;
335: pGdiInfo->ciDevice.AlignmentWhite.x = 3127;
336: pGdiInfo->ciDevice.AlignmentWhite.y = 3290;
337: pGdiInfo->ciDevice.AlignmentWhite.Y = 0;
338:
339: pGdiInfo->ciDevice.RedGamma = 20000;
340: pGdiInfo->ciDevice.GreenGamma = 20000;
341: pGdiInfo->ciDevice.BlueGamma = 20000;
342:
343: }
344: else
345: {
346: pGdiInfo->ciDevice.Red.x = colorCapabilities.RedChromaticity_x;
347: pGdiInfo->ciDevice.Red.y = colorCapabilities.RedChromaticity_y;
348: pGdiInfo->ciDevice.Red.Y = 0;
349: pGdiInfo->ciDevice.Green.x = colorCapabilities.GreenChromaticity_x;
350: pGdiInfo->ciDevice.Green.y = colorCapabilities.GreenChromaticity_y;
351: pGdiInfo->ciDevice.Green.Y = 0;
352: pGdiInfo->ciDevice.Blue.x = colorCapabilities.BlueChromaticity_x;
353: pGdiInfo->ciDevice.Blue.y = colorCapabilities.BlueChromaticity_y;
354: pGdiInfo->ciDevice.Blue.Y = 0;
355: pGdiInfo->ciDevice.AlignmentWhite.x = colorCapabilities.WhiteChromaticity_x;
356: pGdiInfo->ciDevice.AlignmentWhite.y = colorCapabilities.WhiteChromaticity_y;
357: pGdiInfo->ciDevice.AlignmentWhite.Y = colorCapabilities.WhiteChromaticity_Y;
358:
359: // if we have a color device store the three color gamma values,
360: // otherwise store the unique gamma value in all three.
361:
362: if (colorCapabilities.AttributeFlags & VIDEO_DEVICE_COLOR)
363: {
364: pGdiInfo->ciDevice.RedGamma = colorCapabilities.RedGamma;
365: pGdiInfo->ciDevice.GreenGamma = colorCapabilities.GreenGamma;
366: pGdiInfo->ciDevice.BlueGamma = colorCapabilities.BlueGamma;
367: }
368: else
369: {
370: pGdiInfo->ciDevice.RedGamma = colorCapabilities.WhiteGamma;
371: pGdiInfo->ciDevice.GreenGamma = colorCapabilities.WhiteGamma;
372: pGdiInfo->ciDevice.BlueGamma = colorCapabilities.WhiteGamma;
373: }
374:
375: };
376:
377: pGdiInfo->ciDevice.Cyan.x = 0;
378: pGdiInfo->ciDevice.Cyan.y = 0;
379: pGdiInfo->ciDevice.Cyan.Y = 0;
380: pGdiInfo->ciDevice.Magenta.x = 0;
381: pGdiInfo->ciDevice.Magenta.y = 0;
382: pGdiInfo->ciDevice.Magenta.Y = 0;
383: pGdiInfo->ciDevice.Yellow.x = 0;
384: pGdiInfo->ciDevice.Yellow.y = 0;
385: pGdiInfo->ciDevice.Yellow.Y = 0;
386:
387: // No dye correction for raster displays.
388:
389: pGdiInfo->ciDevice.MagentaInCyanDye = 0;
390: pGdiInfo->ciDevice.YellowInCyanDye = 0;
391: pGdiInfo->ciDevice.CyanInMagentaDye = 0;
392: pGdiInfo->ciDevice.YellowInMagentaDye = 0;
393: pGdiInfo->ciDevice.CyanInYellowDye = 0;
394: pGdiInfo->ciDevice.MagentaInYellowDye = 0;
395:
396: pGdiInfo->ulDevicePelsDPI = 0; // For printers only
397: pGdiInfo->ulPrimaryOrder = PRIMARY_ORDER_CBA;
398:
399: // BUGBUG this should be modified to take into account the size
400: // of the display and the resolution.
401:
402: pGdiInfo->ulHTPatternSize = HT_PATSIZE_4x4_M;
403:
404: pGdiInfo->flHTFlags = HT_FLAG_ADDITIVE_PRIMS;
405:
406: // Fill in the basic devinfo structure
407:
408: *pDevInfo = gDevInfoFrameBuffer;
409:
410: // Fill in the rest of the devinfo and GdiInfo structures.
411:
412: if (ppdev->ulBitCount == 8)
413: {
414: // It is Palette Managed.
415:
416: pGdiInfo->ulNumColors = 20;
417: pGdiInfo->ulNumPalReg = 1 << ppdev->ulBitCount;
418:
419: pDevInfo->flGraphicsCaps |= (GCAPS_PALMANAGED | GCAPS_COLOR_DITHER);
420:
421: pGdiInfo->ulHTOutputFormat = HT_FORMAT_8BPP;
422: pDevInfo->iDitherFormat = BMF_8BPP;
423: }
424: else
425: {
426: pGdiInfo->ulNumColors = 2048;
427: pGdiInfo->ulNumPalReg = 0;
428:
429: if (ppdev->ulBitCount == 16)
430: {
431: pGdiInfo->ulHTOutputFormat = HT_FORMAT_16BPP;
432: pDevInfo->iDitherFormat = BMF_16BPP;
433: }
434: else if (ppdev->ulBitCount == 24)
435: {
436: pGdiInfo->ulHTOutputFormat = HT_FORMAT_24BPP;
437: pDevInfo->iDitherFormat = BMF_24BPP;
438: }
439: else
440: {
441: pGdiInfo->ulHTOutputFormat = HT_FORMAT_32BPP;
442: pDevInfo->iDitherFormat = BMF_32BPP;
443: }
444: }
445:
446: LocalFree(pVideoBuffer);
447:
448: return(TRUE);
449: }
450:
451:
452: /******************************Public*Routine******************************\
453: * getAvailableModes
454: *
455: * Calls the miniport to get the list of modes supported by the kernel driver,
456: * and returns the list of modes supported by the diplay driver among those
457: *
458: * returns the number of entries in the videomode buffer.
459: * 0 means no modes are supported by the miniport or that an error occured.
460: *
461: * NOTE: the buffer must be freed up by the caller.
462: *
463: \**************************************************************************/
464:
465: DWORD getAvailableModes(
466: HANDLE hDriver,
467: PVIDEO_MODE_INFORMATION *modeInformation,
468: DWORD *cbModeSize)
469: {
470: ULONG ulTemp;
471: VIDEO_NUM_MODES modes;
472: PVIDEO_MODE_INFORMATION pVideoTemp;
473:
474: //
475: // Get the number of modes supported by the mini-port
476: //
477:
478: if (!DeviceIoControl(hDriver,
479: IOCTL_VIDEO_QUERY_NUM_AVAIL_MODES,
480: NULL,
481: 0,
482: &modes,
483: sizeof(VIDEO_NUM_MODES),
484: &ulTemp,
485: NULL))
486: {
487: DISPDBG((0, "framebuf.dll getAvailableModes failed VIDEO_QUERY_NUM_AVAIL_MODES\n"));
488: return(0);
489: }
490:
491: *cbModeSize = modes.ModeInformationLength;
492:
493: //
494: // Allocate the buffer for the mini-port to write the modes in.
495: //
496:
497: *modeInformation = (PVIDEO_MODE_INFORMATION)
498: LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
499: modes.NumModes *
500: modes.ModeInformationLength);
501:
502: if (*modeInformation == (PVIDEO_MODE_INFORMATION) NULL)
503: {
504: DISPDBG((0, "framebuf.dll getAvailableModes failed LocalAlloc\n"));
505:
506: return 0;
507: }
508:
509: //
510: // Ask the mini-port to fill in the available modes.
511: //
512:
513: if (!DeviceIoControl(hDriver,
514: IOCTL_VIDEO_QUERY_AVAIL_MODES,
515: NULL,
516: 0,
517: *modeInformation,
518: modes.NumModes * modes.ModeInformationLength,
519: &ulTemp,
520: NULL))
521: {
522:
523: DISPDBG((0, "framebuf.dll getAvailableModes failed VIDEO_QUERY_AVAIL_MODES\n"));
524:
525: LocalFree(*modeInformation);
526: *modeInformation = (PVIDEO_MODE_INFORMATION) NULL;
527:
528: return(0);
529: }
530:
531: //
532: // Now see which of these modes are supported by the display driver.
533: // As an internal mechanism, set the length to 0 for the modes we
534: // DO NOT support.
535: //
536:
537: ulTemp = modes.NumModes;
538: pVideoTemp = *modeInformation;
539:
540: //
541: // Mode is rejected if it is not one plane, or not graphics, or is not
542: // one of 8, 16 or 32 bits per pel.
543: //
544:
545: while (ulTemp--)
546: {
547: if ((pVideoTemp->NumberOfPlanes != 1 ) ||
548: !(pVideoTemp->AttributeFlags & VIDEO_MODE_GRAPHICS) ||
549: ((pVideoTemp->BitsPerPlane != 8) &&
550: (pVideoTemp->BitsPerPlane != 16) &&
551: (pVideoTemp->BitsPerPlane != 24) &&
552: (pVideoTemp->BitsPerPlane != 32)))
553: {
554: pVideoTemp->Length = 0;
555: }
556:
557: pVideoTemp = (PVIDEO_MODE_INFORMATION)
558: (((PUCHAR)pVideoTemp) + modes.ModeInformationLength);
559: }
560:
561: return modes.NumModes;
562:
563: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.