Quote:
* How about some documentation?
Maybe in the future? Is just a class!
Quote:
* Don't put "using namespace std;" in header files! You've polluted the global namespace and defeated the entire purpose of namespaces.
My mistake. Now on .cpp.
Quote:
* What's with TOETexture? Just call it Texture and place it in a namespace. Prefixing class names is generally sort of useless; namespaces do a much better job.
I name all my classes in that way(of this project). I see no problem with that.
Quote:
* You #include <string> but you use C strings for all your function parameters. Why?
I use std::string just for the load method and _fileName attribute. Pass const char* for the other methods because they need to. ifstream just accept const char* as a parameter to open() or constructor. And fopen too. So...
Quote:
* Your public interface has very poor naming conventions. "w()" and "h()" and "bpp()" are terrible names.
This is a texture class. So a texture.w() is a little obvious you don't think? But I can change this. No problem.
( I wrote in that way because I saw in platically all library loaders, they implement member of a struct or method of a class named w or w(), to call image width. )
Quote:
* You don't have a way of selectively disabling the loads I don't want to use. For example, lets say I only want to use the PNG functionality. You should have preprocessor switches I can set to skip the TIFF, et cetera, functionality so I don't have to link with all these extra libraries that I will never use.
I'll fix this.
Quote:
* Why is _OGLfilter a float?
Because void glTexParameterf( GLenum target, GLenum pname, GLfloat param ).
Sure, I can call glTexParameteri(). Humm, ok, changed this. But I do not saw problem.
Quote:
* You handle errors by returning magic numbers. You should really throw exceptions in many of these cases, or at the very least return enumeration values. When I recieve a return code of 4 from readBMP(), I have no idea what it means. This is not useful at all.
Yeah, was thinking in a good way to do that... try - catch()?
Quote:
* Your bitmap handling is pretty restrictive, isn't it? You only support certain bitmap color formats and such. Other types, like TGA, seem equally artificially restricted.
You mean only to support 24/32 bits RGB/BGR compressed or uncompressed formats? I think is enought. I'll not put support here for indexed images. Anybody still use that?
I was thinking in support Greyscale images, but I'm not sure.
Quote:
* You mix C style IO (the JPEG loader) and C++ style IO (the bitmap loader). This has rather negative implications... the overall lack of consistency in the style of the code and the comments suggests this code is based primarily on tutorials or sample code, which implies that its probably not particularly robust.
Because void jpeg_stdio_src(j_decompress_ptr cinfo, FILE * infile); I cannot use fstream here(I thinked in that problem yes, but I have no choice), or can I?
Quote:
* Similarly, you inconsitantly print to stderr, stdout and sometimes not at all. Again, it's probably better just to throw an exception. Printing from a low-level interface like a texture is undesirable.
Forget to throw out these things. Now is clean.
Quote:
* You don't have any way to bind the texture to make it current so it can be used. This essentially renders every texture you load except for the last one useless.
No, was thinking on that functionality too.
Quote:
* load() has a very poor method of extracting the extension that can result in naughty behavior if the string isn't well formed (for example, if the string is less than three characters). This is unstable.
Don't thinked on that. Man, this is why open source is do great! Thanks for that!
The name now must have at least 5 characters.
Quote:
* From a high level perspective, I don't think binding together the texture itself, and the loading of that texture, is good design. Among other issues, it makes for some obnoxious rentrancy issues. For example, right now if I call load() twice, memory is leaked.
Quote:
* In fact, since you don't have a destructor, you leak memory anyway.
I made a fix. Look and tell me what you think.
Thank you man! This was of great help! hummmm your name in credits? :)
HEADER .hpp
/*The Open EngineCopyright (C) 2006 Johnny Birnfeld https://sourceforge.net/projects/theopenengineThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License version 2as published by the Free Software Foundation.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/#ifndef TOE_TEXTURE_H#define TOE_TEXTURE_H#include <string>class TOETexture{ std::string _fileName; int _w; int _h; short int _bpp; unsigned int _id; unsigned char *_data; unsigned long _dataSize; int _OGLfilter; int readBMP( const char* ); int readJPG( const char* ); int readPNG( const char* ); int readTIF( const char* ); int readTGA( const char* ); int readPCX( const char* ); int readDDS( const char* ); int generateTexture(); void* combine( void*, size_t, void*, size_t ); int tgaLoadRawData( unsigned char* ); int tgaLoadRLEData( unsigned char* ); void tgaBGRtoRGB(); void flip(); public: TOETexture(); ~TOETexture(); int load( std::string ); int load( std::string, int ); std::string fileName(); unsigned int width();unsigned int height(); unsigned int bpp(); unsigned int id(); void createInMemoryTexture( void* );};#endif
BODY .cpp
/*The Open EngineCopyright (C) 2006 Johnny Birnfeld https://sourceforge.net/projects/theopenengineThis program is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License version 2as published by the Free Software Foundation.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*/#include "TOETexture.hpp"#include <iostream>#include <fstream>#include <GL/glu.h>extern "C" { #include <jpeglib.h> #include <jerror.h>}#include <png.h>#include <tiffio.h>using namespace std;int TOETexture::readBMP( const char *filename ){ unsigned short int bfType; long int bfOffBits; short int biPlanes; ifstream ifile(filename); if ( !ifile.good() ) return 1; //File not found or corrupted. ifile.read( (char*)&bfType, sizeof(short int) ); if (bfType != 19778){ return 2; //Not a Bitmap-File } ifile.seekg(8, ios::cur); //skip file size and reserved fields of bitmap file header ifile.read( (char*)&bfOffBits, sizeof(long int) ); //get the position of the actual bitmap data ifile.seekg(4, ios::cur); //skip size of bitmap info header ifile.read( (char*)&this->_w, sizeof(int) ); //get the width of the bitmap ifile.read( (char*)&this->_h, sizeof(int) ); //get the heigth of the bitmap ifile.read( (char*)&biPlanes, sizeof(short int) ); //get the number of planes (must be set to 1) if (biPlanes != 1){ return 3; //number of Planes not 1! } ifile.read( (char*)&this->_bpp, sizeof(short int) ); //get the number of bits per pixel if (this->_bpp != 24){ return 4; //Bits per Pixel not 24! } _dataSize = this->_w * this->_h * 3; //calculate the size of the image in bytes _data = new unsigned char[_dataSize]; ifile.seekg(bfOffBits, ios::beg); //seek to the actual data ifile.read( (char*)_data, _dataSize ); //read data //swap red and blue (bgr -> rgb) unsigned char temp; for ( unsigned int i = 0; i < _dataSize; i += 3 ){ temp = _data; _data = _data;<br> _data = temp;<br> }<br> <br> ifile.close();<br> <br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readJPG( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span>* filename ){<br> <br> FILE *file;<br> <span class="cpp-keyword">struct</span> jpeg_decompress_struct cinfo;<br> <span class="cpp-keyword">struct</span> jpeg_error_mgr jerr;<br> <span class="cpp-keyword">volatile</span> JSAMPROW row = <span class="cpp-number">0</span>;<br> JSAMPROW rowptr[<span class="cpp-number">1</span>];<br> uint i,j,nrows;<br> <br> cinfo.err = jpeg_std_error(&jerr);<br> jpeg_create_decompress(&cinfo);<br><br> <span class="cpp-comment">/* make sure the file is there and open it read-only (binary) */</span><br> <span class="cpp-keyword">if</span> ((file = fopen(filename, <span class="cpp-literal">"rb"</span>)) == NULL){<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>; <span class="cpp-comment">//File not found.</span><br> }<br> jpeg_stdio_src(&cinfo, file);<br> jpeg_read_header(&cinfo, <span class="cpp-keyword">true</span>);<br> jpeg_start_decompress(&cinfo);<br> <br> <span class="cpp-keyword">this</span>->_w = cinfo.output_width;<br> <span class="cpp-keyword">this</span>->_h = cinfo.output_height;<br> <span class="cpp-keyword">this</span>->_bpp = cinfo.jpeg_color_space*<span class="cpp-number">8</span>; <span class="cpp-comment">//JPEG images do not handle alpha channel.</span><br> <br> row = (JSAMPROW)calloc(<span class="cpp-number">1</span>,cinfo.image_width * cinfo.output_components<br> * <span class="cpp-keyword">sizeof</span>(JSAMPLE));<br> <br> _dataSize = cinfo.image_width * cinfo.image_height * cinfo.output_components * <span class="cpp-keyword">sizeof</span>(JSAMPLE);<br> _data = (<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>*)malloc(_dataSize);<br> rowptr[<span class="cpp-number">0</span>] = row;<br> <br> <span class="cpp-keyword">for</span> ( i = <span class="cpp-number">0</span>; i < cinfo.output_height; i++ ) {<br> nrows = jpeg_read_scanlines(&cinfo, rowptr, <span class="cpp-number">1</span>);<br> <span class="cpp-keyword">if</span> (nrows != <span class="cpp-number">1</span>) {<br> <span class="cpp-keyword">return</span> <span class="cpp-number">5</span>;<br> }<br> <br> <span class="cpp-keyword">for</span> ( j = <span class="cpp-number">0</span>; j < cinfo.output_width*cinfo.output_components; j++ )<br> _data[(cinfo.output_height-<span class="cpp-number">1</span>-i)*cinfo.output_width*cinfo.output_components+j] = row[j];<br> <br> }<br> <br> jpeg_finish_decompress(&cinfo);<br> jpeg_destroy_decompress(&cinfo);<br> free(row);<br> <br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readPNG( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span>* filename ){<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> y;<br> <br> png_structp png_ptr;<br> png_infop info_ptr;<br> <span class="cpp-keyword">int</span> number_of_passes;<br> png_bytep * row_pointers;<br> <br> <span class="cpp-keyword">char</span> header[<span class="cpp-number">8</span>]; <span class="cpp-comment">// 8 is the maximum size that can be checked</span><br> <br> <span class="cpp-comment">/* open file and test for it being a png */</span><br> FILE *fp = fopen(filename, <span class="cpp-literal">"rb"</span>);<br> <span class="cpp-keyword">if</span> (!fp)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>; <span class="cpp-comment">//File not found</span><br> fread(header, <span class="cpp-number">1</span>, <span class="cpp-number">8</span>, fp);<br> <span class="cpp-keyword">if</span> (png_sig_cmp((png_byte*)header, <span class="cpp-number">0</span>, <span class="cpp-number">8</span>))<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>; <span class="cpp-comment">//Not a valid file</span><br> <br> <span class="cpp-comment">/* initialize stuff */</span><br> png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);<br> <br> <span class="cpp-keyword">if</span> (!png_ptr)<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>; <span class="cpp-comment">//png_create_read_struct failed</span><br> <br> info_ptr = png_create_info_struct(png_ptr);<br> <span class="cpp-keyword">if</span> (!info_ptr)<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>; <span class="cpp-comment">//png_create_info_struct failed</span><br> <br> <span class="cpp-keyword">if</span> (setjmp(png_jmpbuf(png_ptr)))<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>; <span class="cpp-comment">//Error during init_io</span><br> <br> png_init_io(png_ptr, fp);<br> png_set_sig_bytes(png_ptr, <span class="cpp-number">8</span>);<br> <br> png_read_info(png_ptr, info_ptr);<br> <br> number_of_passes = png_set_interlace_handling(png_ptr);<br> png_read_update_info(png_ptr, info_ptr);<br> <br> <span class="cpp-comment">/* read file */</span><br> <span class="cpp-keyword">if</span> (setjmp(png_jmpbuf(png_ptr)))<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>; <span class="cpp-comment">//Error during read_image</span><br> <br> row_pointers = (png_bytep*) malloc(<span class="cpp-keyword">sizeof</span>(png_bytep) * info_ptr->height);<br> <span class="cpp-keyword">for</span> ( y=<span class="cpp-number">0</span>; y<info_ptr->height; y++ )<br> row_pointers[y] = (png_byte*) malloc(info_ptr->rowbytes);<br> <br> png_read_image(png_ptr, row_pointers);<br> <br> <br> <br> <span class="cpp-keyword">this</span>->_w = info_ptr->width;<br> <span class="cpp-keyword">this</span>->_h = info_ptr->height;<br> <span class="cpp-keyword">this</span>->_bpp = info_ptr->bit_depth;<br> <span class="cpp-keyword">if</span> ( info_ptr->color_type == PNG_COLOR_TYPE_RGBA ){<br> <span class="cpp-keyword">this</span>->_bpp *= <span class="cpp-number">4</span>;<br> }<span class="cpp-keyword">else</span>{<br> <span class="cpp-keyword">if</span> ( info_ptr->color_type == PNG_COLOR_TYPE_RGB ){<br> <span class="cpp-keyword">this</span>->_bpp *= <span class="cpp-number">3</span>;<br> }<span class="cpp-keyword">else</span>{<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> }<br> }<br> _dataSize = <span class="cpp-keyword">this</span>->_h * info_ptr->rowbytes;<br> _data = <span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[_dataSize];<br> <br> <span class="cpp-keyword">int</span> tszdata=<span class="cpp-number">0</span>;<br> <span class="cpp-keyword">for</span> ( <span class="cpp-keyword">int</span> c=<span class="cpp-number">0</span>; c<<span class="cpp-keyword">this</span>->_h; c++ ){<br> _data = (<span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>*)combine( _data, tszdata, row_pointers[c], info_ptr->rowbytes );<br> tszdata += info_ptr->rowbytes;<br> }<br> <br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <br> <br> <br> <span class="cpp-comment">/* finish decompression and release memory */</span><br> png_read_end (png_ptr, NULL);<br> png_destroy_read_struct (&png_ptr, &info_ptr, NULL);<br> <span class="cpp-comment">/* we don't need row pointers anymore */</span><br> free (row_pointers);<br> <br> fclose(fp);<br> <span class="cpp-comment">//Done reading .png file</span><br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readTIF( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span> *filename ){<br> TIFFRGBAImage img;<br> uint32 *raster;<br> size_t npixels;<br> <br> TIFF *tif;<br> <span class="cpp-keyword">char</span> emsg[<span class="cpp-number">1024</span>];<br> tif = TIFFOpen(filename, <span class="cpp-literal">"r"</span>);<br> <span class="cpp-keyword">if</span> (tif == NULL) {<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br> }<br> <span class="cpp-keyword">if</span> ( TIFFRGBAImageBegin( &img, tif, <span class="cpp-number">0</span>, emsg ) ){<br> npixels = img.width * img.height;<br> raster = (uint32 *) _TIFFmalloc(npixels * <span class="cpp-comment">/*img.samplesperpixel*/</span><span class="cpp-keyword">sizeof</span>(uint32));<br> <span class="cpp-keyword">if</span> (raster != NULL) {<br> <span class="cpp-keyword">if</span> (TIFFRGBAImageGet(&img, raster, img.width, img.height) == <span class="cpp-number">0</span>) {<br> TIFFError(filename, emsg);<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> }<br> }<br> TIFFRGBAImageEnd(&img);<br> }<span class="cpp-keyword">else</span>{<br> TIFFError(filename, emsg);<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> }<br> <br> <span class="cpp-keyword">this</span>->_w = img.width;<br> <span class="cpp-keyword">this</span>->_h = img.height;<br> <span class="cpp-keyword">this</span>->_bpp = <span class="cpp-number">32</span><span class="cpp-comment">/*img.bitspersample * img.samplesperpixel*/</span>;<br> _dataSize = <span class="cpp-keyword">this</span>->_w * <span class="cpp-keyword">this</span>->_h * <span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>;<br> _data = <span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[_dataSize];<br> memcpy( _data, raster, _dataSize );<br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <br> TIFFClose(tif);<br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readTGA( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span> *filename ){<br> <br> ifstream ifile;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">long</span> fileSize;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *pData;<br> <span class="cpp-keyword">char</span> bEnc;<br> <br> ifile.open( filename,ios::binary );<br> <span class="cpp-keyword">if</span>(ifile==NULL)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br> <br> <span class="cpp-comment">// Get file size</span><br> ifile.seekg(<span class="cpp-number">0</span>,ios_base::end);<br> fileSize=ifile.tellg();<br> ifile.seekg(<span class="cpp-number">0</span>,ios_base::beg);<br> <br> pData = <span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[fileSize];<br> <span class="cpp-keyword">if</span>(pData==NULL){<br> ifile.close();<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> }<br> <br> <span class="cpp-comment">// Read the file into memory</span><br> ifile.read((<span class="cpp-keyword">char</span>*)pData,fileSize);<br> ifile.close();<br> <br> <br> <span class="cpp-comment">//Read Header</span><br> <span class="cpp-keyword">short</span> ColMapStart,ColMapLen;<br> <span class="cpp-keyword">short</span> x1,y1,x2,y2;<br> <br> <span class="cpp-keyword">if</span>( pData[<span class="cpp-number">1</span>] > <span class="cpp-number">1</span> ) <span class="cpp-comment">// 0 (RGB) and 1 (Indexed) are the only types we know about</span><br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>; <span class="cpp-comment">//Not a TGA file, or not supported format.</span><br> <br> bEnc = pData[<span class="cpp-number">2</span>]; <span class="cpp-comment">// Encoding flag 1 = Raw indexed image</span><br> <span class="cpp-comment">// 2 = Raw RGB</span><br> <span class="cpp-comment">// 3 = Raw greyscale</span><br> <span class="cpp-comment">// 9 = RLE indexed</span><br> <span class="cpp-comment">// 10 = RLE RGB</span><br> <span class="cpp-comment">// 11 = RLE greyscale</span><br> <span class="cpp-comment">// 32 & 33 Other compression, indexed</span><br> <br> <span class="cpp-keyword">if</span>( bEnc > <span class="cpp-number">11</span> or bEnc == <span class="cpp-number">1</span> or bEnc == <span class="cpp-number">9</span> ) <span class="cpp-comment">// We don't want 32 or 33. And engine does not read indexed images too.</span><br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <br> <span class="cpp-comment">// Get palette info</span><br> memcpy(&ColMapStart,&pData[<span class="cpp-number">3</span>],<span class="cpp-number">2</span>);<br> memcpy(&ColMapLen,&pData[<span class="cpp-number">5</span>],<span class="cpp-number">2</span>);<br> <br> <span class="cpp-comment">// Reject indexed images if not a VGA palette (256 entries with 24 bits per entry)</span><br> <span class="cpp-keyword">if</span>(pData[<span class="cpp-number">1</span>]==<span class="cpp-number">1</span>) <span class="cpp-comment">// Indexed</span><br> {<br> <span class="cpp-keyword">if</span>(ColMapStart!=<span class="cpp-number">0</span> || ColMapLen!=<span class="cpp-number">256</span> || pData[<span class="cpp-number">7</span>]!=<span class="cpp-number">24</span>)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> }<br> <br> <span class="cpp-comment">// Get image window and produce width & height values</span><br> memcpy(&x1,&pData[<span class="cpp-number">8</span>],<span class="cpp-number">2</span>);<br> memcpy(&y1,&pData[<span class="cpp-number">10</span>],<span class="cpp-number">2</span>);<br> memcpy(&x2,&pData[<span class="cpp-number">12</span>],<span class="cpp-number">2</span>);<br> memcpy(&y2,&pData[<span class="cpp-number">14</span>],<span class="cpp-number">2</span>);<br> <br> <span class="cpp-keyword">this</span>->_w = (x2-x1);<br> <span class="cpp-keyword">this</span>->_h = (y2-y1);<br> <br> <span class="cpp-keyword">if</span>(<span class="cpp-keyword">this</span>->_w<<span class="cpp-number">1</span> || <span class="cpp-keyword">this</span>->_h<<span class="cpp-number">1</span>)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <span class="cpp-comment">// Bits per Pixel</span><br> <span class="cpp-keyword">this</span>->_bpp = pData[<span class="cpp-number">16</span>];<br> <br> <span class="cpp-comment">// Check flip / interleave byte</span><br> <span class="cpp-keyword">if</span>(pData[<span class="cpp-number">17</span>]><span class="cpp-number">32</span>) <span class="cpp-comment">// Interleaved data</span><br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <span class="cpp-comment">// Calculate image size</span><br> <span class="cpp-keyword">this</span>->_dataSize=(<span class="cpp-keyword">this</span>->_w * <span class="cpp-keyword">this</span>->_h * (<span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>));<br> <span class="cpp-comment">//Read Header</span><br> <br> <br> <span class="cpp-keyword">switch</span>(bEnc)<br> {<br> <span class="cpp-keyword">case</span> <span class="cpp-number">2</span>: <span class="cpp-comment">// Raw RGB</span><br> {<br> <span class="cpp-comment">// Check filesize against header values</span><br> <span class="cpp-keyword">if</span>((<span class="cpp-keyword">this</span>->_dataSize+<span class="cpp-number">18</span>+pData[<span class="cpp-number">0</span>])>fileSize)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <span class="cpp-comment">// Double check image type field</span><br> <span class="cpp-keyword">if</span>(pData[<span class="cpp-number">1</span>]!=<span class="cpp-number">0</span>)<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <span class="cpp-comment">// Load image data</span><br> <span class="cpp-keyword">if</span>( tgaLoadRawData( pData )!=<span class="cpp-number">0</span> )<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> <br> tgaBGRtoRGB(); <span class="cpp-comment">// Convert to RGB</span><br> <span class="cpp-keyword">break</span>;<br> }<br> <br> <span class="cpp-keyword">case</span> <span class="cpp-number">10</span>: <span class="cpp-comment">// RLE RGB</span><br> {<br> <span class="cpp-comment">// Double check image type field</span><br> <span class="cpp-keyword">if</span>( pData[<span class="cpp-number">1</span>] != <span class="cpp-number">0</span> )<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> <br> <span class="cpp-comment">// Load image data</span><br> <span class="cpp-keyword">if</span>( tgaLoadRLEData( pData ) != <span class="cpp-number">0</span> )<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> <br> tgaBGRtoRGB(); <span class="cpp-comment">// Convert to RGB</span><br> <span class="cpp-keyword">break</span>;<br> }<br> <br> <span class="cpp-keyword">default</span>:<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> }<br> <br> <span class="cpp-comment">// Check flip bit</span><br> <span class="cpp-comment">//if((pData[17] & 0x20)==0){</span><br> <span class="cpp-comment">// flip();</span><br> <span class="cpp-comment">//}</span><br> <br> <span class="cpp-comment">// Release file memory</span><br> <span class="cpp-keyword">delete</span> [] pData;<br> pData = NULL;<br> <br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readPCX( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span> *filename ){<br> <br> <span class="cpp-keyword">struct</span> PCXheader {<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Manufacturer;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Version;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Encoding;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> BitsPerPixel;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> Xmin, Ymin, Xmax, Ymax;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> HDpi, VDpi;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Colormap[<span class="cpp-number">48</span>];<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Reserved;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> NPlanes;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> BytesPerLine;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> PaletteInfo;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> HscreenSize;<br> <span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> VscreenSize;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> Filler[<span class="cpp-number">54</span>];<br> };<br> <br> <span class="cpp-keyword">struct</span> PCXheader pcxh;<br> <span class="cpp-keyword">int</span> bpl;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *row, *buf = NULL;<br> <br> ifstream ifile(filename);<br> <span class="cpp-keyword">if</span> ( !ifile.good() ){<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br> }<br> <br> ifile.read( (<span class="cpp-keyword">char</span>*)&pcxh, <span class="cpp-keyword">sizeof</span>(pcxh) );<br> <br> <span class="cpp-keyword">this</span>->_w = (pcxh.Xmax - pcxh.Xmin) + <span class="cpp-number">1</span>;<br> <span class="cpp-keyword">this</span>->_h = (pcxh.Ymax - pcxh.Ymin) + <span class="cpp-number">1</span>;<br> <span class="cpp-keyword">this</span>->_bpp = pcxh.BitsPerPixel * pcxh.NPlanes;<br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_bpp != <span class="cpp-number">24</span> ){<br> ifile.close();<br> <span class="cpp-keyword">return</span> <span class="cpp-number">2</span>;<br> }<br> <br> <span class="cpp-keyword">this</span>->_dataSize = <span class="cpp-keyword">this</span>->_w*<span class="cpp-keyword">this</span>->_h*(<span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>);<br> <span class="cpp-keyword">this</span>->_data = <span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[<span class="cpp-keyword">this</span>->_dataSize];<br> <br> <br> bpl = pcxh.NPlanes * pcxh.BytesPerLine;<br> buf = <span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[bpl];<br> row = <span class="cpp-keyword">this</span>->_data;<br> <span class="cpp-keyword">for</span> ( <span class="cpp-keyword">int</span> y=<span class="cpp-number">0</span>; y<<span class="cpp-keyword">this</span>->_h; ++y ) {<br> <span class="cpp-comment">/* decode a scan line to a temporary buffer first */</span><br> <span class="cpp-keyword">int</span> i, count = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> ch;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *dst = buf;<br> <span class="cpp-keyword">for</span>(i = <span class="cpp-number">0</span>; i < bpl; i++) {<br> <span class="cpp-keyword">if</span>(!count) {<br> ifile.read( (<span class="cpp-keyword">char</span>*)&ch, <span class="cpp-number">1</span> );<br> <span class="cpp-keyword">if</span>( (ch & 0xc0) == 0xc0) {<br> count = ch & 0x3f;<br> ifile.read( (<span class="cpp-keyword">char</span>*)&ch, <span class="cpp-number">1</span> );<br> } <span class="cpp-keyword">else</span><br> count = <span class="cpp-number">1</span>;<br> }<br> dst<span style="font-weight:bold;"> = ch;<br> count–;<br> }<br> <br> <span class="cpp-comment">/* de-interlace planes */</span><br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *src = buf;<br> <span class="cpp-keyword">int</span> plane;<br> <span class="cpp-keyword">for</span>(plane = <span class="cpp-number">0</span>; plane < pcxh.NPlanes; plane++){<br> <span class="cpp-keyword">int</span> x;<br> dst = row + plane;<br> <span class="cpp-keyword">for</span>(x = <span class="cpp-number">0</span>; x < <span class="cpp-keyword">this</span>->_w; x++) {<br> *dst = *src++;<br> dst += pcxh.NPlanes;<br> }<br> }<br> row += <span class="cpp-keyword">this</span>->_dataSize/<span class="cpp-keyword">this</span>->_h;<br> }<br> <span class="cpp-keyword">delete</span>[] buf;<br> ifile.close();<br> <br> flip();<br> <br> <span class="cpp-keyword">this</span>->_fileName = filename;<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::readDDS( <span class="cpp-keyword">const</span> <span class="cpp-keyword">char</span> *filename ){<br> <span class="cpp-keyword">return</span> <span class="cpp-number">1</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::generateTexture(){<br> <br> glGenTextures( <span class="cpp-number">1</span>, &<span class="cpp-keyword">this</span>->_id );<br> glBindTexture( GL_TEXTURE_2D, <span class="cpp-keyword">this</span>->_id );<br> <br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_OGLfilter == GL_NEAREST ){ <span class="cpp-comment">//NORMAL</span><br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_bpp != <span class="cpp-number">32</span> ){ <span class="cpp-comment">//image does not have alpha channel</span><br> glTexImage2D( GL_TEXTURE_2D, <span class="cpp-number">0</span>, <span class="cpp-number">3</span>,<br> <span class="cpp-keyword">this</span>->_w, <span class="cpp-keyword">this</span>->_h,<br> <span class="cpp-number">0</span>, GL_RGB, GL_UNSIGNED_BYTE,<br> _data );<br> }<span class="cpp-keyword">else</span>{<br> glTexImage2D( GL_TEXTURE_2D, <span class="cpp-number">0</span>, <span class="cpp-number">4</span>,<br> <span class="cpp-keyword">this</span>->_w, <span class="cpp-keyword">this</span>->_h,<br> <span class="cpp-number">0</span>, GL_RGBA, GL_UNSIGNED_BYTE,<br> _data );<br> }<br> }<span class="cpp-keyword">else</span>{ <span class="cpp-comment">//MIPMAP</span><br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_bpp != <span class="cpp-number">32</span> ){ <span class="cpp-comment">//image does not have alpha channel</span><br> gluBuild2DMipmaps(GL_TEXTURE_2D, <span class="cpp-number">3</span>,<br> <span class="cpp-keyword">this</span>->_w, <span class="cpp-keyword">this</span>->_h,<br> GL_RGB, GL_UNSIGNED_BYTE,<br> _data);<br> }<span class="cpp-keyword">else</span>{<br> gluBuild2DMipmaps(GL_TEXTURE_2D, <span class="cpp-number">4</span>,<br> <span class="cpp-keyword">this</span>->_w, <span class="cpp-keyword">this</span>->_h,<br> GL_RGBA, GL_UNSIGNED_BYTE,<br> _data);<br> }<br> <br> }<br> <br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_OGLfilter == GL_NEAREST ){<br> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br> }<span class="cpp-keyword">else</span>{<br> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);<br> }<br> glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, <span class="cpp-keyword">this</span>->_OGLfilter);<br> <br> glBindTexture( GL_TEXTURE_2D, <span class="cpp-number">0</span> ); <span class="cpp-comment">//Unbind current texture.</span><br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">void</span>* TOETexture::combine (<span class="cpp-keyword">void</span> *o1, size_t s1, <span class="cpp-keyword">void</span> *o2, size_t s2){<br> <span class="cpp-keyword">void</span> *result = malloc(s1 + s2);<br> <span class="cpp-keyword">if</span> (result != NULL)<br> mempcpy(mempcpy(result, o2, s2), o1, s1);<br> <span class="cpp-keyword">return</span> result;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::tgaLoadRawData( <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>* ppData ) <span class="cpp-comment">// Load uncompressed image data</span><br>{<br> <span class="cpp-keyword">short</span> iOffset;<br> <br> <span class="cpp-keyword">this</span>->_data=<span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[<span class="cpp-keyword">this</span>->_dataSize];<br> <br> <span class="cpp-keyword">if</span>(<span class="cpp-keyword">this</span>->_data==NULL)<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> <br> iOffset = ppData[<span class="cpp-number">0</span>]+<span class="cpp-number">18</span>; <span class="cpp-comment">// Add header to ident field size</span><br> <br> <span class="cpp-keyword">if</span>(ppData[<span class="cpp-number">1</span>]==<span class="cpp-number">1</span>) <span class="cpp-comment">// Indexed images</span><br> iOffset+=<span class="cpp-number">768</span>; <span class="cpp-comment">// Add palette offset</span><br> <br> memcpy(<span class="cpp-keyword">this</span>->_data,&ppData[iOffset],<span class="cpp-keyword">this</span>->_dataSize);<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::tgaLoadRLEData( <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>* ppData ) <span class="cpp-comment">// Load RLE compressed image data</span><br>{<br> <span class="cpp-keyword">short</span> iOffset,iPixelSize;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *pCur;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">long</span> Index=<span class="cpp-number">0</span>;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> bLength,bLoop;<br> <br> <span class="cpp-comment">// Calculate offset to image data</span><br> iOffset=ppData[<span class="cpp-number">0</span>]+<span class="cpp-number">18</span>;<br> <br> <span class="cpp-comment">// Add palette offset for indexed images</span><br> <span class="cpp-keyword">if</span>(ppData[<span class="cpp-number">1</span>]==<span class="cpp-number">1</span>)<br> iOffset+=<span class="cpp-number">768</span>; <br> <br> <span class="cpp-comment">// Get pixel size in bytes</span><br> iPixelSize=<span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>;<br> <br> <span class="cpp-comment">// Set our pointer to the beginning of the image data</span><br> pCur=&ppData[iOffset];<br> <br> <span class="cpp-comment">// Allocate space for the image data</span><br> <span class="cpp-keyword">this</span>->_data=<span class="cpp-keyword">new</span> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span>[<span class="cpp-keyword">this</span>->_dataSize];<br> <br> <span class="cpp-keyword">if</span>(<span class="cpp-keyword">this</span>->_data==NULL)<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">1</span>;<br> <br> <span class="cpp-comment">// Decode</span><br> <span class="cpp-keyword">while</span>(Index<<span class="cpp-keyword">this</span>->_dataSize) <br> {<br> <span class="cpp-keyword">if</span>(*pCur & 0x80) <span class="cpp-comment">// Run length chunk (High bit = 1)</span><br> {<br> bLength=*pCur-<span class="cpp-number">127</span>; <span class="cpp-comment">// Get run length</span><br> pCur++; <span class="cpp-comment">// Move to pixel data </span><br> <br> <span class="cpp-comment">// Repeat the next pixel bLength times</span><br> <span class="cpp-keyword">for</span>(bLoop=<span class="cpp-number">0</span>;bLoop!=bLength;++bLoop,Index+=iPixelSize)<br> memcpy(&<span class="cpp-keyword">this</span>->_data[Index],pCur,iPixelSize);<br> <br> pCur+=iPixelSize; <span class="cpp-comment">// Move to the next descriptor chunk</span><br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-comment">// Raw chunk</span><br> {<br> bLength=*pCur+<span class="cpp-number">1</span>; <span class="cpp-comment">// Get run length</span><br> pCur++; <span class="cpp-comment">// Move to pixel data</span><br> <br> <span class="cpp-comment">// Write the next bLength pixels directly</span><br> <span class="cpp-keyword">for</span>(bLoop=<span class="cpp-number">0</span>;bLoop!=bLength;++bLoop,Index+=iPixelSize,pCur+=iPixelSize)<br> memcpy(&<span class="cpp-keyword">this</span>->_data[Index],pCur,iPixelSize);<br> }<br> }<br> <br> <span class="cpp-keyword">return</span> <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">void</span> TOETexture::tgaBGRtoRGB() <span class="cpp-comment">// Convert BGR to RGB (or back again)</span><br>{<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">long</span> Index,nPixels;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *bCur;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> bTemp;<br> <span class="cpp-keyword">short</span> iPixelSize;<br> <br> <span class="cpp-comment">// Set ptr to start of image</span><br> bCur = <span class="cpp-keyword">this</span>->_data;<br> <br> <span class="cpp-comment">// Calc number of pixels</span><br> nPixels = <span class="cpp-keyword">this</span>->_w*<span class="cpp-keyword">this</span>->_h;<br> <br> <span class="cpp-comment">// Get pixel size in bytes</span><br> iPixelSize = <span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>;<br> <br> <span class="cpp-keyword">for</span>(Index=<span class="cpp-number">0</span>;Index!=nPixels;Index++) <span class="cpp-comment">// For each pixel</span><br> {<br> bTemp=*bCur; <span class="cpp-comment">// Get Blue value</span><br> *bCur=*(bCur+<span class="cpp-number">2</span>); <span class="cpp-comment">// Swap red value into first position</span><br> *(bCur+<span class="cpp-number">2</span>)=bTemp; <span class="cpp-comment">// Write back blue to last position</span><br> <br> bCur+=iPixelSize; <span class="cpp-comment">// Jump to next pixel</span><br> }<br> <br>}<br><br><span class="cpp-keyword">void</span> TOETexture::flip( ) <span class="cpp-comment">// Flips the image vertically (Why store images upside down?)</span><br>{<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> bTemp;<br> <span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">char</span> *pLine1, *pLine2;<br> <span class="cpp-keyword">int</span> iLineLen,iIndex;<br> <br> iLineLen=<span class="cpp-keyword">this</span>->_w*(<span class="cpp-keyword">this</span>->_bpp/<span class="cpp-number">8</span>);<br> pLine1=<span class="cpp-keyword">this</span>->_data;<br> pLine2=&<span class="cpp-keyword">this</span>->_data[iLineLen * (<span class="cpp-keyword">this</span>->_h - <span class="cpp-number">1</span>)];<br> <br> <span class="cpp-keyword">for</span>( ;pLine1<pLine2;pLine2-=(iLineLen*<span class="cpp-number">2</span>))<br> {<br> <span class="cpp-keyword">for</span>(iIndex=<span class="cpp-number">0</span>;iIndex!=iLineLen;pLine1++,pLine2++,iIndex++)<br> {<br> bTemp=*pLine1;<br> *pLine1=*pLine2;<br> *pLine2=bTemp;<br> }<br> }<br> <br>}<br><br><br><br><br><br><br><br><span class="cpp-comment">///public methods</span><br>TOETexture::TOETexture(){<br> <span class="cpp-keyword">this</span>->_fileName = <span class="cpp-literal">""</span>;<br> <span class="cpp-keyword">this</span>->_w = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_h = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_bpp = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_id = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_data = NULL;<br> <span class="cpp-keyword">this</span>->_dataSize = <span class="cpp-number">0</span>;<br> <br> <span class="cpp-keyword">this</span>->_OGLfilter = GL_LINEAR_MIPMAP_LINEAR; <span class="cpp-comment">//Default value to the texture filter(Trilinear).</span><br>}<br><br>TOETexture::~TOETexture(){<br> <span class="cpp-keyword">delete</span>[] <span class="cpp-keyword">this</span>->_data;<br> <br> <span class="cpp-keyword">this</span>->_fileName = <span class="cpp-literal">""</span>;<br> <span class="cpp-keyword">this</span>->_w = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_h = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_bpp = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_id = <span class="cpp-number">0</span>;<br> <span class="cpp-keyword">this</span>->_data = NULL;<br> <span class="cpp-keyword">this</span>->_dataSize = <span class="cpp-number">0</span>;<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::load( string filename ){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->load( filename, <span class="cpp-keyword">this</span>->_OGLfilter );<br>}<br><br><span class="cpp-keyword">int</span> TOETexture::load( string filename, <span class="cpp-keyword">int</span> filterToUse ){<br> <span class="cpp-keyword">if</span> ( filename.length() < <span class="cpp-number">5</span> ){<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Filename is too short!"</span> << endl;<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">2</span>;<br> }<br> <span class="cpp-keyword">if</span> ( <span class="cpp-keyword">this</span>->_data ){<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". File is already loaded! Will not load twice."</span> << endl;<br> <span class="cpp-keyword">return</span> -<span class="cpp-number">3</span>;<br> }<br> <br> <span class="cpp-keyword">this</span>->_OGLfilter = filterToUse;<br> <span class="cpp-keyword">int</span> returnValue = <span class="cpp-number">0</span>;<br> string ext = filename.substr( filename.length()-<span class="cpp-number">3</span>, filename.length()-<span class="cpp-number">1</span> );<br> string extl = filename.substr( filename.length()-<span class="cpp-number">4</span>, filename.length()-<span class="cpp-number">1</span> );<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"bmp"</span> ){<br> returnValue = readBMP( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"jpg"</span> or extl == <span class="cpp-literal">"jpeg"</span> ){<br> returnValue = readJPG( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"png"</span> ){<br> returnValue = readPNG( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"tif"</span> or extl == <span class="cpp-literal">"tiff"</span> ){<br> returnValue = readTIF( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"tga"</span> ){<br> returnValue = readTGA( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"pcx"</span> ){<br> returnValue = readPCX( filename.c_str() );<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">if</span> ( ext == <span class="cpp-literal">"dds"</span> ){<br> returnValue = readDDS( filename.c_str() );<br> cout << <span class="cpp-literal">"INFO: "</span> << <span class="cpp-keyword">this</span>->_w << endl;<br> cout << <span class="cpp-literal">"INFO: "</span> << <span class="cpp-keyword">this</span>->_h << endl;<br> cout << <span class="cpp-literal">"INFO: "</span> << <span class="cpp-keyword">this</span>->_bpp << endl;<br> cout << <span class="cpp-literal">"INFO: "</span> << <span class="cpp-keyword">this</span>->_fileName << endl;<br> <span class="cpp-keyword">if</span> ( returnValue == <span class="cpp-number">0</span> ){<br> returnValue = generateTexture();<br> }<br> }<br> <br> <span class="cpp-keyword">switch</span>( returnValue ){<br> <span class="cpp-keyword">case</span> -<span class="cpp-number">1</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Internal error reading image."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">1</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". File not found."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">2</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Unexpected file format. Wrong extension?"</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">3</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Number of Planes not 1."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">4</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Unexpected bits per pixel."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">5</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Unexpected number of rows."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> <span class="cpp-keyword">case</span> <span class="cpp-number">50</span>:<br> cout << <span class="cpp-literal">"Error loading "</span> << filename << <span class="cpp-literal">". Could not generate texture."</span> << endl;<br> <span class="cpp-keyword">break</span>;<br> }<br> <br> <span class="cpp-keyword">return</span> returnValue;<br>}<br><br>string TOETexture::fileName(){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->_fileName;<br>}<br><br><span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> TOETexture::width(){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->_w;<br>}<br><br><span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> TOETexture::height(){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->_h;<br>}<br><br><span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> TOETexture::bpp(){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->_bpp;<br>}<br><br><span class="cpp-keyword">unsigned</span> <span class="cpp-keyword">int</span> TOETexture::id(){<br> <span class="cpp-keyword">return</span> <span class="cpp-keyword">this</span>->_id;<br>}<br><br><span class="cpp-keyword">void</span> TOETexture::createInMemoryTexture( <span class="cpp-keyword">void</span>* ){<br> <br>}<br><br><br></pre></div><!–ENDSCRIPT–><br><br><br>phantom, I'm just want to write a texture class, not a complete library :) Is a different approach.<br>Ah, I wanted to make you a question: Your project just runs on win32?