Whats rong with this TGA-loader?

Started by
3 comments, last by dta1 22 years, 3 months ago
I can''t find out whats wrong typedef struct { unsigned char imageTypeCode; short int imageWidth; short int imageHeight; unsigned char bitCount; unsigned char *imageData; } TGAFILE; int LoadTGA(char *filename, TGAFILE *tgaFile) { FILE *filePtr; unsigned char ucharSkip; //Skip these short int sintSkip; long imageSize; int colorMode; // 4 = RGBA, 3 = RGB (32/24 bit) long imageIdx; // Counter unsigned char colorSwap; //Open TGA file filePtr = fopen(filename, "rb"); if(!filePtr) { filePtr = NULL; MessageBox( NULL, "\tMissing Imagefiles!", "", NULL); return 0; } // 2 Byte data we don''t need fread(&ucharSkip, sizeof(unsigned char), 1, filePtr); fread(&ucharSkip, sizeof(unsigned char), 1, filePtr); // Read image type fread(&tgaFile->imageTypeCode, sizeof(unsigned char),1,filePtr); // Validate type if ((tgaFile->imageTypeCode!=3) && (tgaFile->imageTypeCode!=2)) { fclose(filePtr); return 0; } // 13 Byte data we don''t need fread(&sintSkip, sizeof(short int),1,filePtr); fread(&sintSkip, sizeof(short int),1,filePtr); fread(&ucharSkip, sizeof(unsigned char),1,filePtr); fread(&sintSkip, sizeof(short int),1,filePtr); fread(&sintSkip, sizeof(short int),1,filePtr); // Read image size fread(&tgaFile->imageWidth, sizeof(short int),1,filePtr); fread(&tgaFile->imageHeight, sizeof(short int),1,filePtr); // Image depth fread(&tgaFile->bitCount,sizeof(unsigned char),1,filePtr); // 1 Byte we don''t need fread(&ucharSkip,sizeof(unsigned char),1,filePtr); // Color Mode colorMode = tgaFile->bitCount / 8; imageSize = tgaFile->imageWidth*tgaFile->imageHeight*colorMode; // Allocate memory tgaFile->imageData = (unsigned char*)malloc(sizeof(unsigned char)*imageSize); // Read image data fread(&tgaFile->imageData,sizeof(unsigned char),1,filePtr); // Swap BGR(A) to RGB(A) for( imageIdx = 0; imageIdx < imageSize; imageIdx += colorMode ) { colorSwap = tgaFile->imageData[imageIdx]; tgaFile->imageData[imageIdx] = tgaFile->imageData[imageIdx + 2]; tgaFile->imageData[imageIdx + 2] = colorSwap; } fclose(filePtr); return 1; // Successful Loaded TGA-file } TGAFILE *myTGA; myTGA = (TGAFILE*)malloc(sizeof(TGAFILE)); LoadTGA("x.tga", myTGA); glPixelStorei(GL_UNPACK_ALIGNMENT, 4); glRasterPos2i( 10, 10 ); glDrawPixels(myTGA->imageWidth,myTGA->imageHeight,GL_RGB,GL_UNSIGNED_BYTE,myTGA->imageData);
Erase, rewind and improve
Advertisement
quote:
// Read image data
fread(&tgaFile->imageData, sizeof(unsigned char), 1, filePtr);

You''re only reading in one byte of the actual image data. Change that line to this:
  fread(&tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);  

You should also remember to free the memory in imageFile before you load another targa using the same structure, and when you''re program is finished.
Thet help much

But I still get an access violation on the colorSwap part,

// Swap BGR(A) to RGB(A)
for( imageIdx = 0; imageIdx < imageSize; imageIdx += colorMode )
{
colorSwap = tgaFile->imageData[imageIdx]; // access violation
tgaFile->imageData[imageIdx] = tgaFile->imageData[imageIdx + 2];
tgaFile->imageData[imageIdx + 2] = colorSwap;
}


You are taking the address of tgaFile->imageData:

fread(&tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);
^

Should have:

fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);
^
Of course
Thank you

Erase, rewind and improve

This topic is closed to new replies.

Advertisement