Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

295 lines
8.7 KiB

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