Whats rong with this TGA-loader?
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);
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;
}
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);
^
fread(&tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);
^
Should have:
fread(tgaFile->imageData, sizeof(unsigned char), imageSize, filePtr);
^
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement