ReactOS  0.4.14-dev-368-gfa26425
palette.c
Go to the documentation of this file.
1 /*
2  * ReactOS Generic Framebuffer display driver
3  *
4  * Copyright (C) 2004 Filip Navara
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19  */
20 
21 #include "framebuf.h"
22 
23 /*
24  * Standard color that must be in palette, because they're used for
25  * drawing window borders and other GUI elements.
26  */
27 
29 {
30  { 0x00, 0x00, 0x00, 0x00 },
31  { 0x80, 0x00, 0x00, 0x00 },
32  { 0x00, 0x80, 0x00, 0x00 },
33  { 0x80, 0x80, 0x00, 0x00 },
34  { 0x00, 0x00, 0x80, 0x00 },
35  { 0x80, 0x00, 0x80, 0x00 },
36  { 0x00, 0x80, 0x80, 0x00 },
37  { 0xC0, 0xC0, 0xC0, 0x00 },
38  { 0xC0, 0xDC, 0xC0, 0x00 },
39  { 0xD4, 0xD0, 0xC8, 0x00 },
40  { 0xFF, 0xFB, 0xF0, 0x00 },
41  { 0x3A, 0x6E, 0xA5, 0x00 },
42  { 0x80, 0x80, 0x80, 0x00 },
43  { 0xFF, 0x00, 0x00, 0x00 },
44  { 0x00, 0xFF, 0x00, 0x00 },
45  { 0xFF, 0xFF, 0x00, 0x00 },
46  { 0x00, 0x00, 0xFF, 0x00 },
47  { 0xFF, 0x00, 0xFF, 0x00 },
48  { 0x00, 0xFF, 0xFF, 0x00 },
49  { 0xFF, 0xFF, 0xFF, 0x00 },
50 };
51 
52 /*
53  * IntInitDefaultPalette
54  *
55  * Initializes default palette for PDEV and fill it with the colors specified
56  * by the GDI standard.
57  */
58 
59 BOOL
61  PPDEV ppdev,
62  PDEVINFO pDevInfo)
63 {
64  ULONG ColorLoop;
65  PPALETTEENTRY PaletteEntryPtr;
66 
67  if (ppdev->BitsPerPixel > 8)
68  {
69  ppdev->DefaultPalette = pDevInfo->hpalDefault =
71  ppdev->RedMask, ppdev->GreenMask, ppdev->BlueMask);
72  }
73  else
74  {
75  ppdev->PaletteEntries = EngAllocMem(0, sizeof(PALETTEENTRY) << 8, ALLOC_TAG);
76  if (ppdev->PaletteEntries == NULL)
77  {
78  return FALSE;
79  }
80 
81  for (ColorLoop = 256, PaletteEntryPtr = ppdev->PaletteEntries;
82  ColorLoop != 0;
83  ColorLoop--, PaletteEntryPtr++)
84  {
85  PaletteEntryPtr->peRed = ((ColorLoop >> 5) & 7) * 255 / 7;
86  PaletteEntryPtr->peGreen = ((ColorLoop >> 3) & 3) * 255 / 3;
87  PaletteEntryPtr->peBlue = (ColorLoop & 7) * 255 / 7;
88  PaletteEntryPtr->peFlags = 0;
89  }
90 
91  memcpy(ppdev->PaletteEntries, BASEPALETTE, 10 * sizeof(PALETTEENTRY));
92  memcpy(ppdev->PaletteEntries + 246, BASEPALETTE + 10, 10 * sizeof(PALETTEENTRY));
93 
94  ppdev->DefaultPalette = pDevInfo->hpalDefault =
95  EngCreatePalette(PAL_INDEXED, 256, (PULONG)ppdev->PaletteEntries, 0, 0, 0);
96  }
97 
98  return ppdev->DefaultPalette != NULL;
99 }
100 
101 /*
102  * IntSetPalette
103  *
104  * Requests that the driver realize the palette for a specified device. The
105  * driver sets the hardware palette to match the entries in the given palette
106  * as closely as possible.
107  */
108 
111  IN DHPDEV dhpdev,
112  IN PPALETTEENTRY ppalent,
113  IN ULONG iStart,
114  IN ULONG cColors)
115 {
116  PVIDEO_CLUT pClut;
117  ULONG ClutSize;
118 
119  ClutSize = sizeof(VIDEO_CLUT) + (cColors * sizeof(ULONG));
120  pClut = EngAllocMem(0, ClutSize, ALLOC_TAG);
121  pClut->FirstEntry = iStart;
122  pClut->NumEntries = cColors;
123  memcpy(&pClut->LookupTable[0].RgbLong, ppalent, sizeof(ULONG) * cColors);
124 
125  if (((PPDEV)dhpdev)->PaletteShift)
126  {
127  while (cColors--)
128  {
129  pClut->LookupTable[cColors].RgbArray.Red >>= ((PPDEV)dhpdev)->PaletteShift;
130  pClut->LookupTable[cColors].RgbArray.Green >>= ((PPDEV)dhpdev)->PaletteShift;
131  pClut->LookupTable[cColors].RgbArray.Blue >>= ((PPDEV)dhpdev)->PaletteShift;
132  pClut->LookupTable[cColors].RgbArray.Unused = 0;
133  }
134  }
135  else
136  {
137  while (cColors--)
138  {
139  pClut->LookupTable[cColors].RgbArray.Unused = 0;
140  }
141  }
142 
143  /*
144  * Set the palette registers.
145  */
146 
147  if (EngDeviceIoControl(((PPDEV)dhpdev)->hDriver, IOCTL_VIDEO_SET_COLOR_REGISTERS,
148  pClut, ClutSize, NULL, 0, &cColors))
149  {
150  EngFreeMem(pClut);
151  return FALSE;
152  }
153 
154  EngFreeMem(pClut);
155  return TRUE;
156 }
157 
158 /*
159  * DrvSetPalette
160  *
161  * Requests that the driver realize the palette for a specified device. The
162  * driver sets the hardware palette to match the entries in the given palette
163  * as closely as possible.
164  *
165  * Status
166  * @implemented
167  */
168 
171  IN DHPDEV dhpdev,
172  IN PALOBJ *ppalo,
173  IN FLONG fl,
174  IN ULONG iStart,
175  IN ULONG cColors)
176 {
177  PPALETTEENTRY PaletteEntries;
178  BOOL bRet;
179 
180  if (cColors == 0)
181  return FALSE;
182 
183  PaletteEntries = EngAllocMem(0, cColors * sizeof(ULONG), ALLOC_TAG);
184  if (PaletteEntries == NULL)
185  {
186  return FALSE;
187  }
188 
189  if (PALOBJ_cGetColors(ppalo, iStart, cColors, (PULONG)PaletteEntries) !=
190  cColors)
191  {
192  EngFreeMem(PaletteEntries);
193  return FALSE;
194  }
195 
196  bRet = IntSetPalette(dhpdev, PaletteEntries, iStart, cColors);
197  EngFreeMem(PaletteEntries);
198  return bRet;
199 }
PALETTEENTRY * PaletteEntries
Definition: framebuf.h:49
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
ULONG RgbLong
Definition: ntddvdeo.h:523
typedef DHPDEV(APIENTRY FN_DrvEnablePDEV)(_In_ DEVMODEW *pdm
BOOL APIENTRY DrvSetPalette(IN DHPDEV dhpdev, IN PALOBJ *ppalo, IN FLONG fl, IN ULONG iStart, IN ULONG cColors)
Definition: palette.c:170
#define EngFreeMem
Definition: polytest.cpp:56
ULONG GreenMask
Definition: framebuf.h:44
USHORT FirstEntry
Definition: ntddvdeo.h:520
BOOL IntInitDefaultPalette(PPDEV ppdev, PDEVINFO pDevInfo)
Definition: palette.c:60
_In_ LPWSTR _In_ ULONG _In_ ULONG _In_ ULONG _Out_ DEVINFO _In_ HDEV _In_ LPWSTR _In_ HANDLE hDriver
Definition: winddi.h:3553
_In_ UINT iStart
Definition: wingdi.h:3615
VIDEO_CLUTDATA RgbArray
Definition: ntddvdeo.h:522
ULONG APIENTRY PALOBJ_cGetColors(PALOBJ *PalObj, ULONG Start, ULONG Colors, ULONG *PaletteEntry)
Definition: palette.c:423
#define ALLOC_TAG
Definition: btrfs_drv.h:91
HPALETTE APIENTRY EngCreatePalette(ULONG iMode, ULONG cColors, ULONG *pulColors, ULONG flRed, ULONG flGreen, ULONG flBlue)
Definition: palette.c:375
_In_ FLONG fl
Definition: winddi.h:1279
ULONG BlueMask
Definition: framebuf.h:45
unsigned int BOOL
Definition: ntddk_ex.h:94
const PALETTEENTRY BASEPALETTE[20]
Definition: palette.c:28
BYTE BitsPerPixel
Definition: framebuf.h:42
HPALETTE hpalDefault
Definition: winddi.h:398
smooth NULL
Definition: ftsmooth.c:416
unsigned long FLONG
Definition: ntbasedef.h:373
USHORT NumEntries
Definition: ntddvdeo.h:519
_In_ PALOBJ * ppalo
Definition: winddi.h:4012
ULONG RedMask
Definition: framebuf.h:43
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
struct _PDEV * PPDEV
Definition: framebuf.h:33
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
BOOL APIENTRY IntSetPalette(IN DHPDEV dhpdev, IN PPALETTEENTRY ppalent, IN ULONG iStart, IN ULONG cColors)
Definition: palette.c:110
HPALETTE DefaultPalette
Definition: framebuf.h:48
unsigned int * PULONG
Definition: retypes.h:1
unsigned int ULONG
Definition: retypes.h:1
union VIDEO_CLUT::@3066 LookupTable[1]
#define APIENTRY
Definition: api.h:79
#define IOCTL_VIDEO_SET_COLOR_REGISTERS
Definition: ntddvdeo.h:149