|
|
1.1 root 1: /******************************Module*Header*******************************\
2: * Module Name: palette.c
3: *
4: * Palette support.
5: *
6: * Copyright (c) 1992 Microsoft Corporation
7: \**************************************************************************/
8:
9: #include "driver.h"
10:
11: // Global Table defining the 20 Window Default Colors. For 256 color
12: // palettes the first 10 must be put at the beginning of the palette
13: // and the last 10 at the end of the palette.
14:
15: const PALETTEENTRY BASEPALETTE[20] =
16: {
17: { 0, 0, 0, 0 }, // 0
18: { 0x80,0, 0, 0 }, // 1
19: { 0, 0x80,0, 0 }, // 2
20: { 0x80,0x80,0, 0 }, // 3
21: { 0, 0, 0x80,0 }, // 4
22: { 0x80,0, 0x80,0 }, // 5
23: { 0, 0x80,0x80,0 }, // 6
24: { 0xC0,0xC0,0xC0,0 }, // 7
25: { 192, 220, 192, 0 }, // 8
26: { 166, 202, 240, 0 }, // 9
27: { 255, 251, 240, 0 }, // 10
28: { 160, 160, 164, 0 }, // 11
29: { 0x80,0x80,0x80,0 }, // 12
30: { 0xFF,0, 0 ,0 }, // 13
31: { 0, 0xFF,0 ,0 }, // 14
32: { 0xFF,0xFF,0 ,0 }, // 15
33: { 0 ,0, 0xFF,0 }, // 16
34: { 0xFF,0, 0xFF,0 }, // 17
35: { 0, 0xFF,0xFF,0 }, // 18
36: { 0xFF,0xFF,0xFF,0 }, // 19
37: };
38:
39: BOOL bInitDefaultPalette(PPDEV ppdev);
40:
41: /******************************Public*Routine******************************\
42: * bInitPaletteInfo
43: *
44: * Initializes the palette information for this PDEV.
45: *
46: * Called by DrvEnablePDEV.
47: *
48: \**************************************************************************/
49:
50: BOOL bInitPaletteInfo(PPDEV ppdev)
51: {
52: if (!bInitDefaultPalette(ppdev))
53: return(FALSE);
54:
55: return(TRUE);
56: }
57:
58: /******************************Public*Routine******************************\
59: * vDisablePalette
60: *
61: * Frees resources allocated by bInitPaletteInfo.
62: *
63: \**************************************************************************/
64:
65: VOID vDisablePalette(PPDEV ppdev)
66: {
67: // Delete the default palette if we created one.
68:
69: if (ppdev->hpalDefault)
70: {
71: EngDeletePalette(ppdev->hpalDefault);
72: ppdev->hpalDefault = (HPALETTE) 0;
73: }
74:
75: if (ppdev->pPal != (PPALETTEENTRY)NULL)
76: LocalFree((PVOID)ppdev->pPal);
77: }
78:
79: /******************************Public*Routine******************************\
80: * bInitDefaultPalette
81: *
82: * Initializes default palette for PDEV.
83: *
84: \**************************************************************************/
85:
86: BOOL bInitDefaultPalette(PPDEV ppdev)
87: {
88: ULONG ulLoop;
89: BYTE jRed;
90: BYTE jGre;
91: BYTE jBlu;
92:
93: // Allocate our palette
94:
95: ppdev->pPal = (PPALETTEENTRY)LocalAlloc(LMEM_FIXED | LMEM_ZEROINIT,
96: (sizeof(PALETTEENTRY) * 256));
97:
98: if ((ppdev->pPal) == NULL)
99: {
100: RIP("Couldn't allocate default palette");
101: return(FALSE);
102: }
103:
104: // Generate 256 (8*4*4) RGB combinations to fill the palette
105:
106: jRed = jGre = jBlu = 0;
107:
108: for (ulLoop = 0; ulLoop < 256; ulLoop++)
109: {
110: ppdev->pPal[ulLoop].peRed = jRed;
111: ppdev->pPal[ulLoop].peGreen = jGre;
112: ppdev->pPal[ulLoop].peBlue = jBlu;
113: ppdev->pPal[ulLoop].peFlags = (BYTE)0;
114:
115: if (!((jRed += 8) & 0x3F))
116: if (!((jGre += 8) & 0x3F))
117: jBlu += 16;
118: }
119:
120: // Fill in Windows Reserved Colors from the WIN 3.0 DDK
121: // The Window Manager reserved the first and last 10 colors for
122: // painting windows borders and for non-palette managed applications.
123:
124: for (ulLoop = 0; ulLoop < 10; ulLoop++)
125: {
126: // First 10
127:
128: ppdev->pPal[ulLoop].peRed = BASEPALETTE[ulLoop].peRed ;
129: ppdev->pPal[ulLoop].peGreen = BASEPALETTE[ulLoop].peGreen ;
130: ppdev->pPal[ulLoop].peBlue = BASEPALETTE[ulLoop].peBlue ;
131: ppdev->pPal[ulLoop].peFlags = BASEPALETTE[ulLoop].peFlags;
132:
133: // Last 10
134:
135: ppdev->pPal[246+ulLoop].peRed = BASEPALETTE[ulLoop+10].peRed ;
136: ppdev->pPal[246+ulLoop].peGreen = BASEPALETTE[ulLoop+10].peGreen ;
137: ppdev->pPal[246+ulLoop].peBlue = BASEPALETTE[ulLoop+10].peBlue ;
138: ppdev->pPal[246+ulLoop].peFlags = BASEPALETTE[ulLoop+10].peFlags;
139: }
140:
141: // Create handle for palette.
142:
143: ppdev->hpalDefault = EngCreatePalette(PAL_INDEXED,
144: 256,
145: (PULONG) ppdev->pPal,
146: 0,0,0);
147: ppdev->pDevInfo->hpalDefault = ppdev->hpalDefault;
148:
149: if (ppdev->hpalDefault == (HPALETTE) 0)
150: {
151: RIP("Couldn't create default palette");
152: LocalFree(ppdev->pPal);
153: return(FALSE);
154: }
155:
156: // Initialize the hardware with the initial palette.
157:
158: return(TRUE);
159: }
160:
161: /******************************Public*Routine******************************\
162: * bInit256ColorPalette
163: *
164: * Initialize the hardware's palette registers.
165: *
166: \**************************************************************************/
167:
168: BOOL bInit256ColorPalette(PPDEV ppdev)
169: {
170: BYTE ajClutSpace[MAX_CLUT_SIZE];
171: PVIDEO_CLUT pScreenClut = (PVIDEO_CLUT) ajClutSpace;
172: ULONG ulReturnedDataLength;
173: PALETTEENTRY* ppalFrom;
174: PALETTEENTRY* ppalTo;
175: PALETTEENTRY* ppalEnd;
176:
177: // Fill in pScreenClut header info
178:
179: pScreenClut->NumEntries = 256;
180: pScreenClut->FirstEntry = 0;
181:
182: // Copy Colors in.
183:
184: ppalFrom = ppdev->pPal;
185: ppalTo = (PALETTEENTRY*) pScreenClut->LookupTable;
186: ppalEnd = &ppalTo[256];
187:
188: for (; ppalTo < ppalEnd; ppalFrom++, ppalTo++)
189: {
190: ppalTo->peRed = ppalFrom->peRed >> 2;
191: ppalTo->peGreen = ppalFrom->peGreen >> 2;
192: ppalTo->peBlue = ppalFrom->peBlue >> 2;
193: ppalTo->peFlags = 0;
194: }
195:
196: // Set palette registers
197:
198: if (!DeviceIoControl(ppdev->hDriver,
199: IOCTL_VIDEO_SET_COLOR_REGISTERS,
200: pScreenClut,
201: MAX_CLUT_SIZE,
202: NULL,
203: 0,
204: &ulReturnedDataLength,
205: NULL))
206: {
207: return(FALSE);
208: }
209:
210: return(TRUE);
211: }
212:
213: /******************************Public*Routine******************************\
214: * DrvSetPalette
215: *
216: * DDI entry point for manipulating the palette.
217: *
218: \**************************************************************************/
219:
220: BOOL DrvSetPalette(
221: IN DHPDEV dhpdev,
222: IN PALOBJ *ppalo,
223: IN FLONG fl,
224: IN ULONG iStart,
225: IN ULONG cColors)
226: {
227: BYTE ajClutSpace[MAX_CLUT_SIZE];
228: PVIDEO_CLUT pScreenClut = (PVIDEO_CLUT) ajClutSpace;
229: PALETTEENTRY* ppal;
230: PALETTEENTRY* ppalEnd;
231:
232: UNREFERENCED_PARAMETER(fl);
233:
234: // Fill in pScreenClut header info
235:
236: pScreenClut->NumEntries = (USHORT) cColors;
237: pScreenClut->FirstEntry = (USHORT) iStart;
238:
239: ppal = (PPALETTEENTRY) (pScreenClut->LookupTable);
240:
241: if (cColors != PALOBJ_cGetColors(ppalo, iStart, cColors, (PULONG) ppal))
242: {
243: return(FALSE);
244: }
245:
246: // Set the high reserved byte in each palette entry to 0.
247:
248: for (ppalEnd = &ppal[cColors]; ppal < ppalEnd; ppal++)
249: {
250: ppal->peRed >>= 2;
251: ppal->peGreen >>= 2;
252: ppal->peBlue >>= 2;
253: ppal->peFlags = 0;
254: }
255:
256: // Set palette registers
257:
258: if (!DeviceIoControl(((PPDEV)(dhpdev))->hDriver,
259: IOCTL_VIDEO_SET_COLOR_REGISTERS,
260: pScreenClut,
261: MAX_CLUT_SIZE,
262: NULL,
263: 0,
264: &cColors,
265: NULL))
266: {
267: return(FALSE);
268: }
269:
270: return(TRUE);
271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.