]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - image.c
fixes for entity caching when r_shadows == 1
[xonotic/darkplaces.git] / image.c
diff --git a/image.c b/image.c
index 968fabf6381eedd52aa92d3f8c8ff3741ee8766c..4fccb162e87e5338225269cd3fa97f86df7f7b29 100644 (file)
--- a/image.c
+++ b/image.c
@@ -8,6 +8,14 @@
 int            image_width;
 int            image_height;
 
+void Image_CopyAlphaFromBlueBGRA(unsigned char *outpixels, const unsigned char *inpixels, int w, int h)
+{
+       int i, n;
+       n = w * h;
+       for(i = 0; i < n; ++i)
+               outpixels[4*i+3] = inpixels[4*i]; // blue channel
+}
+
 #if 1
 // written by LordHavoc in a readable way, optimized by Vic, further optimized by LordHavoc (the non-special index case), readable version preserved below this
 void Image_CopyMux(unsigned char *outpixels, const unsigned char *inpixels, int inputwidth, int inputheight, qboolean inputflipx, qboolean inputflipy, qboolean inputflipdiagonal, int numoutputcomponents, int numinputcomponents, int *outputinputcomponentindices)
@@ -767,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;
@@ -846,14 +872,14 @@ 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;
-       unsigned char *f, *data = NULL;
-       char basename[MAX_QPATH], name[MAX_QPATH], *c;
-       if (developer_memorydebug.integer)
-               Mem_CheckSentinelsGlobal();
+       unsigned char *f, *data = NULL, *data2 = NULL;
+       char basename[MAX_QPATH], name[MAX_QPATH], name2[MAX_QPATH], *c;
+       //if (developer_memorydebug.integer)
+       //      Mem_CheckSentinelsGlobal();
        if (developer_texturelogging.integer)
                Log_Printf("textures.log", "%s\n", filename);
        Image_StripImageExtension(filename, basename, sizeof(basename)); // strip filename extensions to allow replacement by other types
@@ -888,14 +914,26 @@ 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
+                       {
+                               dpsnprintf (name2, sizeof(name2), format->formatstring, va("%s_alpha", basename));
+                               f = FS_LoadFile(name2, tempmempool, true, &filesize);
+                               if(f)
+                               {
+                                       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_memorydebug.integer)
-                                       Mem_CheckSentinelsGlobal();
+                               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)
                                {
                                        int n = fixtransparentpixels(data, image_width, image_height);
@@ -912,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
@@ -931,16 +971,16 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo
        // texture loading can take a while, so make sure we're sending keepalives
        CL_KeepaliveMessage(false);
 
-       if (developer_memorydebug.integer)
-               Mem_CheckSentinelsGlobal();
+       //if (developer_memorydebug.integer)
+       //      Mem_CheckSentinelsGlobal();
        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);
@@ -1088,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)))
                {
@@ -1457,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++)