/////////////////////////////////////////////////////////////////////////////
// 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>
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
- unsigned char *databuf;
- unsigned char *picptr;
+ IFFImage *m_image; // image data
+ wxInputStream *m_f; // input stream
+ unsigned char *databuf;
+ unsigned char *picptr;
unsigned char *decomp_mem;
void Destroy();
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];
- m_f->Read(buf, 12);
- m_f->SeekI(-12, wxFromCurrent);
+ if ( !m_f->Read(buf, WXSIZEOF(buf)) )
+ return false;
- return (memcmp(buf, "FORM", 4) == 0 && memcmp(buf+8, "ILBM", 4) == 0);
+ m_f->SeekI(-(off_t)WXSIZEOF(buf), wxFromCurrent);
+
+ 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
#else
if (chunkLen < 0) { // format error?
#endif
- break;
+ break;
}
bool truncated = (dataptr + 8 + chunkLen > dataend);
#if wxUSE_STREAMS
-bool wxIFFHandler::LoadFile(wxImage *image, wxInputStream& stream,
+bool wxIFFHandler::LoadFile(wxImage *image, wxInputStream& stream,
bool verbose, int WXUNUSED(index))
{
wxIFFDecoder *decod;
}
}
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;
+ wxIFFDecoder decod(&stream);
- decod = new wxIFFDecoder(&stream);
- ok = decod->CanRead();
- delete decod;
-
- return ok;
+ return decod.CanRead();
}
#endif // wxUSE_STREAMS