Archived

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

dta1

Whats rong with this TGA-loader?

Recommended Posts

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);

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
Guest Anonymous Poster
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;
}


Share this post


Link to post
Share on other sites
Guest Anonymous Poster
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);
^

Share this post


Link to post
Share on other sites