summaryrefslogtreecommitdiff
path: root/samples/gles2_book/Common/Win32/esUtil_TGA.c
diff options
context:
space:
mode:
Diffstat (limited to 'samples/gles2_book/Common/Win32/esUtil_TGA.c')
-rw-r--r--samples/gles2_book/Common/Win32/esUtil_TGA.c122
1 files changed, 122 insertions, 0 deletions
diff --git a/samples/gles2_book/Common/Win32/esUtil_TGA.c b/samples/gles2_book/Common/Win32/esUtil_TGA.c
new file mode 100644
index 00000000..61d1cb14
--- /dev/null
+++ b/samples/gles2_book/Common/Win32/esUtil_TGA.c
@@ -0,0 +1,122 @@
+//
+// Book: OpenGL(R) ES 2.0 Programming Guide
+// Authors: Aaftab Munshi, Dan Ginsburg, Dave Shreiner
+// ISBN-10: 0321502795
+// ISBN-13: 9780321502797
+// Publisher: Addison-Wesley Professional
+// URLs: http://safari.informit.com/9780321563835
+// http://www.opengles-book.com
+//
+
+// esUtil_TGA.c
+//
+// This file contains the Win32 implementation of a TGA image loader
+
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+///
+// Macros
+//
+#define INVERTED_BIT (1 << 5)
+
+///
+// Types
+//
+#pragma pack(push,x1) // Byte alignment (8-bit)
+#pragma pack(1)
+
+typedef struct
+{
+ unsigned char IdSize,
+ MapType,
+ ImageType;
+ unsigned short PaletteStart,
+ PaletteSize;
+ unsigned char PaletteEntryDepth;
+ unsigned short X,
+ Y,
+ Width,
+ Height;
+ unsigned char ColorDepth,
+ Descriptor;
+
+} TGA_HEADER;
+
+#pragma pack(pop,x1)
+
+////////////////////////////////////////////////////////////////////////////////////
+//
+// Private Functions
+//
+
+////////////////////////////////////////////////////////////////////////////////////
+//
+// Public Functions
+//
+//
+
+
+///
+// WinTGALoad()
+//
+int WinTGALoad( const char *fileName, char **buffer, int *width, int *height )
+{
+ FILE *fp;
+ TGA_HEADER Header;
+
+ if ( fopen_s ( &fp, fileName, "rb" ) != 0 )
+ {
+ return FALSE;
+ }
+
+ if ( fp == NULL )
+ {
+ return FALSE;
+ }
+
+ fread ( &Header, sizeof(TGA_HEADER), 1, fp );
+
+ *width = Header.Width;
+ *height = Header.Height;
+
+ if ( Header.ColorDepth == 24 )
+ {
+ RGBTRIPLE *Buffer24;
+
+ Buffer24= (RGBTRIPLE*)malloc(sizeof(RGBTRIPLE) * (*width) * (*height));
+
+ if(Buffer24)
+ {
+ int i=0;
+ int x,
+ y;
+
+ fread(Buffer24, sizeof(RGBTRIPLE), (*width) * (*height), fp);
+
+ *buffer= (LPSTR) malloc(3 * (*width) * (*height));
+
+ for ( y = 0; y < *height; y++ )
+ for( x = 0; x < *width; x++ )
+ {
+ int Index= y * (*width) + x;
+
+ if(!(Header.Descriptor & INVERTED_BIT))
+ Index= ((*height) - 1 - y) * (*width) + x;
+
+ (*buffer)[(i * 3)]= Buffer24[Index].rgbtRed;
+ (*buffer)[(i * 3) + 1]= Buffer24[Index].rgbtGreen;
+ (*buffer)[(i * 3) + 2]= Buffer24[Index].rgbtBlue;
+
+ i++;
+ }
+
+ fclose(fp);
+ free(Buffer24);
+ return(TRUE);
+ }
+ }
+
+ return(FALSE);
+}