X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/74ab5f5b9df928c75c119a2c00b0d2092caa49f1..ba49d2acf95d53517719c4fd9ac2ad5aaa13540b:/src/common/imagiff.cpp diff --git a/src/common/imagiff.cpp b/src/common/imagiff.cpp index 058d6e5cd0..635758c559 100644 --- a/src/common/imagiff.cpp +++ b/src/common/imagiff.cpp @@ -1,5 +1,5 @@ ///////////////////////////////////////////////////////////////////////////// -// Name: src/common/imagiff.h +// Name: src/common/imagiff.cpp // Purpose: wxImage handler for Amiga IFF images // Author: Steffen Gutmann, Thomas Meyer // RCS-ID: $Id$ @@ -81,7 +81,6 @@ private: IFFImage *m_image; // image data wxInputStream *m_f; // input stream unsigned char *databuf; - unsigned char *picptr; unsigned char *decomp_mem; void Destroy(); @@ -98,7 +97,10 @@ public: // constructor, destructor, etc. wxIFFDecoder(wxInputStream *s); ~wxIFFDecoder() { Destroy(); } + + // NOTE: this function modifies the current stream position bool CanRead(); + int ReadIFF(); bool ConvertToImage(wxImage *image) const; }; @@ -118,12 +120,9 @@ wxIFFDecoder::wxIFFDecoder(wxInputStream *s) void wxIFFDecoder::Destroy() { - delete m_image; - m_image = 0; - delete [] databuf; - databuf = 0; - delete [] decomp_mem; - decomp_mem = 0; + wxDELETE(m_image); + wxDELETEA(databuf); + wxDELETEA(decomp_mem); } //--------------------------------------------------------------------------- @@ -140,7 +139,7 @@ bool wxIFFDecoder::ConvertToImage(wxImage *image) const // create the image image->Create(GetWidth(), GetHeight()); - if (!image->Ok()) + if (!image->IsOk()) return false; unsigned char *pal = GetPalette(); @@ -234,8 +233,6 @@ bool wxIFFDecoder::CanRead() if ( !m_f->Read(buf, WXSIZEOF(buf)) ) return false; - m_f->SeekI(-(wxFileOffset)WXSIZEOF(buf), wxFromCurrent); - return (memcmp(buf, "FORM", 4) == 0) && (memcmp(buf+8, "ILBM", 4) == 0); } @@ -248,13 +245,13 @@ typedef unsigned char byte; #define IFFDEBUG 0 /************************************************************************* - void decomprle(source, destination, source length, buffer size) +void decomprle(source, destination, source length, buffer size) - Decompress run-length encoded data from source to destination. Terminates - when source is decoded completely or destination buffer is full. +Decompress run-length encoded data from source to destination. Terminates +when source is decoded completely or destination buffer is full. - The decruncher is as optimized as I could make it, without risking - safety in case of corrupt BODY chunks. +The decruncher is as optimized as I could make it, without risking +safety in case of corrupt BODY chunks. **************************************************************************/ static void decomprle(const byte *sptr, byte *dptr, long slen, long dlen) @@ -329,20 +326,27 @@ int wxIFFDecoder::ReadIFF() m_image = new IFFImage(); if (m_image == 0) { - Destroy(); - return wxIFF_MEMERR; + Destroy(); + return wxIFF_MEMERR; } // compute file length wxFileOffset currentPos = m_f->TellI(); - m_f->SeekI(0, wxFromEnd); + if (m_f->SeekI(0, wxFromEnd) == wxInvalidOffset) { + Destroy(); + return wxIFF_MEMERR; + } + long filesize = m_f->TellI(); - m_f->SeekI(currentPos, wxFromStart); + if (m_f->SeekI(currentPos, wxFromStart) == wxInvalidOffset) { + Destroy(); + return wxIFF_MEMERR; + } // allocate memory for complete file if ((databuf = new byte[filesize]) == 0) { - Destroy(); - return wxIFF_MEMERR; + Destroy(); + return wxIFF_MEMERR; } m_f->Read(databuf, filesize); @@ -353,25 +357,25 @@ int wxIFFDecoder::ReadIFF() // check for minmal size if (dataptr + 12 > dataend) { - Destroy(); - return wxIFF_INVFORMAT; + Destroy(); + return wxIFF_INVFORMAT; } // check if we really got an IFF file if (strncmp((char *)dataptr, "FORM", 4) != 0) { - Destroy(); - return wxIFF_INVFORMAT; + Destroy(); + return wxIFF_INVFORMAT; } dataptr = dataptr + 8; // skip ID and length of FORM // check if the IFF file is an ILBM (picture) file if (strncmp((char *) dataptr, "ILBM", 4) != 0) { - Destroy(); - return wxIFF_INVFORMAT; + Destroy(); + return wxIFF_INVFORMAT; } - wxLogTrace(_T("iff"), _T("IFF ILBM file recognized")); + wxLogTrace(wxT("iff"), wxT("IFF ILBM file recognized")); dataptr = dataptr + 4; // skip ID @@ -388,7 +392,7 @@ int wxIFFDecoder::ReadIFF() // get chunk length and make even long chunkLen = (iff_getlong(dataptr + 4) + 1) & 0xfffffffe; if (chunkLen < 0) { // format error? - break; + break; } bool truncated = (dataptr + 8 + chunkLen > dataend); @@ -412,8 +416,7 @@ int wxIFFDecoder::ReadIFF() const byte *cmapptr = dataptr + 8; colors = chunkLen / 3; // calc no of colors - delete m_image->pal; - m_image->pal = 0; + wxDELETE(m_image->pal); m_image->colors = colors; if (colors > 0) { m_image->pal = new byte[3*colors]; @@ -430,7 +433,7 @@ int wxIFFDecoder::ReadIFF() } } - wxLogTrace(_T("iff"), _T("Read %d colors from IFF file."), + wxLogTrace(wxT("iff"), wxT("Read %d colors from IFF file."), colors); dataptr += 8 + chunkLen; // to next chunk @@ -471,8 +474,7 @@ int wxIFFDecoder::ReadIFF() decomprle(bodyptr, decomp_mem, chunkLen, decomp_bufsize); bodyptr = decomp_mem; // -> uncompressed BODY chunkLen = decomp_bufsize; - delete [] databuf; - databuf = 0; + wxDELETEA(databuf); } // the following determines the type of the ILBM file. @@ -493,8 +495,8 @@ int wxIFFDecoder::ReadIFF() } } - wxLogTrace(_T("iff"), - _T("LoadIFF: %s %dx%d, planes=%d (%d cols), comp=%d"), + wxLogTrace(wxT("iff"), + wxT("LoadIFF: %s %dx%d, planes=%d (%d cols), comp=%d"), (fmt==ILBM_NORMAL) ? "Normal ILBM" : (fmt==ILBM_HAM) ? "HAM ILBM" : (fmt==ILBM_HAM8) ? "HAM8 ILBM" : @@ -504,8 +506,8 @@ int wxIFFDecoder::ReadIFF() 1<p = new byte[bmhd_width * bmhd_height * 3]; - byte *picptr = m_image->p; + byte *picptr = m_image->p; if (!picptr) { Destroy(); return wxIFF_MEMERR; @@ -586,36 +588,36 @@ int wxIFFDecoder::ReadIFF() int c = (col & 0x0f); switch (col & 0x30) { case 0x00: if (c >= 0 && c < colors) { - rval = pal[3*c + 0]; - gval = pal[3*c + 1]; - bval = pal[3*c + 2]; - } - break; + rval = pal[3*c + 0]; + gval = pal[3*c + 1]; + bval = pal[3*c + 2]; + } + break; case 0x10: bval = c * 17; - break; + break; case 0x20: rval = c * 17; - break; + break; case 0x30: gval = c * 17; - break; + break; } } else if (fmt == ILBM_HAM8) { int c = (col & 0x3f); switch(col & 0xc0) { case 0x00: if (c >= 0 && c < colors) { - rval = pal[3*c + 0]; - gval = pal[3*c + 1]; - bval = pal[3*c + 2]; - } - break; + rval = pal[3*c + 0]; + gval = pal[3*c + 1]; + bval = pal[3*c + 2]; + } + break; case 0x40: bval = (bval & 3) | (c << 2); - break; + break; case 0x80: rval = (rval & 3) | (c << 2); - break; + break; case 0xc0: gval = (rval & 3) | (c << 2); } @@ -639,7 +641,7 @@ int wxIFFDecoder::ReadIFF() } } else if ((fmt == ILBM_NORMAL) || (fmt == ILBM_EHB)) { if (fmt == ILBM_EHB) { - wxLogTrace(_T("iff"), _T("Doubling CMAP for EHB mode")); + wxLogTrace(wxT("iff"), wxT("Doubling CMAP for EHB mode")); for (int i=0; i<32; i++) { pal[3*(i + 32) + 0] = pal[3*i + 0] >> 1; @@ -696,12 +698,12 @@ int wxIFFDecoder::ReadIFF() m_image->h = height; m_image->transparent = bmhd_transcol; - wxLogTrace(_T("iff"), _T("Loaded IFF picture %s"), + wxLogTrace(wxT("iff"), wxT("Loaded IFF picture %s"), truncated? "truncated" : "completely"); return (truncated? wxIFF_TRUNCATED : wxIFF_OK); } else { - wxLogTrace(_T("iff"), _T("Skipping unknown chunk '%c%c%c%c'"), + wxLogTrace(wxT("iff"), wxT("Skipping unknown chunk '%c%c%c%c'"), *dataptr, *(dataptr+1), *(dataptr+2), *(dataptr+3)); dataptr = dataptr + 8 + chunkLen; // skip unknown chunk @@ -769,7 +771,9 @@ bool wxIFFHandler::SaveFile(wxImage * WXUNUSED(image), wxOutputStream& WXUNUSED(stream), bool verbose) { if (verbose) + { wxLogDebug(wxT("IFF: the handler is read-only!!")); + } return false; } @@ -779,6 +783,7 @@ bool wxIFFHandler::DoCanRead(wxInputStream& stream) wxIFFDecoder decod(&stream); return decod.CanRead(); + // it's ok to modify the stream position here } #endif // wxUSE_STREAMS