1419 lines
27 KiB
C
1419 lines
27 KiB
C
/* **********************************************************
|
|
* Copyright (C) 1999-2001 VMware, Inc.
|
|
* All Rights Reserved
|
|
* **********************************************************/
|
|
#ifdef VMX86_DEVEL
|
|
char rcsId_bits2pixels[] = "Id: bits2pixels.c,v 1.6 2001/01/26 23:32:15 yoel Exp $";
|
|
#else
|
|
#define FILECODE "F(814)"
|
|
#endif
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include "config.h"
|
|
#endif
|
|
|
|
/*
|
|
* bits2pixels.c --
|
|
*
|
|
* Emulation routines to convert bitmaps to pixmaps
|
|
*/
|
|
|
|
#include "vm_basic_types.h"
|
|
#include "bits2pixels.h"
|
|
|
|
|
|
/*
|
|
* Local functions
|
|
*/
|
|
|
|
static void RasterBitsToPixels8(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg);
|
|
|
|
static void RasterBitsToPixels16(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg);
|
|
|
|
static void RasterBitsToPixels24(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg);
|
|
|
|
static void RasterBitsToPixels32(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg);
|
|
|
|
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* vmwareRaster_BitsToPixels --
|
|
*
|
|
* Convert a bitmap to a pixmap, converting 1 bits to the foreground
|
|
* color (fg) and 0 bits to the background color (bg).
|
|
*
|
|
* Results:
|
|
* Pixmap filled with pixels
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
vmwareRaster_BitsToPixels(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment, int bytes_per_pixel,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg)
|
|
{
|
|
switch (bytes_per_pixel) {
|
|
case 1:
|
|
RasterBitsToPixels8(bits, bits_increment, pix, pix_increment,
|
|
width, height, fg, bg);
|
|
break;
|
|
|
|
case 2:
|
|
RasterBitsToPixels16(bits, bits_increment, pix, pix_increment,
|
|
width, height, fg, bg);
|
|
break;
|
|
|
|
case 3:
|
|
RasterBitsToPixels24(bits, bits_increment, pix, pix_increment,
|
|
width, height, fg, bg);
|
|
break;
|
|
|
|
case 4:
|
|
RasterBitsToPixels32(bits, bits_increment, pix, pix_increment,
|
|
width, height, fg, bg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* RasterBitsToPixels8 --
|
|
*
|
|
* Convert a bitmap to a pixmap, converting 1 bits to the foreground
|
|
* color (fg) and 0 bits to the background color (bg), for an 8-bit
|
|
* pixmap
|
|
*
|
|
* Results:
|
|
* Pixmap filled with pixels
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
RasterBitsToPixels8(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg)
|
|
{
|
|
uint8 *lpix, *lbits;
|
|
int i, j;
|
|
uint32 expbits = 0; /* Bits to be expanded */
|
|
|
|
for (i=0; i<height; i++) {
|
|
lpix = pix;
|
|
lbits = bits;
|
|
for (j = width ; j > 0; j -= 4) {
|
|
expbits = (*lbits >> 4) & 0x0f;
|
|
|
|
if (j < 4)
|
|
break;
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
|
|
expbits = *lbits & 0x0f;
|
|
|
|
j -= 4;
|
|
if (j < 4) {
|
|
break;
|
|
}
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
lbits++;
|
|
}
|
|
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x08) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x04) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x02) ? fg : bg;
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
|
|
pix += pix_increment;
|
|
bits += bits_increment;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* RasterBitsToPixels16 --
|
|
*
|
|
* Convert a bitmap to a pixmap, converting 1 bits to the foreground
|
|
* color (fg) and 0 bits to the background color (bg), for a 16-bit
|
|
* pixmap
|
|
*
|
|
* Results:
|
|
* Pixmap filled with pixels
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
RasterBitsToPixels16(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg)
|
|
{
|
|
uint16 *lpix;
|
|
uint8 *lbits;
|
|
int i, j;
|
|
uint32 expbits = 0; /* Bits to be expanded */
|
|
|
|
for (i=0; i<height; i++) {
|
|
lpix = (uint16 *)pix;
|
|
lbits = bits;
|
|
for (j = width; j > 0; j -= 4) {
|
|
expbits = (*lbits >> 4) & 0x0f;
|
|
|
|
if (j < 4)
|
|
break;
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
|
|
expbits = *lbits & 0x0f;
|
|
|
|
j -= 4;
|
|
if (j < 4) {
|
|
break;
|
|
}
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
lbits++;
|
|
}
|
|
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x08) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x04) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x02) ? fg : bg;
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
|
|
pix += pix_increment;
|
|
bits += bits_increment;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* RasterBitsToPixels24 --
|
|
*
|
|
* Convert a bitmap to a pixmap, converting 1 bits to the foreground
|
|
* color (fg) and 0 bits to the background color (bg), for a 24-bit
|
|
* pixmap
|
|
*
|
|
* Results:
|
|
* Pixmap filled with pixels
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
RasterBitsToPixels24(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg)
|
|
{
|
|
uint8 *lpix, *lbits;
|
|
uint32 fgColor1, fgColor2, fgColor3;
|
|
uint32 bgColor1, bgColor2, bgColor3;
|
|
|
|
int i, j;
|
|
uint32 expbits = 0; /* Bits to be expanded */
|
|
|
|
fgColor1 = fg & 0x000000ff;
|
|
fgColor2 = (fg >> 8) & 0x000000ff;
|
|
fgColor3 = (fg >> 16) & 0x000000ff;
|
|
|
|
bgColor1 = bg & 0x000000ff;
|
|
bgColor2 = (bg >> 8) & 0x000000ff;
|
|
bgColor3 = (bg >> 16) & 0x000000ff;
|
|
|
|
for (i=0; i<height; i++) {
|
|
lpix = pix;
|
|
lbits = bits;
|
|
for (j = width; j > 0; j -= 4) {
|
|
expbits = (*lbits >> 4) & 0x0f;
|
|
|
|
if (j < 4)
|
|
break;
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
}
|
|
|
|
expbits = *lbits & 0x0f;
|
|
|
|
j -= 4;
|
|
if (j < 4) {
|
|
break;
|
|
}
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = bgColor1;
|
|
*lpix++ = bgColor2;
|
|
*lpix++ = bgColor3;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
*lpix++ = fgColor1;
|
|
*lpix++ = fgColor2;
|
|
*lpix++ = fgColor3;
|
|
break;
|
|
}
|
|
lbits++;
|
|
}
|
|
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x08) ? fgColor1 : bgColor1;
|
|
*lpix++ = (expbits & 0x08) ? fgColor2 : bgColor2;
|
|
*lpix++ = (expbits & 0x08) ? fgColor3 : bgColor3;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x04) ? fgColor1 : bgColor1;
|
|
*lpix++ = (expbits & 0x04) ? fgColor2 : bgColor2;
|
|
*lpix++ = (expbits & 0x04) ? fgColor3 : bgColor3;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x02) ? fgColor1 : bgColor1;
|
|
*lpix++ = (expbits & 0x02) ? fgColor2 : bgColor2;
|
|
*lpix++ = (expbits & 0x02) ? fgColor3 : bgColor3;
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
|
|
pix += pix_increment;
|
|
bits += bits_increment;
|
|
}
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
*----------------------------------------------------------------------
|
|
*
|
|
* RasterBitsToPixels32 --
|
|
*
|
|
* Convert a bitmap to a pixmap, converting 1 bits to the foreground
|
|
* color (fg) and 0 bits to the background color (bg), for a 32-bit
|
|
* pixmap
|
|
*
|
|
* Results:
|
|
* Pixmap filled with pixels
|
|
*
|
|
* Side effects:
|
|
* None
|
|
*
|
|
*----------------------------------------------------------------------
|
|
*/
|
|
|
|
void
|
|
RasterBitsToPixels32(uint8 *bits, uint32 bits_increment,
|
|
uint8 *pix, uint32 pix_increment,
|
|
uint32 width, uint32 height, uint32 fg, uint32 bg)
|
|
{
|
|
uint32 *lpix;
|
|
uint8 *lbits;
|
|
int i, j;
|
|
uint32 expbits = 0; /* Bits to be expanded */
|
|
|
|
for (i=0; i<height; i++) {
|
|
lpix = (uint32 *)pix;
|
|
lbits = bits;
|
|
for (j = width; j > 0; j -= 4) {
|
|
expbits = (*lbits >> 4) & 0x0f;
|
|
|
|
if (j < 4)
|
|
break;
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
|
|
expbits = *lbits & 0x0f;
|
|
|
|
j -= 4;
|
|
if (j < 4) {
|
|
break;
|
|
}
|
|
|
|
switch (expbits) {
|
|
case 0:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 1:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 2:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 3:
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 4:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 5:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 6:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 7:
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 8:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 9:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 10:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 11:
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 12:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 13:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
*lpix++ = fg;
|
|
break;
|
|
case 14:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = bg;
|
|
break;
|
|
case 15:
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
*lpix++ = fg;
|
|
break;
|
|
}
|
|
lbits++;
|
|
}
|
|
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x08) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x04) ? fg : bg;
|
|
j--;
|
|
if (j > 0) {
|
|
*lpix++ = (expbits & 0x02) ? fg : bg;
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
|
|
pix += pix_increment;
|
|
bits += bits_increment;
|
|
}
|
|
return;
|
|
}
|