X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=image.c;h=4fccb162e87e5338225269cd3fa97f86df7f7b29;hb=93783908b793eb2f1df1e705cc7d29489cf409b3;hp=55828225a78a1ae623de6e9fd3bb536161b96c39;hpb=faec30a77780d42d0ba107782bfb59394e6f05c0;p=xonotic%2Fdarkplaces.git diff --git a/image.c b/image.c index 55828225..4fccb162 100644 --- a/image.c +++ b/image.c @@ -775,6 +775,24 @@ void Image_StripImageExtension (const char *in, char *out, size_t size_out) 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; @@ -854,7 +872,7 @@ imageformat_t imageformats_other[] = }; 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; @@ -896,7 +914,7 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo 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 { @@ -904,7 +922,7 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo 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); @@ -912,8 +930,8 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo } 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) @@ -932,6 +950,8 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo } } } + if (convertsRGB) + Image_MakeLinearColorsFromsRGB(data, data, image_width * image_height); return data; } else @@ -956,11 +976,11 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo 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); @@ -1108,7 +1128,7 @@ void Image_FixTransparentPixels_f(void) 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))) { @@ -1477,9 +1497,7 @@ void Image_HeightmapToNormalmap_BGRA(const unsigned char *inpixels, unsigned cha 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++)