int PackedDibGetColorTableSize (BITMAPINFO * pPackedDib) { if (pPackedDib->bmiHeader.biSize == sizeof (BITMAPCOREHEADER)) return PackedDibGetNumColors (pPackedDib) * sizeof (RGBTRIPLE) ; else return PackedDibGetNumColors (pPackedDib) * sizeof (RGBQUAD) ; }
HPALETTE PackedDibCreatePalette (BITMAPINFO * pPackedDib) { HPALETTE hPalette ; int i, iNumColors ; LOGPALETTE * plp ; RGBQUAD * prgb ; if (0 == (iNumColors = PackedDibGetNumColors (pPackedDib))) return NULL ; plp = malloc (sizeof (LOGPALETTE) * (iNumColors - 1) * sizeof (PALETTEENTRY)) ; plp->palVersion = 0x0300 ; plp->palNumEntries = iNumColors ; for (i = 0 ; i < iNumColors ; i++) { prgb = PackedDibGetColorTableEntry (pPackedDib, i) ; plp->palPalEntry[i].peRed = prgb->rgbRed ; plp->palPalEntry[i].peGreen = prgb->rgbGreen ; plp->palPalEntry[i].peBlue = prgb->rgbBlue ; plp->palPalEntry[i].peFlags = 0 ; } hPalette = CreatePalette (plp) ; free (plp) ; return hPalette ; }
RGBQUAD * PackedDibGetColorTablePtr(BITMAPINFO * pPackedDib) { if(PackedDibGetNumColors(pPackedDib) == 0) return 0; return (RGBQUAD *) (((BYTE *) pPackedDib) + PackedDibGetInfoHeaderSize(pPackedDib)); }
RGBQUAD * PackedDibGetColorTableEntry(BITMAPINFO * pPackedDib, int i) { if (PackedDibGetNumColors (pPackedDib) == 0) return NULL; if (pPackedDib->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) return (RGBQUAD *) (((RGBTRIPLE *) PackedDibGetColorTablePtr (pPackedDib)) + 1); else return PackedDibGetColorTablePtr(pPackedDib) + i; }