// Load a texture from a TGA file. GLuint loadTexture(const char *filename) { // Load tga data into buffer. int width, height, alpha; unsigned char* pixels; pixels = (unsigned char*)readTga(filename, &width, &height, &alpha); if(pixels == 0) { fprintf(stderr, "Image loading failed: %s\n", filename); return 0; } // Generate texture, bind as active texture. GLuint texture; glGenTextures(1, &texture); glBindTexture(GL_TEXTURE_2D, texture); // Texture parameters glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); // Load pixels from buffer into texture. glTexImage2D( GL_TEXTURE_2D, 0, alpha == 1 ? GL_RGBA8 : GL_RGB8, width, height, 0, alpha == 1 ? GL_BGRA : GL_BGR, GL_UNSIGNED_BYTE, pixels ); glGenerateMipmap(GL_TEXTURE_2D); // Release buffer. free(pixels); return texture; }
//------------------------------------------------------------------------ //------------------------------------------------------------------------ SmartPointer<Texture> Texture::open(std::string filename,bool bUseCacheIfPossible,bool bCacheInMemory) { if (!filename.length()) { Log::printf("Texture::open cannot open texture because filename is empty\n"); return SmartPointer<Texture>(); } //use cache? if (bUseCacheIfPossible) { if (textures_in_cache.find(Utils::ToLower(filename))!=textures_in_cache.end()) { //Log::printf("Opened texture file %s from cache (already in memory)\n",Filename.c_str()); return textures_in_cache[Utils::ToLower(filename)]; } } //opening from disk juce::File jfile(juce::File::getCurrentWorkingDirectory().getChildFile(filename.c_str())); juce::String jext=jfile.getFileExtension().toLowerCase(); SmartPointer<Texture> ret; if (jext==".tga") { ret=readTga(filename); if (!ret) return ret; //failed } else { juce::Image jimg=juce::ImageFileFormat::loadFrom(jfile); if (!jimg.isValid()) { Log::printf("Texture::open cannot open texture file %s \n",filename.c_str()); return SmartPointer<Texture>(); } int width = jimg.getWidth(); int height = jimg.getHeight(); int bpp = jimg.getFormat()==juce::Image::ARGB? 32 : (jimg.getFormat()==juce::Image::RGB? 24 : (jimg.getFormat()==juce::Image::SingleChannel? 8:0)); if((width == 0) || (height == 0) || !(bpp==24 || bpp==32 || bpp==8)) { Log::printf("Texture::open failed to load the texture file %s (reason unsupported type bpp=%d width=%d height=%d\n",filename.c_str(),bpp,width,height); return SmartPointer<Texture>(); } ret=SmartPointer<Texture>(new Texture(width,height,bpp,0)); unsigned char* dst=ret->buffer; //Alpha if (bpp==8) { for (int Y=0;Y<height;Y++) { for (int X=0;X<width ;X++) { juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y *dst++=colour.getAlpha(); }} } //RGB else if (bpp==24) { for (int Y=0;Y<height;Y++) { for (int X=0;X<width ;X++) { juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y *dst++=colour.getRed (); *dst++=colour.getGreen(); *dst++=colour.getBlue (); }} } //RGBA else if (bpp==32) { for (int Y=0;Y<height;Y++) { for (int X=0;X<width ;X++) { juce::Colour colour=jimg.getPixelAt(X,height-Y-1); //mirror y *dst++=colour.getRed (); *dst++=colour.getGreen(); *dst++=colour.getBlue (); *dst++=colour.getAlpha(); }} } } Log::printf("image file %s loaded from disk width(%d) height(%d) bpp(%d)\n",filename.c_str(),ret->width,ret->height,ret->bpp); if (bCacheInMemory) textures_in_cache[Utils::ToLower(filename)]=ret; ret->filename=filename; return ret; }