X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b11e8fb66699444389254085844a8084de9f0680..d0430ee2bab2a2c12485f64f003b2d4573a946e8:/src/common/imagpcx.cpp diff --git a/src/common/imagpcx.cpp b/src/common/imagpcx.cpp index 17a9b54bd5..03364b381e 100644 --- a/src/common/imagpcx.cpp +++ b/src/common/imagpcx.cpp @@ -8,7 +8,7 @@ // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "imagpcx.h" #endif @@ -21,9 +21,10 @@ #ifndef WX_PRECOMP # include "wx/defs.h" +# include "wx/palette.h" #endif -#if wxUSE_IMAGE && wxUSE_STREAMS && wxUSE_PCX +#if wxUSE_IMAGE && wxUSE_PCX #include "wx/imagpcx.h" #include "wx/wfstream.h" @@ -35,6 +36,14 @@ #include "wx/list.h" #include "wx/object.h" +//----------------------------------------------------------------------------- +// wxPCXHandler +//----------------------------------------------------------------------------- + +IMPLEMENT_DYNAMIC_CLASS(wxPCXHandler,wxImageHandler) + +#if wxUSE_STREAMS + //----------------------------------------------------------------------------- // RLE encoding and decoding //----------------------------------------------------------------------------- @@ -99,7 +108,7 @@ void RLEdecode(unsigned char *p, unsigned int size, wxInputStream& s) // If ((data & 0xC0) != 0xC0), then the value read is a data // byte. Else, it is a counter (cont = val & 0x3F) and the // next byte is the data byte. - // + if ((data & 0xC0) != 0xC0) { *(p++) = (unsigned char)data; @@ -309,9 +318,9 @@ int SavePCX(wxImage *image, wxOutputStream& stream) unsigned char *src; // pointer into wxImage data unsigned int width, height; // size of the image unsigned int bytesperline; // bytes per line (each plane) - int nplanes = 3; // number of planes + unsigned char nplanes = 3; // number of planes int format = wxPCX_24BIT; // image format (8 bit, 24 bit) - wxHashTable h(wxKEY_INTEGER); // image histogram + wxImageHistogram histogram; // image histogram unsigned long key; // key in the hashtable unsigned int i; @@ -319,7 +328,7 @@ int SavePCX(wxImage *image, wxOutputStream& stream) if (image->CountColours(256) <= 256) { - image->ComputeHistogram(h); + image->ComputeHistogram(histogram); format = wxPCX_8BIT; nplanes = 1; } @@ -371,7 +380,6 @@ int SavePCX(wxImage *image, wxOutputStream& stream) case wxPCX_8BIT: { unsigned char r, g, b; - wxHNode *hnode; for (i = 0; i < width; i++) { @@ -380,8 +388,7 @@ int SavePCX(wxImage *image, wxOutputStream& stream) b = *(src++); key = (r << 16) | (g << 8) | b; - hnode = (wxHNode *) h.Get(key); - p[i] = (unsigned char)hnode->index; + p[i] = (unsigned char)histogram[key].index; } break; } @@ -402,26 +409,22 @@ int SavePCX(wxImage *image, wxOutputStream& stream) free(p); - // For 8 bit images, build the palette and write it to the stream - + // For 8 bit images, build the palette and write it to the stream: if (format == wxPCX_8BIT) { - wxNode *node; - wxHNode *hnode; - // zero unused colours memset(pal, 0, sizeof(pal)); - h.BeginFind(); - while ((node = h.Next()) != NULL) - { - key = node->GetKeyInteger(); - hnode = (wxHNode *) node->GetData(); + unsigned long index; - pal[3 * hnode->index] = (unsigned char)(key >> 16); - pal[3 * hnode->index + 1] = (unsigned char)(key >> 8); - pal[3 * hnode->index + 2] = (unsigned char)(key); - delete hnode; + for (wxImageHistogram::iterator entry = histogram.begin(); + entry != histogram.end(); entry++ ) + { + key = entry->first; + index = entry->second.index; + pal[3 * index] = (unsigned char)(key >> 16); + pal[3 * index + 1] = (unsigned char)(key >> 8); + pal[3 * index + 2] = (unsigned char)(key); } stream.PutC(12); @@ -435,8 +438,6 @@ int SavePCX(wxImage *image, wxOutputStream& stream) // wxPCXHandler //----------------------------------------------------------------------------- -IMPLEMENT_DYNAMIC_CLASS(wxPCXHandler,wxImageHandler) - bool wxPCXHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose, int WXUNUSED(index) ) { int error; @@ -446,7 +447,7 @@ bool wxPCXHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose if (verbose) wxLogError(_("PCX: this is not a PCX file.")); - return FALSE; + return false; } image->Destroy(); @@ -464,10 +465,10 @@ bool wxPCXHandler::LoadFile( wxImage *image, wxInputStream& stream, bool verbose } } image->Destroy(); - return FALSE; + return false; } - return TRUE; + return true; } bool wxPCXHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbose ) @@ -492,14 +493,15 @@ bool wxPCXHandler::SaveFile( wxImage *image, wxOutputStream& stream, bool verbos bool wxPCXHandler::DoCanRead( wxInputStream& stream ) { - unsigned char c; - - c = stream.GetC(); - stream.SeekI(-1, wxFromCurrent); + unsigned char c = stream.GetC(); + if ( !stream ) + return false; // not very safe, but this is all we can get from PCX header :-( - return (c == 10); + return c == 10; } -#endif // wxUSE_STREAMS && wxUSE_PCX +#endif // wxUSE_STREAMS + +#endif // wxUSE_IMAGE && wxUSE_PCX