diff options
Diffstat (limited to 'src/engine/external/glfw/lib/tga.c')
| -rw-r--r-- | src/engine/external/glfw/lib/tga.c | 405 |
1 files changed, 0 insertions, 405 deletions
diff --git a/src/engine/external/glfw/lib/tga.c b/src/engine/external/glfw/lib/tga.c deleted file mode 100644 index 51e73844..00000000 --- a/src/engine/external/glfw/lib/tga.c +++ /dev/null @@ -1,405 +0,0 @@ -//======================================================================== -// GLFW - An OpenGL framework -// File: tga.c -// Platform: Any -// API version: 2.6 -// WWW: http://glfw.sourceforge.net -//------------------------------------------------------------------------ -// Copyright (c) 2002-2006 Camilla Berglund -// -// This software is provided 'as-is', without any express or implied -// warranty. In no event will the authors be held liable for any damages -// arising from the use of this software. -// -// Permission is granted to anyone to use this software for any purpose, -// including commercial applications, and to alter it and redistribute it -// freely, subject to the following restrictions: -// -// 1. The origin of this software 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 source versions must be plainly marked as such, and must not -// be misrepresented as being the original software. -// -// 3. This notice may not be removed or altered from any source -// distribution. -// -//======================================================================== - -//======================================================================== -// Description: -// -// TGA format image file loader. This module supports version 1 Targa -// images, with these restrictions: -// - Pixel format may only be 8, 24 or 32 bits -// - Colormaps must be no longer than 256 entries -// -//======================================================================== - - -#include "internal.h" - - -//************************************************************************ -//**** GLFW internal functions & declarations **** -//************************************************************************ - -//======================================================================== -// TGA file header information -//======================================================================== - -typedef struct { - int idlen; // 1 byte - int cmaptype; // 1 byte - int imagetype; // 1 byte - int cmapfirstidx; // 2 bytes - int cmaplen; // 2 bytes - int cmapentrysize; // 1 byte - int xorigin; // 2 bytes - int yorigin; // 2 bytes - int width; // 2 bytes - int height; // 2 bytes - int bitsperpixel; // 1 byte - int imageinfo; // 1 byte - int _alphabits; // (derived from imageinfo) - int _origin; // (derived from imageinfo) -} _tga_header_t; - -#define _TGA_CMAPTYPE_NONE 0 -#define _TGA_CMAPTYPE_PRESENT 1 - -#define _TGA_IMAGETYPE_NONE 0 -#define _TGA_IMAGETYPE_CMAP 1 -#define _TGA_IMAGETYPE_TC 2 -#define _TGA_IMAGETYPE_GRAY 3 -#define _TGA_IMAGETYPE_CMAP_RLE 9 -#define _TGA_IMAGETYPE_TC_RLE 10 -#define _TGA_IMAGETYPE_GRAY_RLE 11 - -#define _TGA_IMAGEINFO_ALPHA_MASK 0x0f -#define _TGA_IMAGEINFO_ALPHA_SHIFT 0 -#define _TGA_IMAGEINFO_ORIGIN_MASK 0x30 -#define _TGA_IMAGEINFO_ORIGIN_SHIFT 4 - -#define _TGA_ORIGIN_BL 0 -#define _TGA_ORIGIN_BR 1 -#define _TGA_ORIGIN_UL 2 -#define _TGA_ORIGIN_UR 3 - - -//======================================================================== -// _glfwReadTGAHeader() - Read TGA file header (and check that it is -// valid) -//======================================================================== - -static int _glfwReadTGAHeader( _GLFWstream *s, _tga_header_t *h ) -{ - unsigned char buf[ 18 ]; - int pos; - - // Read TGA file header from file - pos = _glfwTellStream( s ); - _glfwReadStream( s, buf, 18 ); - - // Interpret header (endian independent parsing) - h->idlen = (int) buf[0]; - h->cmaptype = (int) buf[1]; - h->imagetype = (int) buf[2]; - h->cmapfirstidx = (int) buf[3] | (((int) buf[4]) << 8); - h->cmaplen = (int) buf[5] | (((int) buf[6]) << 8); - h->cmapentrysize = (int) buf[7]; - h->xorigin = (int) buf[8] | (((int) buf[9]) << 8); - h->yorigin = (int) buf[10] | (((int) buf[11]) << 8); - h->width = (int) buf[12] | (((int) buf[13]) << 8); - h->height = (int) buf[14] | (((int) buf[15]) << 8); - h->bitsperpixel = (int) buf[16]; - h->imageinfo = (int) buf[17]; - - // Extract alphabits and origin information - h->_alphabits = (int) (h->imageinfo & _TGA_IMAGEINFO_ALPHA_MASK) >> - _TGA_IMAGEINFO_ALPHA_SHIFT; - h->_origin = (int) (h->imageinfo & _TGA_IMAGEINFO_ORIGIN_MASK) >> - _TGA_IMAGEINFO_ORIGIN_SHIFT; - - // Validate TGA header (is this a TGA file?) - if( (h->cmaptype == 0 || h->cmaptype == 1) && - ((h->imagetype >= 1 && h->imagetype <= 3) || - (h->imagetype >= 9 && h->imagetype <= 11)) && - (h->bitsperpixel == 8 || h->bitsperpixel == 24 || - h->bitsperpixel == 32) ) - { - // Skip the ID field - _glfwSeekStream( s, h->idlen, SEEK_CUR ); - - // Indicate that the TGA header was valid - return GL_TRUE; - } - else - { - // Restore file position - _glfwSeekStream( s, pos, SEEK_SET ); - - // Indicate that the TGA header was invalid - return GL_FALSE; - } -} - -//======================================================================== -// _glfwReadTGA_RLE() - Read Run-Length Encoded data -//======================================================================== - -static void _glfwReadTGA_RLE( unsigned char *buf, int size, int bpp, - _GLFWstream *s ) -{ - int repcount, bytes, k, n; - unsigned char pixel[ 4 ]; - char c; - - // Dummy check - if( bpp > 4 ) - { - return; - } - - while( size > 0 ) - { - // Get repetition count - _glfwReadStream( s, &c, 1 ); - repcount = (unsigned int) c; - bytes = ((repcount & 127) + 1) * bpp; - if( size < bytes ) - { - bytes = size; - } - - // Run-Length packet? - if( repcount & 128 ) - { - _glfwReadStream( s, pixel, bpp ); - for( n = 0; n < (repcount & 127) + 1; n ++ ) - { - for( k = 0; k < bpp; k ++ ) - { - *buf ++ = pixel[ k ]; - } - } - } - else - { - // It's a Raw packet - _glfwReadStream( s, buf, bytes ); - buf += bytes; - } - - size -= bytes; - } -} - - -//======================================================================== -// _glfwReadTGA() - Read a TGA image from a file -//======================================================================== - -int _glfwReadTGA( _GLFWstream *s, GLFWimage *img, int flags ) -{ - _tga_header_t h; - unsigned char *cmap, *pix, tmp, *src, *dst; - int cmapsize, pixsize, pixsize2; - int bpp, bpp2, k, m, n, swapx, swapy; - - // Read TGA header - if( !_glfwReadTGAHeader( s, &h ) ) - { - return 0; - } - - // Is there a colormap? - cmapsize = (h.cmaptype == _TGA_CMAPTYPE_PRESENT ? 1 : 0) * h.cmaplen * - ((h.cmapentrysize+7) / 8); - if( cmapsize > 0 ) - { - // Is it a colormap that we can handle? - if( (h.cmapentrysize != 24 && h.cmapentrysize != 32) || - h.cmaplen == 0 || h.cmaplen > 256 ) - { - return 0; - } - - // Allocate memory for colormap - cmap = (unsigned char *) malloc( cmapsize ); - if( cmap == NULL ) - { - return 0; - } - - // Read colormap from file - _glfwReadStream( s, cmap, cmapsize ); - } - else - { - cmap = NULL; - } - - // Size of pixel data - pixsize = h.width * h.height * ((h.bitsperpixel + 7) / 8); - - // Bytes per pixel (pixel data - unexpanded) - bpp = (h.bitsperpixel + 7) / 8; - - // Bytes per pixel (expanded pixels - not colormap indeces) - if( cmap ) - { - bpp2 = (h.cmapentrysize + 7) / 8; - } - else - { - bpp2 = bpp; - } - - // For colormaped images, the RGB/RGBA image data may use more memory - // than the stored pixel data - pixsize2 = h.width * h.height * bpp2; - - // Allocate memory for pixel data - pix = (unsigned char *) malloc( pixsize2 ); - if( pix == NULL ) - { - if( cmap ) - { - free( cmap ); - } - return 0; - } - - // Read pixel data from file - if( h.imagetype >= _TGA_IMAGETYPE_CMAP_RLE ) - { - _glfwReadTGA_RLE( pix, pixsize, bpp, s ); - } - else - { - _glfwReadStream( s, pix, pixsize ); - } - - // If the image origin is not what we want, re-arrange the pixels - switch( h._origin ) - { - default: - case _TGA_ORIGIN_UL: - swapx = 0; - swapy = 1; - break; - - case _TGA_ORIGIN_BL: - swapx = 0; - swapy = 0; - break; - - case _TGA_ORIGIN_UR: - swapx = 1; - swapy = 1; - break; - - case _TGA_ORIGIN_BR: - swapx = 1; - swapy = 0; - break; - } - if( (swapy && !(flags & GLFW_ORIGIN_UL_BIT)) || - (!swapy && (flags & GLFW_ORIGIN_UL_BIT)) ) - { - src = pix; - dst = &pix[ (h.height-1)*h.width*bpp ]; - for( n = 0; n < h.height/2; n ++ ) - { - for( m = 0; m < h.width ; m ++ ) - { - for( k = 0; k < bpp; k ++ ) - { - tmp = *src; - *src ++ = *dst; - *dst ++ = tmp; - } - } - dst -= 2*h.width*bpp; - } - } - if( swapx ) - { - src = pix; - dst = &pix[ (h.width-1)*bpp ]; - for( n = 0; n < h.height; n ++ ) - { - for( m = 0; m < h.width/2 ; m ++ ) - { - for( k = 0; k < bpp; k ++ ) - { - tmp = *src; - *src ++ = *dst; - *dst ++ = tmp; - } - dst -= 2*bpp; - } - src += ((h.width+1)/2)*bpp; - dst += ((3*h.width+1)/2)*bpp; - } - } - - // Convert BGR/BGRA to RGB/RGBA, and optionally colormap indeces to - // RGB/RGBA values - if( cmap ) - { - // Convert colormap pixel format (BGR -> RGB or BGRA -> RGBA) - if( bpp2 == 3 || bpp2 == 4 ) - { - for( n = 0; n < h.cmaplen; n ++ ) - { - tmp = cmap[ n*bpp2 ]; - cmap[ n*bpp2 ] = cmap[ n*bpp2 + 2 ]; - cmap[ n*bpp2 + 2 ] = tmp; - } - } - - // Convert pixel data to RGB/RGBA data - for( m = h.width * h.height - 1; m >= 0; m -- ) - { - n = pix[ m ]; - for( k = 0; k < bpp2; k ++ ) - { - pix[ m*bpp2 + k ] = cmap[ n*bpp2 + k ]; - } - } - - // Free memory for colormap (it's not needed anymore) - free( cmap ); - } - else - { - // Convert image pixel format (BGR -> RGB or BGRA -> RGBA) - if( bpp2 == 3 || bpp2 == 4 ) - { - src = pix; - dst = &pix[ 2 ]; - for( n = 0; n < h.height * h.width; n ++ ) - { - tmp = *src; - *src = *dst; - *dst = tmp; - src += bpp2; - dst += bpp2; - } - } - } - - // Fill out GLFWimage struct (the Format field will be set by - // glfwReadImage) - img->Width = h.width; - img->Height = h.height; - img->BytesPerPixel = bpp2; - img->Data = pix; - - return 1; -} - |