Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

supagu

compressed tga loder problem

This topic is 5223 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Having some issues getting my compressed tga loader working. I get half the image properly displayed, then the other half is all black :-/ this function is called after reading the header and determining if its compressed: bool TGA::LoadCompresed( FILE* pFile, TGAHead& header ) { if( header.width <= 0 || header.height <= 0 || header.bpp < 24 ) { printf("something wrong bpp: %i width: %i height: %i\n", header.bpp, header.width, header.height); return false; } char* image = 0; unsigned int bytesPerPixel = header.bpp / 8; image = (char*)malloc( header.width * header.height * bytesPerPixel ); if( !image ) { printf( "failed to alloc mem\n"); return false; } int curByte = 0; int pixelsRead = 0; int noPixels = header.width * header.height; char* pixel = (char*)malloc( bytesPerPixel ); char chunkHead; do { if( fread( &chunkHead, sizeof(char), 1, pFile ) == 0 ) { printf( "failed to from file (chunkHead)\n"); return false; } if( (chunkHead >> 7) == 0x0 ) //RAW - not compressesd { ++chunkHead; //increase by one to determine how many pixels follow for(short counter = 0; counter < chunkHead; ++counter, curByte += bytesPerPixel, ++pixelsRead ) { //Read 1 Pixel if( fread( pixel, 1, bytesPerPixel, pFile) != bytesPerPixel ) { printf( "failed to from file (pixel RAW)\n"); return false; } image[ curByte + 0 ] = pixel[2]; image[ curByte + 1 ] = pixel[1]; image[ curByte + 2 ] = pixel[0]; if( bytesPerPixel >= 4 ) image[ curByte + 3 ] = pixel[3]; } } else //RLE - compressed { chunkHead = chunkHead ^ 128; //drop the 1 at start ++chunkHead; //Read 1 Pixel if( fread( pixel, 1, bytesPerPixel, pFile) != bytesPerPixel ) { printf( "failed to from file (pixel RLE)\n"); return false; } pixelsRead += (unsigned int)chunkHead; for(short counter = 0; counter < chunkHead; ++counter, curByte += bytesPerPixel, ++pixelsRead ) { image[ curByte + 0 ] = pixel[2]; image[ curByte + 1 ] = pixel[1]; image[ curByte + 2 ] = pixel[0]; if( bytesPerPixel >= 4 ) image[ curByte + 3 ] = pixel[3]; } } } while( pixelsRead < noPixels ); if( header.bpp == 32 ) GenerateTexture( image, header.width, header.height, GL_RGBA ); else GenerateTexture( image, header.width, header.height, GL_RGB ); free(image); free(pixel); return true; }

Share this post


Link to post
Share on other sites
Advertisement

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!