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:
parent
bff995bf71
commit
b11e8fb666
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user