Annotation of ntddk/src/video/displays/vga256/palette.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.