summaryrefslogtreecommitdiff
path: root/DevIL/src-IL/src/il_pix.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'DevIL/src-IL/src/il_pix.cpp')
-rw-r--r--DevIL/src-IL/src/il_pix.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/DevIL/src-IL/src/il_pix.cpp b/DevIL/src-IL/src/il_pix.cpp
new file mode 100644
index 00000000..2f1b070d
--- /dev/null
+++ b/DevIL/src-IL/src/il_pix.cpp
@@ -0,0 +1,158 @@
+//-----------------------------------------------------------------------------
+//
+// ImageLib Sources
+// Copyright (C) 2000-2009 by Denton Woods
+// Last modified: 03/07/2009
+//
+// Filename: src-IL/src/il_pix.c
+//
+// Description: Reads from an Alias | Wavefront .pix file.
+//
+//-----------------------------------------------------------------------------
+
+
+#include "il_internal.h"
+#ifndef IL_NO_PIX
+#include "il_endian.h"
+
+
+#ifdef _MSC_VER
+#pragma pack(push, pix_struct, 1)
+#endif
+typedef struct PIXHEAD
+{
+ ILushort Width;
+ ILushort Height;
+ ILushort OffX;
+ ILushort OffY;
+ ILushort Bpp;
+} IL_PACKSTRUCT PIXHEAD;
+#ifdef _MSC_VER
+#pragma pack(pop, pix_struct)
+#endif
+
+ILboolean iCheckPix(PIXHEAD *Header);
+ILboolean iLoadPixInternal(void);
+
+
+// Internal function used to get the Pix header from the current file.
+ILboolean iGetPixHead(PIXHEAD *Header)
+{
+ Header->Width = GetBigUShort();
+ Header->Height = GetBigUShort();
+ Header->OffX = GetBigUShort();
+ Header->OffY = GetBigUShort();
+ Header->Bpp = GetBigUShort();
+
+ return IL_TRUE;
+}
+
+
+// Internal function to get the header and check it.
+ILboolean iIsValidPix()
+{
+ PIXHEAD Head;
+
+ if (!iGetPixHead(&Head))
+ return IL_FALSE;
+ iseek(-(ILint)sizeof(PIXHEAD), IL_SEEK_CUR);
+
+ return iCheckPix(&Head);
+}
+
+
+// Internal function used to check if the HEADER is a valid Pix header.
+ILboolean iCheckPix(PIXHEAD *Header)
+{
+ if (Header->Width == 0 || Header->Height == 0)
+ return IL_FALSE;
+ if (Header->Bpp != 24)
+ return IL_FALSE;
+ //if (Header->OffY != Header->Height)
+ // return IL_FALSE;
+
+ return IL_TRUE;
+}
+
+
+//! Reads a Pix file
+ILboolean ilLoadPix(ILconst_string FileName)
+{
+ ILHANDLE PixFile;
+ ILboolean bPix = IL_FALSE;
+
+ PixFile = iopenr(FileName);
+ if (PixFile == NULL) {
+ ilSetError(IL_COULD_NOT_OPEN_FILE);
+ return bPix;
+ }
+
+ bPix = ilLoadPixF(PixFile);
+ icloser(PixFile);
+
+ return bPix;
+}
+
+
+//! Reads an already-opened Pix file
+ILboolean ilLoadPixF(ILHANDLE File)
+{
+ ILuint FirstPos;
+ ILboolean bRet;
+
+ iSetInputFile(File);
+ FirstPos = itell();
+ bRet = iLoadPixInternal();
+ iseek(FirstPos, IL_SEEK_SET);
+
+ return bRet;
+}
+
+
+//! Reads from a memory "lump" that contains a Pix
+ILboolean ilLoadPixL(const void *Lump, ILuint Size)
+{
+ iSetInputLump(Lump, Size);
+ return iLoadPixInternal();
+}
+
+
+// Internal function used to load the Pix.
+ILboolean iLoadPixInternal()
+{
+ PIXHEAD Header;
+ ILuint i, j;
+ ILubyte ByteHead, Colour[3];
+
+ if (iCurImage == NULL) {
+ ilSetError(IL_ILLEGAL_OPERATION);
+ return IL_FALSE;
+ }
+
+ if (!iGetPixHead(&Header))
+ return IL_FALSE;
+ if (!iCheckPix(&Header)) {
+ ilSetError(IL_INVALID_FILE_HEADER);
+ return IL_FALSE;
+ }
+
+ if (!ilTexImage(Header.Width, Header.Height, 1, 3, IL_BGR, IL_UNSIGNED_BYTE, NULL))
+ return IL_FALSE;
+
+ for (i = 0; i < iCurImage->SizeOfData; ) {
+ ByteHead = igetc();
+ if (iread(Colour, 1, 3) != 3)
+ return IL_FALSE;
+ for (j = 0; j < ByteHead; j++) {
+ iCurImage->Data[i++] = Colour[0];
+ iCurImage->Data[i++] = Colour[1];
+ iCurImage->Data[i++] = Colour[2];
+ }
+ }
+
+ iCurImage->Origin = IL_ORIGIN_UPPER_LEFT;
+
+ return ilFixImage();
+}
+
+#endif//IL_NO_PIX