VirtualBox

source: vbox/trunk/src/VBox/Additions/WINNT/Graphics/Display/palette.c@ 22099

Last change on this file since 22099 was 18246, checked in by vboxsync, 16 years ago

license header updates from filemuncher

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.9 KB
Line 
1/******************************Module*Header*******************************\
2*
3 * Copyright (C) 2006-2007 Sun Microsystems, Inc.
4 *
5 * This file is part of VirtualBox Open Source Edition (OSE), as
6 * available from http://www.virtualbox.org. This file is free software;
7 * you can redistribute it and/or modify it under the terms of the GNU
8 * General Public License (GPL) as published by the Free Software
9 * Foundation, in version 2 as it comes in the "COPYING" file of the
10 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
11 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
12 *
13 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
14 * Clara, CA 95054 USA or visit http://www.sun.com if you need
15 * additional information or have any questions.
16*/
17/*
18* Based in part on Microsoft DDK sample code
19*
20* *******************
21* * GDI SAMPLE CODE *
22* *******************
23*
24* Module Name: palette.c
25*
26* Palette support.
27*
28* Copyright (c) 1992-1998 Microsoft Corporation
29\**************************************************************************/
30
31#include "driver.h"
32
33// Global Table defining the 20 Window Default Colors. For 256 color
34// palettes the first 10 must be put at the beginning of the palette
35// and the last 10 at the end of the palette.
36
37const PALETTEENTRY BASEPALETTE[20] =
38{
39 { 0, 0, 0, 0 }, // 0
40 { 0x80,0, 0, 0 }, // 1
41 { 0, 0x80,0, 0 }, // 2
42 { 0x80,0x80,0, 0 }, // 3
43 { 0, 0, 0x80,0 }, // 4
44 { 0x80,0, 0x80,0 }, // 5
45 { 0, 0x80,0x80,0 }, // 6
46 { 0xC0,0xC0,0xC0,0 }, // 7
47 { 192, 220, 192, 0 }, // 8
48 { 166, 202, 240, 0 }, // 9
49 { 255, 251, 240, 0 }, // 10
50 { 160, 160, 164, 0 }, // 11
51 { 0x80,0x80,0x80,0 }, // 12
52 { 0xFF,0, 0 ,0 }, // 13
53 { 0, 0xFF,0 ,0 }, // 14
54 { 0xFF,0xFF,0 ,0 }, // 15
55 { 0 ,0, 0xFF,0 }, // 16
56 { 0xFF,0, 0xFF,0 }, // 17
57 { 0, 0xFF,0xFF,0 }, // 18
58 { 0xFF,0xFF,0xFF,0 }, // 19
59};
60
61BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo);
62
63/******************************Public*Routine******************************\
64* bInitPaletteInfo
65*
66* Initializes the palette information for this PDEV.
67*
68* Called by DrvEnablePDEV.
69*
70\**************************************************************************/
71
72BOOL bInitPaletteInfo(PPDEV ppdev, DEVINFO *pDevInfo)
73{
74 if (!bInitDefaultPalette(ppdev, pDevInfo))
75 return(FALSE);
76
77 return(TRUE);
78}
79
80/******************************Public*Routine******************************\
81* vDisablePalette
82*
83* Frees resources allocated by bInitPaletteInfo.
84*
85\**************************************************************************/
86
87VOID vDisablePalette(PPDEV ppdev)
88{
89// Delete the default palette if we created one.
90
91 if (ppdev->hpalDefault)
92 {
93 EngDeletePalette(ppdev->hpalDefault);
94 ppdev->hpalDefault = (HPALETTE) 0;
95 }
96
97 if (ppdev->pPal != (PPALETTEENTRY)NULL)
98 EngFreeMem((PVOID)ppdev->pPal);
99}
100
101/******************************Public*Routine******************************\
102* bInitDefaultPalette
103*
104* Initializes default palette for PDEV.
105*
106\**************************************************************************/
107
108BOOL bInitDefaultPalette(PPDEV ppdev, DEVINFO *pDevInfo)
109{
110 if (ppdev->ulBitCount == 8)
111 {
112 ULONG ulLoop;
113 BYTE jRed,jGre,jBlu;
114
115 //
116 // Allocate our palette
117 //
118
119 ppdev->pPal = (PPALETTEENTRY)EngAllocMem(0, sizeof(PALETTEENTRY) * 256,
120 ALLOC_TAG);
121
122 if ((ppdev->pPal) == NULL) {
123 DISPDBG((0, "DISP bInitDefaultPalette() failed EngAllocMem\n"));
124 return(FALSE);
125 }
126
127 //
128 // Generate 256 (8*4*4) RGB combinations to fill the palette
129 //
130
131 jRed = jGre = jBlu = 0;
132
133 for (ulLoop = 0; ulLoop < 256; ulLoop++)
134 {
135 ppdev->pPal[ulLoop].peRed = jRed;
136 ppdev->pPal[ulLoop].peGreen = jGre;
137 ppdev->pPal[ulLoop].peBlue = jBlu;
138 ppdev->pPal[ulLoop].peFlags = (BYTE)0;
139
140 if (!(jRed += 32))
141 if (!(jGre += 32))
142 jBlu += 64;
143 }
144
145 //
146 // Fill in Windows Reserved Colors from the WIN 3.0 DDK
147 // The Window Manager reserved the first and last 10 colors for
148 // painting windows borders and for non-palette managed applications.
149 //
150
151 for (ulLoop = 0; ulLoop < 10; ulLoop++)
152 {
153 //
154 // First 10
155 //
156
157 ppdev->pPal[ulLoop] = BASEPALETTE[ulLoop];
158
159 //
160 // Last 10
161 //
162
163 ppdev->pPal[246 + ulLoop] = BASEPALETTE[ulLoop+10];
164 }
165
166 //
167 // Create handle for palette.
168 //
169
170 ppdev->hpalDefault =
171 pDevInfo->hpalDefault = EngCreatePalette(PAL_INDEXED,
172 256,
173 (PULONG) ppdev->pPal,
174 0,0,0);
175
176 if (ppdev->hpalDefault == (HPALETTE) 0)
177 {
178 DISPDBG((0, "DISP bInitDefaultPalette failed EngCreatePalette\n"));
179 EngFreeMem(ppdev->pPal);
180 return(FALSE);
181 }
182
183 //
184 // Initialize the hardware with the initial palette.
185 //
186
187 return(TRUE);
188
189 } else {
190
191 ppdev->hpalDefault =
192 pDevInfo->hpalDefault = EngCreatePalette(PAL_BITFIELDS,
193 0,(PULONG) NULL,
194 ppdev->flRed,
195 ppdev->flGreen,
196 ppdev->flBlue);
197
198 if (ppdev->hpalDefault == (HPALETTE) 0)
199 {
200 DISPDBG((0, "DISP bInitDefaultPalette failed EngCreatePalette\n"));
201 return(FALSE);
202 }
203 }
204
205 return(TRUE);
206}
207
208/******************************Public*Routine******************************\
209* bInit256ColorPalette
210*
211* Initialize the hardware's palette registers.
212*
213\**************************************************************************/
214
215BOOL bInit256ColorPalette(PPDEV ppdev)
216{
217 BYTE ajClutSpace[MAX_CLUT_SIZE];
218 PVIDEO_CLUT pScreenClut;
219 ULONG ulReturnedDataLength;
220 ULONG cColors;
221 PVIDEO_CLUTDATA pScreenClutData;
222
223 if (ppdev->ulBitCount == 8)
224 {
225 //
226 // Fill in pScreenClut header info:
227 //
228
229 pScreenClut = (PVIDEO_CLUT) ajClutSpace;
230 pScreenClut->NumEntries = 256;
231 pScreenClut->FirstEntry = 0;
232
233 //
234 // Copy colours in:
235 //
236
237 cColors = 256;
238 pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0]));
239
240 while(cColors--)
241 {
242 pScreenClutData[cColors].Red = ppdev->pPal[cColors].peRed >>
243 ppdev->cPaletteShift;
244 pScreenClutData[cColors].Green = ppdev->pPal[cColors].peGreen >>
245 ppdev->cPaletteShift;
246 pScreenClutData[cColors].Blue = ppdev->pPal[cColors].peBlue >>
247 ppdev->cPaletteShift;
248 pScreenClutData[cColors].Unused = 0;
249 }
250
251 //
252 // Set palette registers:
253 //
254
255 if (EngDeviceIoControl(ppdev->hDriver,
256 IOCTL_VIDEO_SET_COLOR_REGISTERS,
257 pScreenClut,
258 MAX_CLUT_SIZE,
259 NULL,
260 0,
261 &ulReturnedDataLength))
262 {
263 DISPDBG((0, "Failed bEnablePalette"));
264 return(FALSE);
265 }
266 }
267
268 DISPDBG((5, "Passed bEnablePalette"));
269
270 return(TRUE);
271}
272
273/******************************Public*Routine******************************\
274* DrvSetPalette
275*
276* DDI entry point for manipulating the palette.
277*
278\**************************************************************************/
279
280BOOL DrvSetPalette(
281DHPDEV dhpdev,
282PALOBJ* ppalo,
283FLONG fl,
284ULONG iStart,
285ULONG cColors)
286{
287 BYTE ajClutSpace[MAX_CLUT_SIZE];
288 PVIDEO_CLUT pScreenClut;
289 PVIDEO_CLUTDATA pScreenClutData;
290 PDEV* ppdev;
291
292 UNREFERENCED_PARAMETER(fl);
293
294 ppdev = (PDEV*) dhpdev;
295
296 //
297 // Fill in pScreenClut header info:
298 //
299
300 pScreenClut = (PVIDEO_CLUT) ajClutSpace;
301 pScreenClut->NumEntries = (USHORT) cColors;
302 pScreenClut->FirstEntry = (USHORT) iStart;
303
304 pScreenClutData = (PVIDEO_CLUTDATA) (&(pScreenClut->LookupTable[0]));
305
306 if (cColors != PALOBJ_cGetColors(ppalo, iStart, cColors,
307 (ULONG*) pScreenClutData))
308 {
309 DISPDBG((0, "DrvSetPalette failed PALOBJ_cGetColors\n"));
310 return (FALSE);
311 }
312
313 //
314 // Set the high reserved byte in each palette entry to 0.
315 // Do the appropriate palette shifting to fit in the DAC.
316 //
317
318 if (ppdev->cPaletteShift)
319 {
320 while(cColors--)
321 {
322 pScreenClutData[cColors].Red >>= ppdev->cPaletteShift;
323 pScreenClutData[cColors].Green >>= ppdev->cPaletteShift;
324 pScreenClutData[cColors].Blue >>= ppdev->cPaletteShift;
325 pScreenClutData[cColors].Unused = 0;
326 }
327 }
328 else
329 {
330 while(cColors--)
331 {
332 pScreenClutData[cColors].Unused = 0;
333 }
334 }
335
336 //
337 // Set palette registers
338 //
339
340 if (EngDeviceIoControl(ppdev->hDriver,
341 IOCTL_VIDEO_SET_COLOR_REGISTERS,
342 pScreenClut,
343 MAX_CLUT_SIZE,
344 NULL,
345 0,
346 &cColors))
347 {
348 DISPDBG((0, "DrvSetPalette failed EngDeviceIoControl\n"));
349 return (FALSE);
350 }
351
352 return(TRUE);
353
354}
355
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette