/////////////////////////////////////////////////////////////////////////////
// Name: imagiff.h
// Purpose: wxImage handler for Amiga IFF images
-// Author: Steffen Gutmann
+// Author: Steffen Gutmann, Thomas Meyer
// RCS-ID: $Id$
// Copyright: (c) Steffen Gutmann, 2002
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
-// parts of the source are based on xviff by Thomas Meyer
-// Permission for use in wxWindows has been gratefully given.
+// Parts of this source are based on the iff loading algorithm found
+// in xviff.c. Permission by the original author, Thomas Meyer, and
+// by the author of xv, John Bradley for using the iff loading part
+// in wxWidgets has been gratefully given.
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
#pragma implementation "imagiff.h"
#endif
#include "wx/log.h"
#include "wx/intl.h"
+#if wxUSE_PALETTE
+ #include "wx/palette.h"
+#endif // wxUSE_PALETTE
+
#include <stdlib.h>
#include <string.h>
private:
IFFImage *m_image; // image data
wxInputStream *m_f; // input stream
- unsigned char *databuf;
- unsigned char *picptr;
+ unsigned char *databuf;
+ unsigned char *picptr;
unsigned char *decomp_mem;
void Destroy();
//
bool wxIFFDecoder::CanRead()
{
- unsigned char buf[12] = "";
+ unsigned char buf[12];
- m_f->Read(buf, 12);
- m_f->SeekI(-12, wxFromCurrent);
+ if ( !m_f->Read(buf, WXSIZEOF(buf)) )
+ return FALSE;
+
+ m_f->SeekI(-(off_t)WXSIZEOF(buf), wxFromCurrent);
- return (memcmp(buf, "FORM", 4) == 0 && memcmp(buf+8, "ILBM", 4) == 0);
+ return (memcmp(buf, "FORM", 4) == 0) && (memcmp(buf+8, "ILBM", 4) == 0);
}
// ReadIFF:
// Based on xv source code by Thomas Meyer
-// Permission for use in wxWindows has been gratefully given.
+// Permission for use in wxWidgets has been gratefully given.
typedef unsigned char byte;
#define IFFDEBUG 0
// main decoding loop. searches IFF chunks and handles them.
// terminates when BODY chunk was found or dataptr ran over end of file
//
- bool BMHDok = false, CMAPok = false, CAMGok = false;
+ bool BMHDok = FALSE, CMAPok = FALSE, CAMGok = FALSE;
int bmhd_width = 0, bmhd_height = 0, bmhd_bitplanes = 0, bmhd_transcol = -1;
byte bmhd_masking = 0, bmhd_compression = 0;
long camg_viewmode = 0;
bmhd_masking = *(dataptr + 8 + 9);
bmhd_compression = *(dataptr + 8 + 10); // get compression
bmhd_transcol = iff_getword(dataptr + 8 + 12);
- BMHDok = true; // got BMHD
+ BMHDok = TRUE; // got BMHD
dataptr += 8 + chunkLen; // to next chunk
}
else if (strncmp((char *)dataptr, "CMAP", 4) == 0) { // CMAP ?
wxLogTrace(_T("iff"), _T("Read %d colors from IFF file."),
colors);
- CMAPok = true; // got CMAP
+ CMAPok = TRUE; // got CMAP
dataptr += 8 + chunkLen; // to next chunk
} else if (strncmp((char *)dataptr, "CAMG", 4) == 0) { // CAMG ?
if (chunkLen < 4 || truncated) {
break;
}
camg_viewmode = iff_getlong(dataptr + 8); // get viewmodes
- CAMGok = true; // got CAMG
+ CAMGok = TRUE; // got CAMG
dataptr += 8 + chunkLen; // to next chunk
}
else if (strncmp((char *)dataptr, "BODY", 4) == 0) { // BODY ?
#if wxUSE_STREAMS
-bool wxIFFHandler::LoadFile(wxImage *image, wxInputStream& stream,
+bool wxIFFHandler::LoadFile(wxImage *image, wxInputStream& stream,
bool verbose, int WXUNUSED(index))
{
wxIFFDecoder *decod;
bool wxIFFHandler::DoCanRead(wxInputStream& stream)
{
- wxIFFDecoder *decod;
- bool ok;
+ wxIFFDecoder decod(&stream);
- decod = new wxIFFDecoder(&stream);
- ok = decod->CanRead();
- delete decod;
-
- return ok;
+ return decod.CanRead();
}
#endif // wxUSE_STREAMS