X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/d9a56bdeaf27254ad19694a0c0c277385f0613c0..cc345f789777f7a06ea5e549f6df338925378c07:/src/common/imaggif.cpp?ds=sidebyside diff --git a/src/common/imaggif.cpp b/src/common/imaggif.cpp index 55afee8161..4977856f2a 100644 --- a/src/common/imaggif.cpp +++ b/src/common/imaggif.cpp @@ -6,24 +6,30 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ -#pragma implementation "imaggif.h" -#endif +/* + We don't put pragma implement in this file because it is already present in + src/common/image.cpp +*/ // For compilers that support precompilation, includes "wx.h". #include #ifdef __BORLANDC__ -#pragma hdrstop + #pragma hdrstop +#endif + +#ifndef WX_PRECOMP + #include "wx/defs.h" #endif -#include +#include "wx/image.h" +#include "wx/wfstream.h" +#include "wx/module.h" +#include "wx/log.h" -#include -#include -#include +IMPLEMENT_DYNAMIC_CLASS(wxGIFHandler,wxImageHandler) -#include +#if wxUSE_STREAMS /* @@ -33,9 +39,7 @@ FOLLOWING CODE IS BY G.R.G. : */ /************************************************************************ - READGIF.H - Leer un archivo GIF de 8 bits - ------------------------------------------------------------------------ - Tratamiento Digital de la Imagen + READGIF.H - Reads a GIF file ------------------------------------------------------------------------ Guillermo Rodriguez Garcia @@ -43,6 +47,7 @@ FOLLOWING CODE IS BY G.R.G. : Version: 2.1 *************************************************************************/ + typedef struct { int w; /* width */ @@ -53,10 +58,9 @@ typedef struct } IMAGEN; + /************************************************************************ - READGIF.C - Lee un archivo GIF de 256 colores - ------------------------------------------------------------------------ - Tratamiento Digital de la Imagen + READGIF.C - Reads a GIF file ------------------------------------------------------------------------ Guillermo Rodriguez Garcia @@ -88,30 +92,17 @@ class gifDecoder wxInputStream *f; /* input file */ - public: - gifDecoder(wxInputStream *s) {f = s;} - int getcode(int bits); - int dgif(IMAGEN *img, int interl, int bits); - int readgif(IMAGEN *img); - - private: - unsigned char mygetc(); - // This is NEEDED! GetC is char (signed) why we need unsigned value - // from here + public: + gifDecoder(wxInputStream *s) { f = s; } + int getcode(int bits); + int dgif(IMAGEN *img, int interl, int bits); + int readgif(IMAGEN *img); }; -unsigned char gifDecoder::mygetc() -{ - unsigned char c; - f -> Read(&c, 1); - return c; -} - /* getcode: * Reads the next code from the file, with size 'bits' - * v2.0 - changed to support 'bits' values < 8 */ int gifDecoder::getcode(int bits) { @@ -123,15 +114,15 @@ int gifDecoder::getcode(int bits) mask = (1 << bits) - 1; code = (lastbyte >> (8 - restbits)) & mask; - /* keep reading new bytes until needed */ + /* keep reading new bytes while needed */ while (bits > restbits) { /* if no bytes left in this block, read the next block */ if (restbyte == 0) - restbyte = mygetc(); + restbyte = (unsigned char)f->GetC(); /* read next byte and isolate the bits we need */ - lastbyte = mygetc(); + lastbyte = (unsigned char)f->GetC(); mask = (1 << (bits - restbits)) - 1; code = code + ((lastbyte & mask) << restbits); restbyte--; @@ -139,7 +130,7 @@ int gifDecoder::getcode(int bits) /* adjust total number of bits extracted from the buffer */ restbits = restbits + 8; } - + /* find number of bits reamining for next code */ restbits = (restbits - bits); @@ -147,6 +138,7 @@ int gifDecoder::getcode(int bits) } + /* dgif: * GIF decoding function. The initial code size (aka root size) * is 'bits'. Supports interlaced images (interl == 1). @@ -283,6 +275,8 @@ int gifDecoder::dgif(IMAGEN *img, int interl, int bits) return 0; } + + /* readgif: * Reads a GIF image from the file with filename 'nombre' in the * IMAGEN structure pointed by 'img'. Can read GIFs with any bit @@ -298,8 +292,9 @@ int gifDecoder::readgif(IMAGEN *img) unsigned char pal[768]; unsigned char buf[16]; + /* read header and logical screen descriptor block (LSDB) */ - f -> Read(buf, 13); + f->Read(buf, 13); /* check GIF signature */ if (memcmp(buf, "GIF", 3) != 0) return E_FORMATO; @@ -308,35 +303,29 @@ int gifDecoder::readgif(IMAGEN *img) if ((buf[10] & 0x80) == 0x80) { ncolors = 2 << (buf[10] & 0x07); - f -> Read(pal, 3 * ncolors); + f->Read(pal, 3 * ncolors); } /* assume no transparent color */ img->transparent = -1; /* skip most extensions */ - while (mygetc() == 0x21) /* separator */ + while (((unsigned char)f->GetC()) == 0x21) /* separator */ { - wxLogDebug(_T("ugh")); - if (mygetc() == 0xF9) /* graphic control ext. */ + if (((unsigned char)f->GetC()) == 0xF9) /* graphic control ext. */ { - wxLogDebug(_T("...")); f->Read(buf, 6); - wxLogDebug(_T("buf[1] is %i (%i)"), buf[1], buf[1] & 0x01); - if (buf[1] & 0x01) { - wxLogDebug(_T("setting transparen %i"), buf[4]); + if (buf[1] & 0x01) img->transparent = buf[4]; - } } else - while ((i = mygetc()) != 0) /* byte count */ + while ((i = (unsigned char)f->GetC()) != 0) /* byte count */ f->SeekI(i, wxFromCurrent); } /* read image descriptor block (IDB) */ - f -> Read(buf, 9); + f->Read(buf, 9); img->w = buf[4] + 256 * buf[5]; - img->h = buf[6] + 256 * buf[7]; size = img->w * img->h; interl = ((buf[8] & 0x40)? 1 : 0); @@ -345,11 +334,11 @@ int gifDecoder::readgif(IMAGEN *img) if ((buf[8] & 0x80) == 0x80) { ncolors = 2 << (buf[8] & 0x07); - f -> Read(pal, 3 * ncolors); + f->Read(pal, 3 * ncolors); } /* get initial code size from first byte in raster data */ - bits = mygetc(); + bits = (unsigned char)f->GetC(); /* allocate memory for image and palette */ if ((img->p = (unsigned char*) malloc(size)) == NULL) return E_MEMORIA; @@ -357,7 +346,7 @@ int gifDecoder::readgif(IMAGEN *img) /* shift palette to fit VGA 6-bit format */ for (i = 0; i < 768; i++) - (img->pal)[i] = (unsigned char)pal[i] /* >> 2 not needed under wxWin */; + (img->pal)[i] = (unsigned char)pal[i]; /* >> 2 not in wxWin */ /* decode GIF */ dgif(img, interl, bits); @@ -366,6 +355,8 @@ int gifDecoder::readgif(IMAGEN *img) return E_OK; } + + /* FOLLOWING CODE IS BY V.S. : @@ -376,8 +367,6 @@ FOLLOWING CODE IS BY V.S. : // wxGIFHandler //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxGIFHandler,wxImageHandler) - bool wxGIFHandler::LoadFile( wxImage *image, wxInputStream& stream ) { unsigned char *ptr, *src, *pal; @@ -389,7 +378,7 @@ bool wxGIFHandler::LoadFile( wxImage *image, wxInputStream& stream ) decod = new gifDecoder(&stream); - if (decod -> readgif(&igif) != E_OK) { + if (decod->readgif(&igif) != E_OK) { wxLogDebug(_T("Error reading GIF")); delete decod; return FALSE; @@ -402,38 +391,37 @@ bool wxGIFHandler::LoadFile( wxImage *image, wxInputStream& stream ) free(igif.p); return FALSE; } - image->SetMask(FALSE); ptr = image->GetData(); src = igif.p; pal = igif.pal; + + if (igif.transparent != -1) { + for (i = 0; i < 256; i++) + if ((pal[3 * i + 0] == 255) && (pal[3 * i + 1] == 0) && (pal[3 * i + 2] == 255)) pal[3 * i + 2] = 254; + pal[3 * (igif.transparent) + 0] = 255, + pal[3 * (igif.transparent) + 1] = 0, + pal[3 * (igif.transparent) + 2] = 255; + image->SetMaskColour(255, 0, 255); + } + else image->SetMask(FALSE); + for (i = 0; i < igif.w * igif.h; i++, src++) { *(ptr++) = pal[3 * (*src) + 0]; *(ptr++) = pal[3 * (*src) + 1]; *(ptr++) = pal[3 * (*src) + 2]; } - if (igif.transparent != -1) { - wxLogDebug(_T("oko")); - image->SetMaskColour(pal[3 * (igif.transparent) + 0], pal[3 * (igif.transparent) + 0], pal[3 * (igif.transparent) + 0]); - image->SetMask(TRUE); - } - - wxLogDebug(_T("(unsigned int)%i"), (unsigned int)-1); free(igif.pal); free(igif.p); return TRUE; } -bool wxGIFHandler::SaveFile( wxImage *image, wxOutputStream& stream ) +bool wxGIFHandler::SaveFile( wxImage * WXUNUSED(image), + wxOutputStream& WXUNUSED(stream) ) { wxLogDebug(_T("wxGIFHandler is read-only!!")); return FALSE; } - - - - - - +#endif