2 * Copyright (C) 2003 Robert Kooima
4 * NEVERBALL is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published
6 * by the Free Software Foundation; either version 2 of the License,
7 * or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
24 #include "base_image.h"
27 /*---------------------------------------------------------------------------*/
29 void image_snap(const char *filename)
32 png_structp writep = NULL;
33 png_infop infop = NULL;
34 png_bytep *bytep = NULL;
36 int w = config_get_d(CONFIG_WIDTH);
37 int h = config_get_d(CONFIG_HEIGHT);
40 unsigned char *p = NULL;
42 /* Initialize all PNG export data structures. */
44 if (!(filep = fopen(filename, FMODE_WB)))
46 if (!(writep = png_create_write_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0)))
48 if (!(infop = png_create_info_struct(writep)))
51 /* Enable the default PNG error handler. */
53 if (setjmp(png_jmpbuf(writep)) == 0)
55 /* Initialize the PNG header. */
57 png_init_io (writep, filep);
58 png_set_IHDR(writep, infop, w, h, 8,
61 PNG_COMPRESSION_TYPE_DEFAULT,
62 PNG_FILTER_TYPE_DEFAULT);
64 /* Allocate the pixel buffer and copy pixels there. */
66 if ((p = (unsigned char *) malloc(w * h * 3)))
68 glReadPixels(0, 0, w, h, GL_RGB, GL_UNSIGNED_BYTE, p);
70 /* Allocate and initialize the row pointers. */
72 if ((bytep = (png_bytep *) png_malloc(writep,
73 h * sizeof (png_bytep))))
75 for (i = 0; i < h; ++i)
76 bytep[h - i - 1] = (png_bytep) (p + i * w * 3);
78 png_set_rows (writep, infop, bytep);
80 /* Write the PNG image file. */
82 png_write_info(writep, infop);
83 png_write_png (writep, infop, 0, NULL);
91 /* Release all resources. */
93 png_destroy_write_struct(&writep, &infop);
97 /*---------------------------------------------------------------------------*/
100 * Create an OpenGL texture object using the given image buffer.
102 static GLuint make_texture(const void *p, int w, int h, int b)
104 static const GLenum format[] =
105 { 0, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB, GL_RGBA };
109 /* Scale the image as configured, or to fit the OpenGL limitations. */
111 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
112 int a = config_get_d(CONFIG_ANISO);
114 int m = config_get_d(CONFIG_MIPMAP);
115 int k = config_get_d(CONFIG_TEXTURES);
123 glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
125 while (w / k > (int) max || h / k > (int) max)
129 q = image_scale(p, w, h, b, &W, &H, k);
131 /* Generate and configure a new OpenGL texture. */
133 glGenTextures(1, &o);
134 glBindTexture(GL_TEXTURE_2D, o);
136 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
137 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
140 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
142 #ifdef GL_GENERATE_MIPMAP_SGIS
145 glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP_SGIS, GL_TRUE);
146 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
147 GL_LINEAR_MIPMAP_LINEAR);
150 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
151 if (a) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, a);
154 /* Copy the image to an OpenGL texture. */
156 glTexImage2D(GL_TEXTURE_2D, 0,
158 format[b], GL_UNSIGNED_BYTE, q ? q : p);
167 * Load an image from the named file. Return an OpenGL texture object.
169 GLuint make_image_from_file(const char *filename)
177 /* Load the image. */
179 if ((p = image_load(config_data(filename), &w, &h, &b)))
181 o = make_texture(p, w, h, b);
188 /*---------------------------------------------------------------------------*/
191 * Render the given string using the given font. Transfer the image
192 * to a surface of power-of-2 size large enough to fit the string.
193 * Return an OpenGL texture object.
195 GLuint make_image_from_font(int *W, int *H,
197 const char *text, TTF_Font *font)
201 /* Render the text. */
203 if (text && strlen(text) > 0)
205 SDL_Color col = { 0xFF, 0xFF, 0xFF, 0xFF };
208 if ((src = TTF_RenderUTF8_Blended(font, text, col)))
213 int b = src->format->BitsPerPixel / 8;
215 /* Pad the text to power-of-two. */
217 p = image_next2(src->pixels, src->w, src->h, b, &w2, &h2);
224 /* Saturate the color channels. Modulate ONLY in alpha. */
226 image_white(p, w2, h2, b);
228 /* Create the OpenGL texture object. */
230 o = make_texture(p, w2, h2, b);
233 SDL_FreeSurface(src);
249 /*---------------------------------------------------------------------------*/
252 * Load an image from the named file. Return an SDL surface.
254 SDL_Surface *load_surface(const char *filename)
266 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
278 if ((p = image_load(config_data(filename), &w, &h, &b)))
279 return SDL_CreateRGBSurfaceFrom(p, w, h, b * 8, w * b,
280 rmask, gmask, bmask, amask);
285 /*---------------------------------------------------------------------------*/