cocoaTouch/otherSrc/IMG.c
changeset 2698 90585aba87ad
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cocoaTouch/otherSrc/IMG.c	Sat Jan 16 17:30:37 2010 +0000
@@ -0,0 +1,152 @@
+/*
+    SDL_image:  An example image loading library for use with SDL
+    Copyright (C) 1997-2009 Sam Lantinga
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+    Sam Lantinga
+    slouken@libsdl.org
+*/
+
+/* A simple library to load images of various formats as SDL surfaces */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "SDL_image.h"
+
+#define ARRAYSIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+/* Table of image detection and loading functions */
+static struct {
+	char *type;
+	int (SDLCALL *is)(SDL_RWops *src);
+	SDL_Surface *(SDLCALL *load)(SDL_RWops *src);
+} supported[] = {
+	/* keep magicless formats first */
+	{ "PNG", IMG_isPNG, IMG_LoadPNG_RW }
+};
+
+
+extern int IMG_InitPNG();
+extern void IMG_QuitPNG();
+
+static int initialized = 0;
+
+int IMG_Init(int flags)
+{
+	int result = 0;
+
+	if (flags & IMG_INIT_PNG) {
+		if ((initialized & IMG_INIT_PNG) || IMG_InitPNG() == 0) {
+			result |= IMG_INIT_PNG;
+		}
+	}
+	initialized |= result;
+
+	return (result);
+}
+
+void IMG_Quit()
+{
+	if (initialized & IMG_INIT_PNG) {
+		IMG_QuitPNG();
+	}
+	initialized = 0;
+}
+
+/* Load an image from a file */
+SDL_Surface *IMG_Load(const char *file)
+{
+    SDL_RWops *src = SDL_RWFromFile(file, "rb");
+    char *ext = strrchr(file, '.');
+    if(ext) {
+        ext++;
+    }
+    if(!src) {
+        /* The error message has been set in SDL_RWFromFile */
+        return NULL;
+    }
+    return IMG_LoadTyped_RW(src, 1, ext);
+}
+
+/* Load an image from an SDL datasource (for compatibility) */
+SDL_Surface *IMG_Load_RW(SDL_RWops *src, int freesrc)
+{
+    return IMG_LoadTyped_RW(src, freesrc, NULL);
+}
+
+/* Portable case-insensitive string compare function */
+static int IMG_string_equals(const char *str1, const char *str2)
+{
+	while ( *str1 && *str2 ) {
+		if ( toupper((unsigned char)*str1) !=
+		     toupper((unsigned char)*str2) )
+			break;
+		++str1;
+		++str2;
+	}
+	return (!*str1 && !*str2);
+}
+
+/* Load an image from an SDL datasource, optionally specifying the type */
+SDL_Surface *IMG_LoadTyped_RW(SDL_RWops *src, int freesrc, char *type)
+{
+	int i;
+	SDL_Surface *image;
+
+	/* Make sure there is something to do.. */
+	if ( src == NULL ) {
+		IMG_SetError("Passed a NULL data source");
+		return(NULL);
+	}
+
+	/* See whether or not this data source can handle seeking */
+	if ( SDL_RWseek(src, 0, RW_SEEK_CUR) < 0 ) {
+		IMG_SetError("Can't seek in this data source");
+		if(freesrc)
+			SDL_RWclose(src);
+		return(NULL);
+	}
+
+	/* Detect the type of image being loaded */
+	image = NULL;
+	for ( i=0; i < ARRAYSIZE(supported); ++i ) {
+		if(supported[i].is) {
+			if(!supported[i].is(src))
+				continue;
+		} else {
+			/* magicless format */
+			if(!type
+			   || !IMG_string_equals(type, supported[i].type))
+				continue;
+		}
+#ifdef DEBUG_IMGLIB
+		fprintf(stderr, "IMGLIB: Loading image as %s\n", supported[i].type);
+#endif
+		image = supported[i].load(src);
+		if(freesrc)
+			SDL_RWclose(src);
+		return image;
+	}
+
+	if ( freesrc ) {
+		SDL_RWclose(src);
+	}
+	IMG_SetError("Unsupported image format");
+	return NULL;
+}
+