123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- /*
- * CDE - Common Desktop Environment
- *
- * Copyright (c) 1993-2012, The Open Group. All rights reserved.
- *
- * These libraries and programs are free software; you can
- * redistribute them and/or modify them under the terms of the GNU
- * Lesser General Public License as published by the Free Software
- * Foundation; either version 2 of the License, or (at your option)
- * any later version.
- *
- * These libraries and programs are distributed in the hope that
- * they will be useful, but WITHOUT ANY WARRANTY; without even the
- * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
- * PURPOSE. See the GNU Lesser General Public License for more
- * details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with these libraries and programs; if not, write
- * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
- * Floor, Boston, MA 02110-1301 USA
- */
- /* $XConsortium: ilpalette.c /main/3 1995/10/23 15:58:32 rswiston $ */
- /**---------------------------------------------------------------------
- ***
- *** (c)Copyright 1991 Hewlett-Packard Co.
- ***
- *** RESTRICTED RIGHTS LEGEND
- *** Use, duplication, or disclosure by the U.S. Government is subject to
- *** restrictions as set forth in sub-paragraph (c)(1)(ii) of the Rights in
- *** Technical Data and Computer Software clause in DFARS 252.227-7013.
- *** Hewlett-Packard Company
- *** 3000 Hanover Street
- *** Palo Alto, CA 94304 U.S.A.
- *** Rights for non-DOD U.S. Government Departments and Agencies are as set
- *** forth in FAR 52.227-19(c)(1,2).
- ***
- ***-------------------------------------------------------------------*/
- /* /ilc/ilpalette.c : Code for handling IL_PALETTE images.
- Mostly converters to other types (e.g. to RGB), referenced by
- /ilc/ilconvert.c
- */
- #include "ilint.h"
- #include "ilpipelem.h"
- #include "ilconvert.h"
- /* ----------------------- ilPaletteToRGBByte ------------------------- */
- /* Converts byte palette image to RGB, each a byte
- Input image: uncompressed IL_PALETTE, any # of levels, IL_FORMAT_BYTE.
- Output image: IL_DES_RGB, IL_FORMAT_3BYTE_PIXEL.
- */
- /* Private data, inited by Init() function.
- "palette" is inited when the element is added. It is a copy of the palette,
- as longwords: <8 unused> <8 blue> <8 green> <8 red> for each value 0..255
- for faster lookup of each palette pixel. Each 8 is the upper 8 bits of
- the palette entry.
- */
- typedef struct {
- long nPixelsM1; /* width - 1 of src/dst images */
- long srcRowBytes; /* bytes/row of src image */
- ilPtr pSrcPixels; /* ptr to start of src pixels */
- long dstRowBytes; /* bytes/row of dst image */
- ilPtr pDstPixels; /* ptr to start of dst pixels */
- unsigned short *pPalette; /* ptr to palette, set by AddElement() */
- unsigned long palette [256]; /* copy of palette: see above */
- ilBool firstStrip; /* true if first strip to Execute() */
- } ilPaletteToRGBPrivRec, *ilPaletteToRGBPrivPtr;
- /* AddElement() function, called by ilConvert() after the pipe element is added.
- Merely copy the given pPalette into private.
- */
- static ilError ilAddElementPaletteToRGBByte (
- ilPaletteToRGBPrivPtr pPriv,
- unsigned short *pPalette
- )
- {
- pPriv->pPalette = pPalette;
- return IL_OK;
- }
- /* Init() function: init values in private */
- static ilError ilInitPaletteToRGBByte (
- ilPaletteToRGBPrivPtr pPriv,
- ilImageInfo *pSrcImage,
- ilImageInfo *pDstImage
- )
- {
- pPriv->nPixelsM1 = pSrcImage->width - 1;
- pPriv->srcRowBytes = pSrcImage->plane[0].nBytesPerRow;
- pPriv->pSrcPixels = pSrcImage->plane[0].pPixels;
- pPriv->dstRowBytes = pDstImage->plane[0].nBytesPerRow;
- pPriv->pDstPixels = pDstImage->plane[0].pPixels;
- pPriv->firstStrip = TRUE;
- return IL_OK;
- }
- /* Called by Execute() to setup "palette" in private */
- static void ilInitPackedPalette (
- ilPaletteToRGBPrivPtr pPriv
- )
- {
- int i;
- unsigned long *pPacked, packed;
- unsigned short *pRed, *pGreen, *pBlue, temp;
- /* Pack the upper 8 bits of the rgb value, with blue in the high order bits. */
- pPacked = pPriv->palette;
- pRed = &pPriv->pPalette [0 * 256];
- pGreen = &pPriv->pPalette [1 * 256];
- pBlue = &pPriv->pPalette [2 * 256];
- for (i = 0; i < 256; i++) {
- temp = *pBlue++;
- packed = temp >> 8;
- packed <<= 8;
- temp = *pGreen++;
- packed |= temp >> 8;
- packed <<= 8;
- temp = *pRed++;
- packed |= temp >> 8;
- *pPacked++ = packed;
- }
- }
- /* Execute() function: convert the given # of src lines.
- Lookup each palette byte (0..255) and get a long which looks like:
- <8 unused> <8 blue> <8 green> <8 red>
- output the lower 8 bits, then shift to get RGB.
- */
- static ilError ilExecutePaletteToRGBByte (
- ilExecuteData *pData,
- long dstLine,
- long *pNLines /* ignored on input */
- )
- {
- ilPaletteToRGBPrivPtr pPriv;
- long srcRowBytes, dstRowBytes, nPixelsM1;
- ilPtr pSrcLine, pDstLine;
- ilPtr pSrc, pDst;
- unsigned long rgb, *pPackedPalette;
- long nLinesM1, nPixelsM1Temp;
- /* If firstStrip, init the packed palette in private */
- pPriv = (ilPaletteToRGBPrivPtr)pData->pPrivate;
- if (pPriv->firstStrip) {
- ilInitPackedPalette (pPriv);
- pPriv->firstStrip = FALSE;
- }
- /* Setup src,dst line ptrs and rowBytes, and nLines/PixelsM1 ("minus 1");
- exit if no lines or pixels.
- */
- srcRowBytes = pPriv->srcRowBytes;
- pSrcLine = pPriv->pSrcPixels + pData->srcLine * srcRowBytes;
- dstRowBytes = pPriv->dstRowBytes;
- pDstLine = pPriv->pDstPixels + dstLine * dstRowBytes;
- nPixelsM1 = pPriv->nPixelsM1;
- if (nPixelsM1 < 0)
- return 0;
- nLinesM1 = *pNLines;
- if (nLinesM1 <= 0)
- return 0;
- nLinesM1--;
- /* For each src byte: get a long from the cvt'd palette table, then take
- the low eight bits to get r,g,b, shifting down by 8 to get next component.
- */
- pPackedPalette = pPriv->palette;
- do {
- pSrc = pSrcLine;
- pSrcLine += srcRowBytes;
- pDst = pDstLine;
- pDstLine += dstRowBytes;
- nPixelsM1Temp = nPixelsM1;
- do {
- rgb = pPackedPalette [*pSrc++];
- *pDst++ = (ilByte)rgb; /* red */
- rgb >>= 8;
- *pDst++ = (ilByte)rgb; /* green */
- rgb >>= 8;
- *pDst++ = (ilByte)rgb; /* blue */
- } while (--nPixelsM1Temp >= 0);
- } while (--nLinesM1 >= 0);
- return IL_OK;
- }
- /* Table exported to ilConvert(), declared in /ilc/ilconvert.h .
- */
- IL_PRIVATE ilConvertRec _ilPaletteToRGBByte = {
- IL_NPF, /* CheckFormat() */
- IL_STD_FORMAT_BYTE, /* srcFormatCode */
- ilAddElementPaletteToRGBByte, /* AddElement() */
- IL_DES_RGB, /* pDstDes */
- IL_FORMAT_3BYTE_PIXEL, /* pDstFormat */
- sizeof (ilPaletteToRGBPrivRec), /* nBytesPrivate */
- ilInitPaletteToRGBByte, /* Init() */
- IL_NPF, /* Cleanup() */
- IL_NPF, /* Destroy() */
- ilExecutePaletteToRGBByte /* Execute() */
- };
|