Convert end of line characters to UNIX
authorMiriam Ruiz <miriam@debian.org>
Wed, 3 Dec 2008 00:34:55 +0000 (3 01:34 +0100)
committerMiriam Ruiz <miriam@debian.org>
Wed, 3 Dec 2008 00:34:55 +0000 (3 01:34 +0100)
Example/Test.c
include/GL/glpng.h
src/glpng.c

index 9d20cff..7ab4444 100644 (file)
-/*\r
- * Test program for glpng\r
- * by Ben Wyatt ben@wyatt100.freeserve.co.uk\r
- * Featuring a shameless plug for my stunt course program\r
- * Available from the same site as glpng\r
- * http://www.wyatt100.freeserve.co.uk/download.htm\r
- */\r
-\r
-#include <GL/glpng.h>\r
-#include <GL/glut.h>\r
-#include <stdlib.h>\r
-\r
-int angle = 0;\r
-\r
-/***** GLUT callback functions *****/\r
-\r
-void KeyPress(unsigned char key, int x, int y) {\r
-       switch (key) {\r
-               case 27: /*ESC*/ glutDestroyWindow(glutGetWindow()); exit(0); break;\r
-       }\r
-}\r
-\r
-void Update(void) {\r
-       angle = (angle+1)%360;\r
-       glutPostRedisplay();\r
-}\r
-\r
-void Display(void) {\r
-       const float w = 2, h = 2;\r
-\r
-       glClear(GL_COLOR_BUFFER_BIT);\r
-\r
-       glLoadIdentity();\r
-       glTranslatef(0, 0, -10);\r
-       glRotatef(angle, 0, 1, 0);\r
-\r
-       glBegin(GL_QUADS);\r
-               // Front\r
-               glTexCoord2f(1, 1); glVertex3f( w, -h, 0);\r
-               glTexCoord2f(1, 0); glVertex3f( w,  h, 0);\r
-               glTexCoord2f(0, 0); glVertex3f(-w,  h, 0);\r
-               glTexCoord2f(0, 1); glVertex3f(-w, -h, 0);\r
-\r
-               // Back\r
-               glTexCoord2f(1, 1); glVertex3f(-w, -h, 0);\r
-               glTexCoord2f(1, 0); glVertex3f(-w,  h, 0);\r
-               glTexCoord2f(0, 0); glVertex3f( w,  h, 0);\r
-               glTexCoord2f(0, 1); glVertex3f( w, -h, 0);\r
-       glEnd();\r
-\r
-       glutSwapBuffers();\r
-}\r
-\r
-void Reshape(int w, int h) {\r
-       glViewport(0, 0, w, h);\r
-       \r
-       glMatrixMode(GL_PROJECTION);\r
-       glLoadIdentity();\r
-       gluPerspective(30, (float) w/h, 1, 100);\r
-\r
-       glMatrixMode(GL_MODELVIEW);\r
-       Display();\r
-}\r
-\r
-/***** Main function *****/\r
-\r
-void main() {\r
-       pngInfo info;\r
-       GLuint  texture;\r
-\r
-       glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);\r
-       glutInitWindowSize(300, 300);\r
-       glutCreateWindow("glpng test");\r
-\r
-       #if 0 // Using pngLoad and setting texture parameters manually.\r
-               glGenTextures(1, &texture);\r
-               glBindTexture(GL_TEXTURE_2D, texture);\r
-\r
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\r
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\r
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);\r
-               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);\r
-\r
-               if (!pngLoad("Stunt.png", PNG_NOMIPMAP, PNG_SOLID, &info)) {\r
-                       puts("Can't load file");\r
-                       exit(1);\r
-               }\r
-       #else // Using pngLoadAndBind to set texture parameters automatically.\r
-               texture = pngBind("Stunt.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);\r
-\r
-               if (texture == 0) {\r
-                       puts("Can't load file");\r
-                       exit(1);\r
-               }\r
-       #endif\r
-\r
-       printf("Size=%i,%i Depth=%i Alpha=%i\n", info.Width, info.Height, info.Depth, info.Alpha);\r
-\r
-       glEnable(GL_TEXTURE_2D);\r
-       glBindTexture(GL_TEXTURE_2D, texture);\r
-       glEnable(GL_CULL_FACE);\r
-       glColor3f(1, 1, 1);\r
-\r
-       glutKeyboardFunc(KeyPress);\r
-       glutIdleFunc(Update);\r
-       glutDisplayFunc(Display);\r
-       glutReshapeFunc(Reshape);\r
-\r
-       glutMainLoop();\r
-}\r
+/*
+ * Test program for glpng
+ * by Ben Wyatt ben@wyatt100.freeserve.co.uk
+ * Featuring a shameless plug for my stunt course program
+ * Available from the same site as glpng
+ * http://www.wyatt100.freeserve.co.uk/download.htm
+ */
+
+#include <GL/glpng.h>
+#include <GL/glut.h>
+#include <stdlib.h>
+
+int angle = 0;
+
+/***** GLUT callback functions *****/
+
+void KeyPress(unsigned char key, int x, int y) {
+       switch (key) {
+               case 27: /*ESC*/ glutDestroyWindow(glutGetWindow()); exit(0); break;
+       }
+}
+
+void Update(void) {
+       angle = (angle+1)%360;
+       glutPostRedisplay();
+}
+
+void Display(void) {
+       const float w = 2, h = 2;
+
+       glClear(GL_COLOR_BUFFER_BIT);
+
+       glLoadIdentity();
+       glTranslatef(0, 0, -10);
+       glRotatef(angle, 0, 1, 0);
+
+       glBegin(GL_QUADS);
+               // Front
+               glTexCoord2f(1, 1); glVertex3f( w, -h, 0);
+               glTexCoord2f(1, 0); glVertex3f( w,  h, 0);
+               glTexCoord2f(0, 0); glVertex3f(-w,  h, 0);
+               glTexCoord2f(0, 1); glVertex3f(-w, -h, 0);
+
+               // Back
+               glTexCoord2f(1, 1); glVertex3f(-w, -h, 0);
+               glTexCoord2f(1, 0); glVertex3f(-w,  h, 0);
+               glTexCoord2f(0, 0); glVertex3f( w,  h, 0);
+               glTexCoord2f(0, 1); glVertex3f( w, -h, 0);
+       glEnd();
+
+       glutSwapBuffers();
+}
+
+void Reshape(int w, int h) {
+       glViewport(0, 0, w, h);
+       
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(30, (float) w/h, 1, 100);
+
+       glMatrixMode(GL_MODELVIEW);
+       Display();
+}
+
+/***** Main function *****/
+
+void main() {
+       pngInfo info;
+       GLuint  texture;
+
+       glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
+       glutInitWindowSize(300, 300);
+       glutCreateWindow("glpng test");
+
+       #if 0 // Using pngLoad and setting texture parameters manually.
+               glGenTextures(1, &texture);
+               glBindTexture(GL_TEXTURE_2D, texture);
+
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+               glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+
+               if (!pngLoad("Stunt.png", PNG_NOMIPMAP, PNG_SOLID, &info)) {
+                       puts("Can't load file");
+                       exit(1);
+               }
+       #else // Using pngLoadAndBind to set texture parameters automatically.
+               texture = pngBind("Stunt.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
+
+               if (texture == 0) {
+                       puts("Can't load file");
+                       exit(1);
+               }
+       #endif
+
+       printf("Size=%i,%i Depth=%i Alpha=%i\n", info.Width, info.Height, info.Depth, info.Alpha);
+
+       glEnable(GL_TEXTURE_2D);
+       glBindTexture(GL_TEXTURE_2D, texture);
+       glEnable(GL_CULL_FACE);
+       glColor3f(1, 1, 1);
+
+       glutKeyboardFunc(KeyPress);
+       glutIdleFunc(Update);
+       glutDisplayFunc(Display);
+       glutReshapeFunc(Reshape);
+
+       glutMainLoop();
+}
index b98ab88..c23ebcb 100644 (file)
@@ -2,22 +2,22 @@
  * PNG loader library for OpenGL v1.45 (10/07/00)
  * by Ben Wyatt ben@wyatt100.freeserve.co.uk
  * Using LibPNG 1.0.2 and ZLib 1.1.3
- *\r
- * This software is provided 'as-is', without any express or implied warranty.\r
- * In no event will the author be held liable for any damages arising from the\r
- * use of this software.\r
- *\r
- * Permission is hereby granted to use, copy, modify, and distribute this\r
- * source code, or portions hereof, for any purpose, without fee, subject to\r
- * the following restrictions:\r
- *\r
- * 1. The origin of this source code must not be misrepresented. You must not\r
- *    claim that you wrote the original software. If you use this software in\r
- *    a product, an acknowledgment in the product documentation would be\r
- *    appreciated but is not required.\r
- * 2. Altered versions must be plainly marked as such and must not be\r
- *    misrepresented as being the original source.\r
- * 3. This notice must not be removed or altered from any source distribution.\r
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the author be held liable for any damages arising from the
+ * use of this software.
+ *
+ * Permission is hereby granted to use, copy, modify, and distribute this
+ * source code, or portions hereof, for any purpose, without fee, subject to
+ * the following restrictions:
+ *
+ * 1. The origin of this source code must not be misrepresented. You must not
+ *    claim that you wrote the original software. If you use this software in
+ *    a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered versions must be plainly marked as such and must not be
+ *    misrepresented as being the original source.
+ * 3. This notice must not be removed or altered from any source distribution.
  */
 
 #ifndef _GLPNG_H_
@@ -30,10 +30,10 @@ extern "C" {
 #endif
 
 #ifdef _MSC_VER
-       #ifdef _DEBUG\r
-               #pragma comment (lib, "glpngd.lib")\r
-       #else\r
-               #pragma comment (lib, "glpng.lib")\r
+       #ifdef _DEBUG
+               #pragma comment (lib, "glpngd.lib")
+       #else
+               #pragma comment (lib, "glpng.lib")
        #endif
 #endif
 
@@ -48,15 +48,15 @@ extern "C" {
 
 /* Mipmapping parameters */
 #define PNG_NOMIPMAPS      0 /* No mipmapping                        */
-#define PNG_BUILDMIPMAPS  -1 /* Calls a clone of gluBuild2DMipmaps() */\r
-#define PNG_SIMPLEMIPMAPS -2 /* Generates mipmaps without filtering  */\r
-\r
-/* Who needs an "S" anyway? */\r
-#define PNG_NOMIPMAP     PNG_NOMIPMAPS\r
-#define PNG_BUILDMIPMAP  PNG_BUILDMIPMAPS\r
-#define PNG_SIMPLEMIPMAP PNG_SIMPLEMIPMAPS\r
-
-/* Transparency parameters */\r
+#define PNG_BUILDMIPMAPS  -1 /* Calls a clone of gluBuild2DMipmaps() */
+#define PNG_SIMPLEMIPMAPS -2 /* Generates mipmaps without filtering  */
+
+/* Who needs an "S" anyway? */
+#define PNG_NOMIPMAP     PNG_NOMIPMAPS
+#define PNG_BUILDMIPMAP  PNG_BUILDMIPMAPS
+#define PNG_SIMPLEMIPMAP PNG_SIMPLEMIPMAPS
+
+/* Transparency parameters */
 #define PNG_CALLBACK  -3 /* Call the callback function to generate alpha   */
 #define PNG_ALPHA     -2 /* Use alpha channel in PNG file, if there is one */
 #define PNG_SOLID     -1 /* No transparency                                */
@@ -100,7 +100,7 @@ extern unsigned int APIENTRY pngBindF(FILE *file, int mipmap, int trans, pngInfo
 extern void APIENTRY pngSetStencil(unsigned char red, unsigned char green, unsigned char blue);
 extern void APIENTRY pngSetAlphaCallback(unsigned char (*callback)(unsigned char red, unsigned char green, unsigned char blue));
 extern void APIENTRY pngSetViewingGamma(double viewingGamma);
-extern void APIENTRY pngSetStandardOrientation(int standardorientation);\r
+extern void APIENTRY pngSetStandardOrientation(int standardorientation);
 
 #ifdef __cplusplus
 }
index 194dfc1..edae8f5 100644 (file)
@@ -1,40 +1,40 @@
-/*\r
- * PNG loader library for OpenGL v1.45 (10/07/00)\r
- * by Ben Wyatt ben@wyatt100.freeserve.co.uk\r
- * Using LibPNG 1.0.2 and ZLib 1.1.3\r
- *\r
- * This software is provided 'as-is', without any express or implied warranty.\r
- * In no event will the author be held liable for any damages arising from the\r
- * use of this software.\r
- *\r
- * Permission is hereby granted to use, copy, modify, and distribute this\r
- * source code, or portions hereof, for any purpose, without fee, subject to\r
- * the following restrictions:\r
- *\r
- * 1. The origin of this source code must not be misrepresented. You must not\r
- *    claim that you wrote the original software. If you use this software in\r
- *    a product, an acknowledgment in the product documentation would be\r
- *    appreciated but is not required.\r
- * 2. Altered versions must be plainly marked as such and must not be\r
- *    misrepresented as being the original source.\r
- * 3. This notice must not be removed or altered from any source distribution.\r
- */\r
-\r
+/*
+ * PNG loader library for OpenGL v1.45 (10/07/00)
+ * by Ben Wyatt ben@wyatt100.freeserve.co.uk
+ * Using LibPNG 1.0.2 and ZLib 1.1.3
+ *
+ * This software is provided 'as-is', without any express or implied warranty.
+ * In no event will the author be held liable for any damages arising from the
+ * use of this software.
+ *
+ * Permission is hereby granted to use, copy, modify, and distribute this
+ * source code, or portions hereof, for any purpose, without fee, subject to
+ * the following restrictions:
+ *
+ * 1. The origin of this source code must not be misrepresented. You must not
+ *    claim that you wrote the original software. If you use this software in
+ *    a product, an acknowledgment in the product documentation would be
+ *    appreciated but is not required.
+ * 2. Altered versions must be plainly marked as such and must not be
+ *    misrepresented as being the original source.
+ * 3. This notice must not be removed or altered from any source distribution.
+ */
+
 #ifdef _WIN32 /* Stupid Windows needs to include windows.h before gl.h */
        #undef FAR
        #include <windows.h>
 #endif
 
 #include <GL/glpng.h>
-#include <GL/gl.h>\r
+#include <GL/gl.h>
 #include <stdlib.h>
 #include <math.h>
 #include <png.h>
-\r
-/* Used to decide if GL/gl.h supports the paletted extension */\r
-#ifdef GL_COLOR_INDEX1_EXT\r
-#define SUPPORTS_PALETTE_EXT\r
-#endif\r
+
+/* Used to decide if GL/gl.h supports the paletted extension */
+#ifdef GL_COLOR_INDEX1_EXT
+#define SUPPORTS_PALETTE_EXT
+#endif
 
 static unsigned char DefaultAlphaCallback(unsigned char red, unsigned char green, unsigned char blue) {
        return 255;
@@ -42,13 +42,13 @@ static unsigned char DefaultAlphaCallback(unsigned char red, unsigned char green
 
 static unsigned char StencilRed = 0, StencilGreen = 0, StencilBlue = 0;
 static unsigned char (*AlphaCallback)(unsigned char red, unsigned char green, unsigned char blue) = DefaultAlphaCallback;
-static int StandardOrientation = 0;\r
+static int StandardOrientation = 0;
 
-#ifdef SUPPORTS_PALETTE_EXT\r
+#ifdef SUPPORTS_PALETTE_EXT
 #ifdef _WIN32
-static PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL;\r
+static PFNGLCOLORTABLEEXTPROC glColorTableEXT = NULL;
+#endif
 #endif
-#endif\r
 
 static int PalettedTextures = -1;
 static GLint MaxTextureSize = 0;
@@ -58,17 +58,17 @@ static GLint MaxTextureSize = 0;
  * viewingGamma depends on platform. PC is 1.0, Mac is 1.45, SGI defaults
  * to 1.7, but this can be checked and changed w/ /usr/sbin/gamma command.
  * If the environment variable VIEWING_GAMMA is set, adjust gamma per this value.
- */\r
-#ifdef _MAC\r
-       static double screenGamma = 2.2 / 1.45;\r
-#elif SGI\r
-       static double screenGamma = 2.2 / 1.7;\r
+ */
+#ifdef _MAC
+       static double screenGamma = 2.2 / 1.45;
+#elif SGI
+       static double screenGamma = 2.2 / 1.7;
 #else /* PC/default */
-       static double screenGamma = 2.2 / 1.0;\r
-#endif\r
-\r
+       static double screenGamma = 2.2 / 1.0;
+#endif
+
 static char gammaExplicit = 0; /*if  */
-\r
+
 static void checkForGammaEnv()
 {
        double viewingGamma;
@@ -112,7 +112,7 @@ static void Resize(int components, const png_bytep d1, int w1, int h1, png_bytep
                }
        }
 }
-\r
+
 #ifdef _WIN32
 static int ExtSupported(const char *x) {
        static const GLubyte *ext = NULL;
@@ -131,110 +131,110 @@ static int ExtSupported(const char *x) {
        return 0;
 }
 #endif
-\r
-#define GET(o) ((int)*(data + (o)))\r
-\r
-static int HalfSize(GLint components, GLint width, GLint height, const unsigned char *data, unsigned char *d, int filter) {\r
-       int x, y, c;\r
-       int line = width*components;\r
-\r
-       if (width > 1 && height > 1) {\r
-               if (filter)\r
-                       for (y = 0; y < height; y += 2) {\r
-                               for (x = 0; x < width; x += 2) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = (GET(0)+GET(components)+GET(line)+GET(line+components)) / 4;\r
-                                               data++;\r
-                                       }\r
-                                       data += components;\r
-                               }\r
-                               data += line;\r
-                       }\r
-               else\r
-                       for (y = 0; y < height; y += 2) {\r
-                               for (x = 0; x < width; x += 2) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = GET(0);\r
-                                               data++;\r
-                                       }\r
-                                       data += components;\r
-                               }\r
-                               data += line;\r
-                       }\r
-       }\r
-       else if (width > 1 && height == 1) {\r
-               if (filter)\r
-                       for (y = 0; y < height; y += 1) {\r
-                               for (x = 0; x < width; x += 2) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = (GET(0)+GET(components)) / 2;\r
-                                               data++;\r
-                                       }\r
-                                       data += components;\r
-                               }\r
-                       }\r
-               else\r
-                       for (y = 0; y < height; y += 1) {\r
-                               for (x = 0; x < width; x += 2) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = GET(0);\r
-                                               data++;\r
-                                       }\r
-                                       data += components;\r
-                               }\r
-                       }\r
-       }\r
-       else if (width == 1 && height > 1) {\r
-               if (filter)\r
-                       for (y = 0; y < height; y += 2) {\r
-                               for (x = 0; x < width; x += 1) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = (GET(0)+GET(line)) / 2;\r
-                                               data++;\r
-                                       }\r
-                               }\r
-                               data += line;\r
-                       }\r
-               else\r
-                       for (y = 0; y < height; y += 2) {\r
-                               for (x = 0; x < width; x += 1) {\r
-                                       for (c = 0; c < components; c++) {\r
-                                               *d++ = GET(0);\r
-                                               data++;\r
-                                       }\r
-                               }\r
-                               data += line;\r
-                       }\r
-       }\r
-       else {\r
-               return 0;\r
-       }\r
-\r
-       return 1;\r
-}\r
-\r
-#undef GET\r
-\r
-/* Replacement for gluBuild2DMipmaps so GLU isn't needed */\r
-static void Build2DMipmaps(GLint components, GLint width, GLint height, GLenum format, const unsigned char *data, int filter) {\r
-       int level = 0;\r
-       unsigned char *d = (unsigned char *) malloc((width/2)*(height/2)*components+4);\r
-       const unsigned char *last = data;\r
-\r
-       glTexImage2D(GL_TEXTURE_2D, level, components, width, height, 0, format, GL_UNSIGNED_BYTE, data);\r
-       level++;\r
-\r
-       while (HalfSize(components, width, height, last, d, filter)) {\r
-               if (width  > 1) width  /= 2;\r
-               if (height > 1) height /= 2;\r
-\r
-               glTexImage2D(GL_TEXTURE_2D, level, components, width, height, 0, format, GL_UNSIGNED_BYTE, d);\r
-               level++;\r
-               last = d;\r
-       }\r
-\r
-       free(d);\r
-}\r
+
+#define GET(o) ((int)*(data + (o)))
+
+static int HalfSize(GLint components, GLint width, GLint height, const unsigned char *data, unsigned char *d, int filter) {
+       int x, y, c;
+       int line = width*components;
+
+       if (width > 1 && height > 1) {
+               if (filter)
+                       for (y = 0; y < height; y += 2) {
+                               for (x = 0; x < width; x += 2) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = (GET(0)+GET(components)+GET(line)+GET(line+components)) / 4;
+                                               data++;
+                                       }
+                                       data += components;
+                               }
+                               data += line;
+                       }
+               else
+                       for (y = 0; y < height; y += 2) {
+                               for (x = 0; x < width; x += 2) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = GET(0);
+                                               data++;
+                                       }
+                                       data += components;
+                               }
+                               data += line;
+                       }
+       }
+       else if (width > 1 && height == 1) {
+               if (filter)
+                       for (y = 0; y < height; y += 1) {
+                               for (x = 0; x < width; x += 2) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = (GET(0)+GET(components)) / 2;
+                                               data++;
+                                       }
+                                       data += components;
+                               }
+                       }
+               else
+                       for (y = 0; y < height; y += 1) {
+                               for (x = 0; x < width; x += 2) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = GET(0);
+                                               data++;
+                                       }
+                                       data += components;
+                               }
+                       }
+       }
+       else if (width == 1 && height > 1) {
+               if (filter)
+                       for (y = 0; y < height; y += 2) {
+                               for (x = 0; x < width; x += 1) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = (GET(0)+GET(line)) / 2;
+                                               data++;
+                                       }
+                               }
+                               data += line;
+                       }
+               else
+                       for (y = 0; y < height; y += 2) {
+                               for (x = 0; x < width; x += 1) {
+                                       for (c = 0; c < components; c++) {
+                                               *d++ = GET(0);
+                                               data++;
+                                       }
+                               }
+                               data += line;
+                       }
+       }
+       else {
+               return 0;
+       }
+
+       return 1;
+}
+
+#undef GET
+
+/* Replacement for gluBuild2DMipmaps so GLU isn't needed */
+static void Build2DMipmaps(GLint components, GLint width, GLint height, GLenum format, const unsigned char *data, int filter) {
+       int level = 0;
+       unsigned char *d = (unsigned char *) malloc((width/2)*(height/2)*components+4);
+       const unsigned char *last = data;
+
+       glTexImage2D(GL_TEXTURE_2D, level, components, width, height, 0, format, GL_UNSIGNED_BYTE, data);
+       level++;
+
+       while (HalfSize(components, width, height, last, d, filter)) {
+               if (width  > 1) width  /= 2;
+               if (height > 1) height /= 2;
+
+               glTexImage2D(GL_TEXTURE_2D, level, components, width, height, 0, format, GL_UNSIGNED_BYTE, d);
+               level++;
+               last = d;
+       }
+
+       free(d);
+}
 
 int APIENTRY pngLoadRaw(const char *filename, pngRawInfo *pinfo) {
        int result;
@@ -277,14 +277,14 @@ int APIENTRY pngLoadRawF(FILE *fp, pngRawInfo *pinfo) {
        info = png_create_info_struct(png);
        endinfo = png_create_info_struct(png);
 
-       // DH: added following lines\r
-       if (setjmp(png->jmpbuf))\r
-       {\r
-               png_destroy_read_struct(&png, &info, &endinfo);\r
-               return 0;\r
-       }\r
-       // ~DH\r
-\r
+       // DH: added following lines
+       if (setjmp(png->jmpbuf))
+       {
+               png_destroy_read_struct(&png, &info, &endinfo);
+               return 0;
+       }
+       // ~DH
+
        png_init_io(png, fp);
        png_set_sig_bytes(png, 8);
        png_read_info(png, info);
@@ -305,13 +305,13 @@ int APIENTRY pngLoadRawF(FILE *fp, pngRawInfo *pinfo) {
 
        data = (png_bytep) malloc(png_get_rowbytes(png, info)*height);
        row_p = (png_bytep *) malloc(sizeof(png_bytep)*height);
-\r
+
        for (i = 0; i < height; i++) {
-               if (StandardOrientation)\r
-                       row_p[height - 1 - i] = &data[png_get_rowbytes(png, info)*i];\r
-               else\r
-                       row_p[i] = &data[png_get_rowbytes(png, info)*i];\r
-       }\r
+               if (StandardOrientation)
+                       row_p[height - 1 - i] = &data[png_get_rowbytes(png, info)*i];
+               else
+                       row_p[i] = &data[png_get_rowbytes(png, info)*i];
+       }
 
        png_read_image(png, row_p);
        free(row_p);
@@ -323,7 +323,7 @@ int APIENTRY pngLoadRawF(FILE *fp, pngRawInfo *pinfo) {
        else {
                pinfo->Palette = NULL;
        }
-\r
+
        if (color&PNG_COLOR_MASK_ALPHA) {
                if (color&PNG_COLOR_MASK_PALETTE || color == PNG_COLOR_TYPE_GRAY_ALPHA)
                        pinfo->Components = 2;
@@ -360,7 +360,7 @@ int APIENTRY pngLoad(const char *filename, int mipmap, int trans, pngInfo *pinfo
 }
 
 int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
-       GLint pack, unpack;\r
+       GLint pack, unpack;
        unsigned char header[8];
        png_structp png;
        png_infop   info;
@@ -381,14 +381,14 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
        info = png_create_info_struct(png);
        endinfo = png_create_info_struct(png);
 
-       // DH: added following lines\r
-       if (setjmp(png->jmpbuf))\r
-       {\r
-               png_destroy_read_struct(&png, &info, &endinfo);\r
-               return 0;\r
-       }\r
-       // ~DH\r
-\r
+       // DH: added following lines
+       if (setjmp(png->jmpbuf))
+       {
+               png_destroy_read_struct(&png, &info, &endinfo);
+               return 0;
+       }
+       // ~DH
+
        png_init_io(png, fp);
        png_set_sig_bytes(png, 8);
        png_read_info(png, info);
@@ -403,23 +403,23 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
        if (MaxTextureSize == 0)
                glGetIntegerv(GL_MAX_TEXTURE_SIZE, &MaxTextureSize);
 
-       #ifdef SUPPORTS_PALETTE_EXT\r
+       #ifdef SUPPORTS_PALETTE_EXT
        #ifdef _WIN32
-               if (PalettedTextures == -1)\r
-                       PalettedTextures = ExtSupported("GL_EXT_paletted_texture") && (strstr((const char *) glGetString(GL_VERSION), "1.1.0 3Dfx Beta") == NULL);\r
-\r
+               if (PalettedTextures == -1)
+                       PalettedTextures = ExtSupported("GL_EXT_paletted_texture") && (strstr((const char *) glGetString(GL_VERSION), "1.1.0 3Dfx Beta") == NULL);
+
                if (PalettedTextures) {
                        if (glColorTableEXT == NULL) {
                                glColorTableEXT = (PFNGLCOLORTABLEEXTPROC) wglGetProcAddress("glColorTableEXT");
                                if (glColorTableEXT == NULL)
                                        PalettedTextures = 0;
                        }
-               }\r
+               }
        #endif
        #endif
-\r
-       if (PalettedTextures == -1)\r
-               PalettedTextures = 0;\r
+
+       if (PalettedTextures == -1)
+               PalettedTextures = 0;
 
        if (color == PNG_COLOR_TYPE_GRAY || color == PNG_COLOR_TYPE_GRAY_ALPHA)
                png_set_gray_to_rgb(png);
@@ -444,13 +444,13 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
 
        data = (png_bytep) malloc(png_get_rowbytes(png, info)*height);
        row_p = (png_bytep *) malloc(sizeof(png_bytep)*height);
-\r
-       for (i = 0; i < height; i++) {\r
+
+       for (i = 0; i < height; i++) {
                if (StandardOrientation)
-                       row_p[height - 1 - i] = &data[png_get_rowbytes(png, info)*i];\r
-               else\r
-                       row_p[i] = &data[png_get_rowbytes(png, info)*i];\r
-       }\r
+                       row_p[height - 1 - i] = &data[png_get_rowbytes(png, info)*i];
+               else
+                       row_p[i] = &data[png_get_rowbytes(png, info)*i];
+       }
 
        png_read_image(png, row_p);
        free(row_p);
@@ -473,12 +473,12 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
                data = data2;
        }
 
-       { /* OpenGL stuff */\r
-               glGetIntegerv(GL_PACK_ALIGNMENT, &pack);\r
-               glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack);\r
-               glPixelStorei(GL_PACK_ALIGNMENT, 1);\r
-               glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\r
-\r
+       { /* OpenGL stuff */
+               glGetIntegerv(GL_PACK_ALIGNMENT, &pack);
+               glGetIntegerv(GL_UNPACK_ALIGNMENT, &unpack);
+               glPixelStorei(GL_PACK_ALIGNMENT, 1);
+               glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
                #ifdef SUPPORTS_PALETTE_EXT
                if (PalettedTextures && mipmap >= 0 && trans == PNG_SOLID && color == PNG_COLOR_TYPE_PALETTE) {
                        png_colorp pal;
@@ -502,8 +502,8 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
                        glColorTableEXT(GL_TEXTURE_2D, GL_RGB8, cols, GL_RGB, GL_UNSIGNED_BYTE, pal);
                        glTexImage2D(GL_TEXTURE_2D, mipmap, intf, width, height, 0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, data);
                }
-               else\r
-               #endif\r
+               else
+               #endif
                if (trans == PNG_SOLID || trans == PNG_ALPHA || color == PNG_COLOR_TYPE_RGB_ALPHA || color == PNG_COLOR_TYPE_GRAY_ALPHA) {
                        GLenum glformat;
                        GLint glcomponent;
@@ -530,8 +530,8 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
                        }
 
                        if (mipmap == PNG_BUILDMIPMAPS)
-                               Build2DMipmaps(glcomponent, width, height, glformat, data, 1);\r
-                       else if (mipmap == PNG_SIMPLEMIPMAPS)\r
+                               Build2DMipmaps(glcomponent, width, height, glformat, data, 1);
+                       else if (mipmap == PNG_SIMPLEMIPMAPS)
                                Build2DMipmaps(glcomponent, width, height, glformat, data, 0);
                        else
                                glTexImage2D(GL_TEXTURE_2D, mipmap, glcomponent, width, height, 0, glformat, GL_UNSIGNED_BYTE, data);
@@ -629,18 +629,18 @@ int APIENTRY pngLoadF(FILE *fp, int mipmap, int trans, pngInfo *pinfo) {
                        #undef FOREND
                        #undef ALPHA
 
-                       if (mipmap == PNG_BUILDMIPMAPS)\r
+                       if (mipmap == PNG_BUILDMIPMAPS)
                                Build2DMipmaps(4, width, height, GL_RGBA, data2, 1);
-                       else if (mipmap == PNG_SIMPLEMIPMAPS)\r
-                               Build2DMipmaps(4, width, height, GL_RGBA, data2, 0);\r
+                       else if (mipmap == PNG_SIMPLEMIPMAPS)
+                               Build2DMipmaps(4, width, height, GL_RGBA, data2, 0);
                        else
                                glTexImage2D(GL_TEXTURE_2D, mipmap, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data2);
 
                        free(data2);
                }
-\r
-               glPixelStorei(GL_PACK_ALIGNMENT, pack);\r
-               glPixelStorei(GL_UNPACK_ALIGNMENT, unpack);\r
+
+               glPixelStorei(GL_PACK_ALIGNMENT, pack);
+               glPixelStorei(GL_UNPACK_ALIGNMENT, unpack);
        } /* OpenGL end */
 
    png_read_end(png, endinfo);
@@ -703,7 +703,7 @@ void APIENTRY pngSetViewingGamma(double viewingGamma) {
                screenGamma = 2.2;
        }
 }
-\r
-void APIENTRY pngSetStandardOrientation(int standardorientation) {\r
-       StandardOrientation = standardorientation;\r
-}\r
+
+void APIENTRY pngSetStandardOrientation(int standardorientation) {
+       StandardOrientation = standardorientation;
+}