/////////////////////////////////////////////////////////////////////////////
// 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.
-
-#ifdef __GNUG__
-#pragma implementation "imagiff.h"
-#endif
+// 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.
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include "wx/log.h"
#include "wx/intl.h"
+#if wxUSE_PALETTE
+ #include "wx/palette.h"
+#endif // wxUSE_PALETTE
+
#include <stdlib.h>
#include <string.h>
unsigned int w; /* width */
unsigned int h; /* height */
int transparent; /* transparent color (-1 = none) */
- int colors; /* number of colors */
+ int colors; /* number of colors */
unsigned char *p; /* bitmap */
unsigned char *pal; /* palette */
class WXDLLEXPORT wxIFFDecoder
{
private:
- IFFImage *m_image; // image data
- wxInputStream *m_f; // input stream
+ IFFImage *m_image; // image data
+ wxInputStream *m_f; // input stream
unsigned char *databuf;
unsigned char *picptr;
unsigned char *decomp_mem;
image->Create(GetWidth(), GetHeight());
if (!image->Ok())
- return FALSE;
+ return false;
unsigned char *pal = GetPalette();
unsigned char *src = GetData();
image->SetMaskColour(255, 0, 255);
}
else
- image->SetMask(FALSE);
+ image->SetMask(false);
#if wxUSE_PALETTE
if (pal && colors > 0)
dst[2] = src[2];
}
- return TRUE;
+ return true;
}
//
// CanRead:
-// Returns TRUE if the file looks like a valid IFF, FALSE otherwise.
+// Returns true if the file looks like a valid IFF, false otherwise.
//
bool wxIFFDecoder::CanRead()
{
- unsigned char buf[12] = "";
+ unsigned char buf[12];
+
+ if ( !m_f->Read(buf, WXSIZEOF(buf)) )
+ return false;
- m_f->Read(buf, 12);
- m_f->SeekI(-12, wxFromCurrent);
+ m_f->SeekI(-(wxFileOffset)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
}
// compute file length
- off_t currentPos = m_f->TellI();
+ wxFileOffset currentPos = m_f->TellI();
m_f->SeekI(0, wxFromEnd);
long filesize = m_f->TellI();
m_f->SeekI(currentPos, wxFromStart);
// 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;
#else
if (chunkLen < 0) { // format error?
#endif
- break;
+ break;
}
bool truncated = (dataptr + 8 + chunkLen > dataend);
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 ?
}
}
delete decod;
- return FALSE;
+ return false;
}
if ((error == wxIFF_TRUNCATED) && verbose)
if (verbose)
wxLogDebug(wxT("IFF: the handler is read-only!!"));
- return FALSE;
+ return false;
}
bool wxIFFHandler::DoCanRead(wxInputStream& stream)
{
- wxIFFDecoder *decod;
- bool ok;
-
- decod = new wxIFFDecoder(&stream);
- ok = decod->CanRead();
- delete decod;
+ wxIFFDecoder decod(&stream);
- return ok;
+ return decod.CanRead();
}
#endif // wxUSE_STREAMS