strlcpy(out, in, size_out);
}
+static unsigned char image_linearfromsrgb[256];
+
+void Image_MakeLinearColorsFromsRGB(unsigned char *pout, const unsigned char *pin, int numpixels)
+{
+ int i;
+ // this math from http://www.opengl.org/registry/specs/EXT/texture_sRGB.txt
+ if (!image_linearfromsrgb[255])
+ for (i = 0;i < 256;i++)
+ image_linearfromsrgb[i] = i < 11 ? (int)(i / 12.92f) : (int)(pow((i/256.0f + 0.055f)/1.0555f, 2.4)*256.0f);
+ for (i = 0;i < numpixels;i++)
+ {
+ pout[i*4+0] = image_linearfromsrgb[pin[i*4+0]];
+ pout[i*4+1] = image_linearfromsrgb[pin[i*4+1]];
+ pout[i*4+2] = image_linearfromsrgb[pin[i*4+2]];
+ pout[i*4+3] = pin[i*4+3];
+ }
+}
+
typedef struct imageformat_s
{
const char *formatstring;
};
int fixtransparentpixels(unsigned char *data, int w, int h);
-unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qboolean allowFixtrans)
+unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qboolean allowFixtrans, qboolean convertsRGB)
{
fs_offset_t filesize;
imageformat_t *firstformat, *format;
f = FS_LoadFile(name, tempmempool, true, &filesize);
if (f)
{
- data = format->loadfunc(f, filesize);
+ data = format->loadfunc(f, (int)filesize);
Mem_Free(f);
if(format->loadfunc == JPEG_LoadImage_BGRA) // jpeg can't do alpha, so let's simulate it by loading another jpeg
{
f = FS_LoadFile(name2, tempmempool, true, &filesize);
if(f)
{
- data2 = format->loadfunc(f, filesize);
+ data2 = format->loadfunc(f, (int)filesize);
Mem_Free(f);
Image_CopyAlphaFromBlueBGRA(data, data2, image_width, image_height);
Mem_Free(data2);
}
if (data)
{
- if (developer.integer >= 10)
- Con_Printf("loaded image %s (%dx%d)\n", name, image_width, image_height);
+ if (developer_loading.integer)
+ Con_DPrintf("loaded image %s (%dx%d)\n", name, image_width, image_height);
//if (developer_memorydebug.integer)
// Mem_CheckSentinelsGlobal();
if(allowFixtrans && r_fixtrans_auto.integer)
}
}
}
+ if (convertsRGB)
+ Image_MakeLinearColorsFromsRGB(data, data, image_width * image_height);
return data;
}
else
return NULL;
}
-rtexture_t *loadtextureimage (rtexturepool_t *pool, const char *filename, qboolean complain, int flags, qboolean allowFixtrans)
+rtexture_t *loadtextureimage (rtexturepool_t *pool, const char *filename, qboolean complain, int flags, qboolean allowFixtrans, qboolean convertsRGB)
{
unsigned char *data;
rtexture_t *rt;
- if (!(data = loadimagepixelsbgra (filename, complain, allowFixtrans)))
+ if (!(data = loadimagepixelsbgra (filename, complain, allowFixtrans, convertsRGB)))
return 0;
rt = R_LoadTexture2D(pool, filename, image_width, image_height, data, TEXTYPE_BGRA, flags, NULL);
Mem_Free(data);
Con_Printf("Processing %s... ", filename);
Image_StripImageExtension(filename, buf, sizeof(buf));
dpsnprintf(outfilename, sizeof(outfilename), "fixtrans/%s.tga", buf);
- if(!(data = loadimagepixelsbgra(filename, true, false)))
+ if(!(data = loadimagepixelsbgra(filename, true, false, false)))
return;
if((n = fixtransparentpixels(data, image_width, image_height)))
{
const unsigned char *b, *row[3];
int p[5];
unsigned char *out;
- float iwidth, iheight, ibumpscale, n[3];
- iwidth = 1.0f / width;
- iheight = 1.0f / height;
+ float ibumpscale, n[3];
ibumpscale = (255.0f * 6.0f) / bumpscale;
out = outpixels;
for (y = 0, y1 = height-1;y < height;y1 = y, y++)