fixes for wxUSE_PALETTE=0 compilation

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@11763 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2001-09-30 23:05:30 +00:00
parent bff995bf71
commit b11e8fb666
3 changed files with 353 additions and 310 deletions

View File

@ -63,11 +63,11 @@ void wxGIFDecoder::Destroy()
while (pimg != NULL) while (pimg != NULL)
{ {
paux = pimg->next; paux = pimg->next;
free(pimg->p); free(pimg->p);
free(pimg->pal); free(pimg->pal);
delete pimg; delete pimg;
pimg = paux; pimg = paux;
} }
m_pimage = NULL; m_pimage = NULL;
@ -97,7 +97,7 @@ bool wxGIFDecoder::ConvertToImage(wxImage *image) const
image->Create(GetWidth(), GetHeight()); image->Create(GetWidth(), GetHeight());
if (!image->Ok()) if (!image->Ok())
return FALSE; return FALSE;
pal = GetPalette(); pal = GetPalette();
src = GetData(); src = GetData();
@ -107,46 +107,49 @@ bool wxGIFDecoder::ConvertToImage(wxImage *image) const
/* set transparent colour mask */ /* set transparent colour mask */
if (transparent != -1) if (transparent != -1)
{ {
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
if ((pal[3 * i + 0] == 255) && if ((pal[3 * i + 0] == 255) &&
(pal[3 * i + 1] == 0) && (pal[3 * i + 1] == 0) &&
(pal[3 * i + 2] == 255)) (pal[3 * i + 2] == 255))
{ {
pal[3 * i + 2] = 254; pal[3 * i + 2] = 254;
} }
} }
pal[3 * transparent + 0] = 255, pal[3 * transparent + 0] = 255,
pal[3 * transparent + 1] = 0, pal[3 * transparent + 1] = 0,
pal[3 * transparent + 2] = 255; pal[3 * transparent + 2] = 255;
image->SetMaskColour(255, 0, 255); image->SetMaskColour(255, 0, 255);
} }
else else
image->SetMask(FALSE); image->SetMask(FALSE);
#if wxUSE_PALETTE
if (pal) if (pal)
{ {
unsigned char* r = new unsigned char[256]; unsigned char r[256];
unsigned char* g = new unsigned char[256]; unsigned char g[256];
unsigned char* b = new unsigned char[256]; unsigned char b[256];
for (i = 0; i < 256; i++)
{ for (i = 0; i < 256; i++)
r[i] = pal[3*i + 0]; {
g[i] = pal[3*i + 1]; r[i] = pal[3*i + 0];
b[i] = pal[3*i + 2]; g[i] = pal[3*i + 1];
} b[i] = pal[3*i + 2];
image->SetPalette(wxPalette(256, r, g, b)); }
delete[] r; delete[] g; delete[] b;
image->SetPalette(wxPalette(256, r, g, b));
} }
#endif // wxUSE_PALETTE
/* copy image data */ /* copy image data */
for (i = 0; i < (GetWidth() * GetHeight()); i++, src++) for (i = 0; i < (GetWidth() * GetHeight()); i++, src++)
{ {
*(dst++) = pal[3 * (*src) + 0]; *(dst++) = pal[3 * (*src) + 0];
*(dst++) = pal[3 * (*src) + 1]; *(dst++) = pal[3 * (*src) + 1];
*(dst++) = pal[3 * (*src) + 2]; *(dst++) = pal[3 * (*src) + 2];
} }
return TRUE; return TRUE;
@ -186,7 +189,7 @@ bool wxGIFDecoder::IsAnimation() const { return (m_nimages > 1); }
bool wxGIFDecoder::GoFirstFrame() bool wxGIFDecoder::GoFirstFrame()
{ {
if (!IsAnimation()) if (!IsAnimation())
return FALSE; return FALSE;
m_image = 1; m_image = 1;
m_pimage = m_pfirst; m_pimage = m_pfirst;
@ -196,7 +199,7 @@ bool wxGIFDecoder::GoFirstFrame()
bool wxGIFDecoder::GoLastFrame() bool wxGIFDecoder::GoLastFrame()
{ {
if (!IsAnimation()) if (!IsAnimation())
return FALSE; return FALSE;
m_image = m_nimages; m_image = m_nimages;
m_pimage = m_plast; m_pimage = m_plast;
@ -206,45 +209,45 @@ bool wxGIFDecoder::GoLastFrame()
bool wxGIFDecoder::GoNextFrame(bool cyclic) bool wxGIFDecoder::GoNextFrame(bool cyclic)
{ {
if (!IsAnimation()) if (!IsAnimation())
return FALSE; return FALSE;
if ((m_image < m_nimages) || (cyclic)) if ((m_image < m_nimages) || (cyclic))
{ {
m_pimage = m_pimage->next; m_pimage = m_pimage->next;
m_image++; m_image++;
if (!m_pimage) if (!m_pimage)
{ {
m_image = 1; m_image = 1;
m_pimage = m_pfirst; m_pimage = m_pfirst;
} }
return TRUE; return TRUE;
} }
else else
return FALSE; return FALSE;
} }
bool wxGIFDecoder::GoPrevFrame(bool cyclic) bool wxGIFDecoder::GoPrevFrame(bool cyclic)
{ {
if (!IsAnimation()) if (!IsAnimation())
return FALSE; return FALSE;
if ((m_image > 1) || (cyclic)) if ((m_image > 1) || (cyclic))
{ {
m_pimage = m_pimage->prev; m_pimage = m_pimage->prev;
m_image--; m_image--;
if (!m_pimage) if (!m_pimage)
{ {
m_image = m_nimages; m_image = m_nimages;
m_pimage = m_plast; m_pimage = m_plast;
} }
return TRUE; return TRUE;
} }
else else
return FALSE; return FALSE;
} }
bool wxGIFDecoder::GoFrame(int which) bool wxGIFDecoder::GoFrame(int which)
@ -252,19 +255,19 @@ bool wxGIFDecoder::GoFrame(int which)
int i; int i;
if (!IsAnimation()) if (!IsAnimation())
return FALSE; return FALSE;
if ((which >= 1) && (which <= m_nimages)) if ((which >= 1) && (which <= m_nimages))
{ {
m_pimage = m_pfirst; m_pimage = m_pfirst;
for (i = 1; i < which; i++) for (i = 1; i < which; i++)
m_pimage = m_pimage->next; m_pimage = m_pimage->next;
return TRUE; return TRUE;
} }
else else
return FALSE; return FALSE;
} }
@ -288,35 +291,35 @@ int wxGIFDecoder::getcode(int bits, int ab_fin)
/* keep reading new bytes while needed */ /* keep reading new bytes while needed */
while (bits > m_restbits) while (bits > m_restbits)
{ {
/* if no bytes left in this block, read the next block */ /* if no bytes left in this block, read the next block */
if (m_restbyte == 0) if (m_restbyte == 0)
{ {
m_restbyte = (unsigned char)m_f->GetC(); m_restbyte = (unsigned char)m_f->GetC();
/* Some encoders are a bit broken: instead of issuing /* Some encoders are a bit broken: instead of issuing
* an end-of-image symbol (ab_fin) they come up with * an end-of-image symbol (ab_fin) they come up with
* a zero-length subblock!! We catch this here so * a zero-length subblock!! We catch this here so
* that the decoder sees an ab_fin code. * that the decoder sees an ab_fin code.
*/ */
if (m_restbyte == 0) if (m_restbyte == 0)
{ {
code = ab_fin; code = ab_fin;
break; break;
} }
/* prefetch data */ /* prefetch data */
m_f->Read((void *) m_buffer, m_restbyte); m_f->Read((void *) m_buffer, m_restbyte);
m_bufp = m_buffer; m_bufp = m_buffer;
} }
/* read next byte and isolate the bits we need */ /* read next byte and isolate the bits we need */
m_lastbyte = (unsigned char) (*m_bufp++); m_lastbyte = (unsigned char) (*m_bufp++);
mask = (1 << (bits - m_restbits)) - 1; mask = (1 << (bits - m_restbits)) - 1;
code = code + ((m_lastbyte & mask) << m_restbits); code = code + ((m_lastbyte & mask) << m_restbits);
m_restbyte--; m_restbyte--;
/* adjust total number of bits extracted from the buffer */ /* adjust total number of bits extracted from the buffer */
m_restbits = m_restbits + 8; m_restbits = m_restbits + 8;
} }
/* find number of bits remaining for next code */ /* find number of bits remaining for next code */
@ -366,95 +369,95 @@ int wxGIFDecoder::dgif(GIFImage *img, int interl, int bits)
do do
{ {
/* get next code */ /* get next code */
readcode = code = getcode(ab_bits, ab_fin); readcode = code = getcode(ab_bits, ab_fin);
/* end of image? */ /* end of image? */
if (code == ab_fin) break; if (code == ab_fin) break;
/* reset alphabet? */ /* reset alphabet? */
if (code == ab_clr) if (code == ab_clr)
{ {
/* reset main variables */ /* reset main variables */
ab_bits = bits + 1; ab_bits = bits + 1;
ab_free = (1 << bits) + 2; ab_free = (1 << bits) + 2;
ab_max = (1 << ab_bits) - 1; ab_max = (1 << ab_bits) - 1;
lastcode = -1; lastcode = -1;
abcabca = -1; abcabca = -1;
/* skip to next code */ /* skip to next code */
continue; continue;
} }
/* unknown code: special case (like in ABCABCA) */ /* unknown code: special case (like in ABCABCA) */
if (code >= ab_free) if (code >= ab_free)
{ {
code = lastcode; /* take last string */ code = lastcode; /* take last string */
stack[pos++] = abcabca; /* add first character */ stack[pos++] = abcabca; /* add first character */
} }
/* build the string for this code in the stack */ /* build the string for this code in the stack */
while (code > ab_clr) while (code > ab_clr)
{ {
stack[pos++] = ab_tail[code]; stack[pos++] = ab_tail[code];
code = ab_prefix[code]; code = ab_prefix[code];
} }
stack[pos] = code; /* push last code into the stack */ stack[pos] = code; /* push last code into the stack */
abcabca = code; /* save for special case */ abcabca = code; /* save for special case */
/* make new entry in alphabet (only if NOT just cleared) */ /* make new entry in alphabet (only if NOT just cleared) */
if (lastcode != -1) if (lastcode != -1)
{ {
ab_prefix[ab_free] = lastcode; ab_prefix[ab_free] = lastcode;
ab_tail[ab_free] = code; ab_tail[ab_free] = code;
ab_free++; ab_free++;
if ((ab_free > ab_max) && (ab_bits < 12)) if ((ab_free > ab_max) && (ab_bits < 12))
{ {
ab_bits++; ab_bits++;
ab_max = (1 << ab_bits) - 1; ab_max = (1 << ab_bits) - 1;
} }
} }
/* dump stack data to the buffer */ /* dump stack data to the buffer */
while (pos >= 0) while (pos >= 0)
{ {
(img->p)[x + (y * (img->w))] = (char)stack[pos--]; (img->p)[x + (y * (img->w))] = (char)stack[pos--];
if (++x >= (img->w)) if (++x >= (img->w))
{ {
x = 0; x = 0;
if (interl) if (interl)
{ {
/* support for interlaced images */ /* support for interlaced images */
switch (pass) switch (pass)
{ {
case 1: y += 8; break; case 1: y += 8; break;
case 2: y += 8; break; case 2: y += 8; break;
case 3: y += 4; break; case 3: y += 4; break;
case 4: y += 2; break; case 4: y += 2; break;
} }
if (y >= (img->h)) if (y >= (img->h))
{ {
switch (++pass) switch (++pass)
{ {
case 2: y = 4; break; case 2: y = 4; break;
case 3: y = 2; break; case 3: y = 2; break;
case 4: y = 1; break; case 4: y = 1; break;
} }
} }
} }
else else
{ {
/* non-interlaced */ /* non-interlaced */
y++; y++;
} }
} }
} }
pos = 0; pos = 0;
lastcode = readcode; lastcode = readcode;
} }
while (code != ab_fin); while (code != ab_fin);
@ -498,17 +501,17 @@ int wxGIFDecoder::ReadGIF()
unsigned char pal[768]; unsigned char pal[768];
unsigned char buf[16]; unsigned char buf[16];
GIFImage **ppimg; GIFImage **ppimg;
GIFImage *pimg, *pprev; GIFImage *pimg, *pprev;
/* check GIF signature */ /* check GIF signature */
if (!CanRead()) if (!CanRead())
return wxGIF_INVFORMAT; return wxGIF_INVFORMAT;
/* check for animated GIF support (ver. >= 89a) */ /* check for animated GIF support (ver. >= 89a) */
m_f->Read(buf, 6); m_f->Read(buf, 6);
if (memcmp(buf + 3, "89a", 3) < 0) if (memcmp(buf + 3, "89a", 3) < 0)
m_anim = FALSE; m_anim = FALSE;
/* read logical screen descriptor block (LSDB) */ /* read logical screen descriptor block (LSDB) */
m_f->Read(buf, 7); m_f->Read(buf, 7);
@ -518,10 +521,10 @@ int wxGIFDecoder::ReadGIF()
/* load global color map if available */ /* load global color map if available */
if ((buf[4] & 0x80) == 0x80) if ((buf[4] & 0x80) == 0x80)
{ {
m_background = buf[5]; m_background = buf[5];
ncolors = 2 << (buf[4] & 0x07); ncolors = 2 << (buf[4] & 0x07);
m_f->Read(pal, 3 * ncolors); m_f->Read(pal, 3 * ncolors);
} }
/* transparent colour, disposal method and delay default to unused */ /* transparent colour, disposal method and delay default to unused */
@ -538,157 +541,157 @@ int wxGIFDecoder::ReadGIF()
while(!done) while(!done)
{ {
type = (unsigned char)m_f->GetC(); type = (unsigned char)m_f->GetC();
/* end of data? */ /* end of data? */
if (type == 0x3B) if (type == 0x3B)
{ {
done = TRUE; done = TRUE;
} }
else else
/* extension block? */ /* extension block? */
if (type == 0x21) if (type == 0x21)
{ {
if (((unsigned char)m_f->GetC()) == 0xF9) if (((unsigned char)m_f->GetC()) == 0xF9)
/* graphics control extension, parse it */ /* graphics control extension, parse it */
{ {
m_f->Read(buf, 6); m_f->Read(buf, 6);
/* read delay and convert from 1/100 of a second to ms */ /* read delay and convert from 1/100 of a second to ms */
delay = 10 * (buf[2] + 256 * buf[3]); delay = 10 * (buf[2] + 256 * buf[3]);
/* read transparent colour index, if used */ /* read transparent colour index, if used */
if (buf[1] & 0x01) if (buf[1] & 0x01)
transparent = buf[4]; transparent = buf[4];
/* read disposal method */ /* read disposal method */
disposal = (buf[1] & 0x1C) - 1; disposal = (buf[1] & 0x1C) - 1;
} }
else else
/* other extension, skip */ /* other extension, skip */
{ {
while ((i = (unsigned char)m_f->GetC()) != 0) while ((i = (unsigned char)m_f->GetC()) != 0)
{ {
m_f->SeekI(i, wxFromCurrent); m_f->SeekI(i, wxFromCurrent);
} }
} }
} }
else else
/* image descriptor block? */ /* image descriptor block? */
if (type == 0x2C) if (type == 0x2C)
{ {
/* allocate memory for IMAGEN struct */ /* allocate memory for IMAGEN struct */
pimg = (*ppimg) = new GIFImage(); pimg = (*ppimg) = new GIFImage();
if (pimg == NULL) if (pimg == NULL)
{ {
Destroy(); Destroy();
return wxGIF_MEMERR; return wxGIF_MEMERR;
} }
/* fill in the data */ /* fill in the data */
m_f->Read(buf, 9); m_f->Read(buf, 9);
pimg->left = buf[0] + 256 * buf[1]; pimg->left = buf[0] + 256 * buf[1];
pimg->top = buf[2] + 256 * buf[3]; pimg->top = buf[2] + 256 * buf[3];
/* /*
pimg->left = buf[4] + 256 * buf[5]; pimg->left = buf[4] + 256 * buf[5];
pimg->top = buf[4] + 256 * buf[5]; pimg->top = buf[4] + 256 * buf[5];
*/ */
pimg->w = buf[4] + 256 * buf[5]; pimg->w = buf[4] + 256 * buf[5];
pimg->h = buf[6] + 256 * buf[7]; pimg->h = buf[6] + 256 * buf[7];
interl = ((buf[8] & 0x40)? 1 : 0); interl = ((buf[8] & 0x40)? 1 : 0);
size = pimg->w * pimg->h; size = pimg->w * pimg->h;
pimg->transparent = transparent; pimg->transparent = transparent;
pimg->disposal = disposal; pimg->disposal = disposal;
pimg->delay = delay; pimg->delay = delay;
pimg->next = NULL; pimg->next = NULL;
pimg->prev = pprev; pimg->prev = pprev;
pprev = pimg; pprev = pimg;
ppimg = &pimg->next; ppimg = &pimg->next;
/* allocate memory for image and palette */ /* allocate memory for image and palette */
pimg->p = (unsigned char *) malloc((size_t)size); pimg->p = (unsigned char *) malloc((size_t)size);
pimg->pal = (unsigned char *) malloc(768); pimg->pal = (unsigned char *) malloc(768);
if ((!pimg->p) || (!pimg->pal)) if ((!pimg->p) || (!pimg->pal))
{ {
Destroy(); Destroy();
return wxGIF_MEMERR; return wxGIF_MEMERR;
} }
/* load local color map if available, else use global map */ /* load local color map if available, else use global map */
if ((buf[8] & 0x80) == 0x80) if ((buf[8] & 0x80) == 0x80)
{ {
ncolors = 2 << (buf[8] & 0x07); ncolors = 2 << (buf[8] & 0x07);
m_f->Read(pimg->pal, 3 * ncolors); m_f->Read(pimg->pal, 3 * ncolors);
} }
else else
memcpy(pimg->pal, pal, 768); memcpy(pimg->pal, pal, 768);
/* get initial code size from first byte in raster data */ /* get initial code size from first byte in raster data */
bits = (unsigned char)m_f->GetC(); bits = (unsigned char)m_f->GetC();
/* decode image */ /* decode image */
dgif(pimg, interl, bits); dgif(pimg, interl, bits);
m_nimages++; m_nimages++;
/* if this is not an animated GIF, exit after first image */ /* if this is not an animated GIF, exit after first image */
if (!m_anim) if (!m_anim)
done = TRUE; done = TRUE;
} }
} }
/* setup image pointers */ /* setup image pointers */
if (m_nimages != 0) if (m_nimages != 0)
{ {
m_image = 1; m_image = 1;
m_plast = pimg; m_plast = pimg;
m_pimage = m_pfirst; m_pimage = m_pfirst;
} }
/* try to read to the end of the stream */ /* try to read to the end of the stream */
while (type != 0x3B) while (type != 0x3B)
{ {
type = (unsigned char)m_f->GetC(); type = (unsigned char)m_f->GetC();
if (type == 0x21) if (type == 0x21)
{ {
/* extension type */ /* extension type */
(void) m_f->GetC(); (void) m_f->GetC();
/* skip all data */ /* skip all data */
while ((i = (unsigned char)m_f->GetC()) != 0) while ((i = (unsigned char)m_f->GetC()) != 0)
{ {
m_f->SeekI(i, wxFromCurrent); m_f->SeekI(i, wxFromCurrent);
} }
} }
else if (type == 0x2C) else if (type == 0x2C)
{ {
/* image descriptor block */ /* image descriptor block */
m_f->Read(buf, 9); m_f->Read(buf, 9);
/* local color map */ /* local color map */
if ((buf[8] & 0x80) == 0x80) if ((buf[8] & 0x80) == 0x80)
{ {
ncolors = 2 << (buf[8] & 0x07); ncolors = 2 << (buf[8] & 0x07);
m_f->SeekI(3 * ncolors, wxFromCurrent); m_f->SeekI(3 * ncolors, wxFromCurrent);
} }
/* initial code size */ /* initial code size */
(void) m_f->GetC(); (void) m_f->GetC();
/* skip all data */ /* skip all data */
while ((i = (unsigned char)m_f->GetC()) != 0) while ((i = (unsigned char)m_f->GetC()) != 0)
{ {
m_f->SeekI(i, wxFromCurrent); m_f->SeekI(i, wxFromCurrent);
} }
} }
else if ((type != 0x3B) && (type != 00)) /* testing */ else if ((type != 0x3B) && (type != 00)) /* testing */
{ {
/* images are OK, but couldn't read to the end of the stream */ /* images are OK, but couldn't read to the end of the stream */
return wxGIF_TRUNCATED; return wxGIF_TRUNCATED;
} }
} }
return wxGIF_OK; return wxGIF_OK;

View File

@ -91,7 +91,11 @@ bool wxBMPHandler::SaveFile(wxImage *image,
(format == wxBMP_8BPP_RED) || (format == wxBMP_8BPP_PALETTE)) (format == wxBMP_8BPP_RED) || (format == wxBMP_8BPP_PALETTE))
{ {
// need to set a wxPalette to use this, HOW TO CHECK IF VALID, SIZE? // need to set a wxPalette to use this, HOW TO CHECK IF VALID, SIZE?
if ((format == wxBMP_8BPP_PALETTE) && !image->HasPalette()) if ((format == wxBMP_8BPP_PALETTE)
#if wxUSE_PALETTE
&& !image->HasPalette()
#endif // wxUSE_PALETTE
)
{ {
if (verbose) if (verbose)
wxLogError(_("BMP: wImage doesn't have own wxPalette.")); wxLogError(_("BMP: wImage doesn't have own wxPalette."));
@ -196,7 +200,9 @@ bool wxBMPHandler::SaveFile(wxImage *image,
} }
else else
{ {
#if wxUSE_PALETTE
palette = new wxPalette(image->GetPalette()); palette = new wxPalette(image->GetPalette());
#endif // wxUSE_PALETTE
} }
int i; int i;
@ -205,7 +211,10 @@ bool wxBMPHandler::SaveFile(wxImage *image,
for (i=0; i<palette_size; i++) for (i=0; i<palette_size; i++)
{ {
if (!palette->GetRGB( i, &r, &g, &b )) r = g = b = 0; #if wxUSE_PALETTE
if (!palette->GetRGB( i, &r, &g, &b ))
#endif // wxUSE_PALETTE
r = g = b = 0;
rgbquad[i*4] = b; rgbquad[i*4] = b;
rgbquad[i*4+1] = g; rgbquad[i*4+1] = g;
@ -236,10 +245,13 @@ bool wxBMPHandler::SaveFile(wxImage *image,
{ {
if (!stream.Write(rgbquad, palette_size*4)) if (!stream.Write(rgbquad, palette_size*4))
{ {
if (verbose) wxLogError(_("BMP: Couldn't write RGB color map.")); if (verbose)
delete []rgbquad; wxLogError(_("BMP: Couldn't write RGB color map."));
if (palette) delete palette; delete [] rgbquad;
if (q_image) delete q_image; #if wxUSE_PALETTE
delete palette;
#endif // wxUSE_PALETTE
delete q_image;
return FALSE; return FALSE;
} }
delete []rgbquad; delete []rgbquad;
@ -273,9 +285,14 @@ bool wxBMPHandler::SaveFile(wxImage *image,
for (x = 0; x < width; x++) for (x = 0; x < width; x++)
{ {
pixel = 3*(y*width + x); pixel = 3*(y*width + x);
#if wxUSE_PALETTE
buffer[x] = palette->GetPixel( data[pixel], buffer[x] = palette->GetPixel( data[pixel],
data[pixel+1], data[pixel+1],
data[pixel+2] ); data[pixel+2] );
#else
// FIXME: what should this be? use some std palette maybe?
buffer[x] = 0;
#endif // wxUSE_PALETTE
} }
} }
else if (format == wxBMP_8BPP_GREY) // 1 byte per pix, rgb ave to grey else if (format == wxBMP_8BPP_GREY) // 1 byte per pix, rgb ave to grey
@ -302,9 +319,20 @@ bool wxBMPHandler::SaveFile(wxImage *image,
pixel = 3*(y*width + x); pixel = 3*(y*width + x);
// fill buffer, ignore if > width // fill buffer, ignore if > width
#if wxUSE_PALETTE
buffer[x/2] = buffer[x/2] =
((wxUint8)palette->GetPixel(data[pixel], data[pixel+1], data[pixel+2]) << 4) | ((wxUint8)palette->GetPixel(data[pixel],
(((x+1) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+3], data[pixel+4], data[pixel+5]) )); data[pixel+1],
data[pixel+2]) << 4) |
(((x+1) > width)
? 0
: ((wxUint8)palette->GetPixel(data[pixel+3],
data[pixel+4],
data[pixel+5]) ));
#else
// FIXME: what should this be? use some std palette maybe?
buffer[x/2] = 0;
#endif // wxUSE_PALETTE
} }
} }
else if (format == wxBMP_1BPP) // 1 bpp in "color" else if (format == wxBMP_1BPP) // 1 bpp in "color"
@ -313,8 +341,8 @@ bool wxBMPHandler::SaveFile(wxImage *image,
{ {
pixel = 3*(y*width + x); pixel = 3*(y*width + x);
buffer[x/8] = #if wxUSE_PALETTE
((wxUint8)palette->GetPixel(data[pixel], data[pixel+1], data[pixel+2]) << 7) | buffer[x/8] = ((wxUint8)palette->GetPixel(data[pixel], data[pixel+1], data[pixel+2]) << 7) |
(((x+1) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+3], data[pixel+4], data[pixel+5]) << 6)) | (((x+1) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+3], data[pixel+4], data[pixel+5]) << 6)) |
(((x+2) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+6], data[pixel+7], data[pixel+8]) << 5)) | (((x+2) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+6], data[pixel+7], data[pixel+8]) << 5)) |
(((x+3) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+9], data[pixel+10], data[pixel+11]) << 4)) | (((x+3) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+9], data[pixel+10], data[pixel+11]) << 4)) |
@ -322,6 +350,10 @@ bool wxBMPHandler::SaveFile(wxImage *image,
(((x+5) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+15], data[pixel+16], data[pixel+17]) << 2)) | (((x+5) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+15], data[pixel+16], data[pixel+17]) << 2)) |
(((x+6) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+18], data[pixel+19], data[pixel+20]) << 1)) | (((x+6) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+18], data[pixel+19], data[pixel+20]) << 1)) |
(((x+7) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+21], data[pixel+22], data[pixel+23]) )); (((x+7) > width) ? 0 : ((wxUint8)palette->GetPixel(data[pixel+21], data[pixel+22], data[pixel+23]) ));
#else
// FIXME: what should this be? use some std palette maybe?
buffer[x/8] = 0;
#endif // wxUSE_PALETTE
} }
} }
else if (format == wxBMP_1BPP_BW) // 1 bpp B&W colormap from red color ONLY else if (format == wxBMP_1BPP_BW) // 1 bpp B&W colormap from red color ONLY
@ -347,14 +379,18 @@ bool wxBMPHandler::SaveFile(wxImage *image,
if (verbose) if (verbose)
wxLogError(_("BMP: Couldn't write data.")); wxLogError(_("BMP: Couldn't write data."));
delete[] buffer; delete[] buffer;
if (palette) delete palette; #if wxUSE_PALETTE
if (q_image) delete q_image; delete palette;
#endif // wxUSE_PALETTE
delete q_image;
return FALSE; return FALSE;
} }
} }
delete[] buffer; delete[] buffer;
if (palette) delete palette; #if wxUSE_PALETTE
if (q_image) delete q_image; delete palette;
#endif // wxUSE_PALETTE
delete q_image;
return TRUE; return TRUE;
} }
@ -497,8 +533,11 @@ bool wxBMPHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose
g[j] = cmap[j].g; g[j] = cmap[j].g;
b[j] = cmap[j].b; b[j] = cmap[j].b;
} }
#if wxUSE_PALETTE
// Set the palette for the wxImage // Set the palette for the wxImage
image->SetPalette(wxPalette(ncolors, r, g, b)); image->SetPalette(wxPalette(ncolors, r, g, b));
#endif // wxUSE_PALETTE
delete[] r; delete[] r;
delete[] g; delete[] g;

View File

@ -277,9 +277,10 @@ int ReadPCX(wxImage *image, wxInputStream& stream)
*(p++) = pal[3 * index + 2]; *(p++) = pal[3 * index + 2];
} }
unsigned char* r = new unsigned char[256]; #if wxUSE_PALETTE
unsigned char* g = new unsigned char[256]; unsigned char r[256];
unsigned char* b = new unsigned char[256]; unsigned char g[256];
unsigned char b[256];
for (i = 0; i < 256; i++) for (i = 0; i < 256; i++)
{ {
r[i] = pal[3*i + 0]; r[i] = pal[3*i + 0];
@ -287,7 +288,7 @@ int ReadPCX(wxImage *image, wxInputStream& stream)
b[i] = pal[3*i + 2]; b[i] = pal[3*i + 2];
} }
image->SetPalette(wxPalette(256, r, g, b)); image->SetPalette(wxPalette(256, r, g, b));
delete[] r; delete[] g; delete[] b; #endif // wxUSE_PALETTE
} }
return wxPCX_OK; return wxPCX_OK;