Yes, the old code is (I remove glGetError() checks from it):
GLuint create_texture_from_tga(const char *file_name)
{
struct tga_header header;
int32_t size, bpp, pixels, i, j;
uint8_t *buffer, rgba[4], temp, pack;
FILE *image;
GLuint texture;
image = fopen(file_name, "rb");
if (NULL == image)
{
LOG_ERROR("Cant open file %s
", file_name);
return 0;
}
if (fread(&header, 1, sizeof(header), image) != sizeof(header))
{
LOG_ERROR("Cant read TGA header from file %s
", file_name);
fclose(image);
return 0;
}
if (header.bitperpel!=24 && header.bitperpel!=32 && header.datatype!=2 && header.datatype!=10)
{
LOG_ERROR("Wrong TGA format %s
", file_name);
fclose(image);
return 0;
}
if (header.idlength)
fseek(image, header.idlength, SEEK_CUR);
size = (int32_t)header.width * (int32_t)header.height;
bpp = header.bitperpel / 8;
buffer = (uint8_t*)malloc(size * bpp);
if (header.datatype == 2)
{
fread(buffer, size, bpp, image);
} else if (header.datatype == 10)
{
for (i=0, j=0; i<size;)
{
fread(&temp, 1, 1, image);
pack = temp & 128;
pixels = (int32_t)(temp & 127);
if (pack)
{
fread(rgba, 1, bpp, image);
while (pixels-- >= 0)
{
memcpy(buffer + j, rgba, bpp);
j += bpp;
++i;
}
} else
{
fread(buffer + j, pixels + 1, bpp, image);
j += (pixels + 1) * bpp;
i += pixels + 1;
}
}
}
fclose(image);
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, bpp == 3 ? GL_RGB8 : GL_RGBA8, header.width,
header.height, 0, bpp == 3 ? GL_BGR : GL_BGRA, GL_UNSIGNED_BYTE, buffer);
// as I say eraly, I change GL_BGR to GL_RGB and this resolve the problem
free(buffer);
return texture;
}