]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - image.c
Merge PR 'Use the text from modinfo.txt as the mod menu entry'
[xonotic/darkplaces.git] / image.c
diff --git a/image.c b/image.c
index 9e3f0fd64472a03e0bcea0d7dce15f35fa256529..15835797ecde5bf6c2df3ed18f4402a55a724a5d 100644 (file)
--- a/image.c
+++ b/image.c
@@ -20,8 +20,8 @@ static void Image_CopyAlphaFromBlueBGRA(unsigned char *outpixels, const unsigned
 }
 
 #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)
+// written by LadyHavoc in a readable way, optimized by Vic, further optimized by LadyHavoc (the non-special index case), readable version preserved below this
+void Image_CopyMux(unsigned char *outpixels, const unsigned char *inpixels, int inputwidth, int inputheight, qbool inputflipx, qbool inputflipy, qbool inputflipdiagonal, int numoutputcomponents, int numinputcomponents, int *outputinputcomponentindices)
 {
        int index, c, x, y;
        const unsigned char *in, *line;
@@ -70,7 +70,7 @@ void Image_CopyMux(unsigned char *outpixels, const unsigned char *inpixels, int
 }
 #else
 // intentionally readable version
-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)
+void Image_CopyMux(unsigned char *outpixels, const unsigned char *inpixels, int inputwidth, int inputheight, qbool inputflipx, qbool inputflipy, qbool inputflipdiagonal, int numoutputcomponents, int numinputcomponents, int *outputinputcomponentindices)
 {
        int index, c, x, y;
        const unsigned char *in, *inrow, *incolumn;
@@ -210,7 +210,7 @@ static unsigned char* LoadPCX_BGRA (const unsigned char *f, int filesize, int *m
        memcpy(&pcx, fin, sizeof(pcx));
        fin += sizeof(pcx);
 
-       // LordHavoc: big-endian support ported from QF newtree
+       // LadyHavoc: big-endian support ported from QF newtree
        pcx.xmax = LittleShort (pcx.xmax);
        pcx.xmin = LittleShort (pcx.xmin);
        pcx.ymax = LittleShort (pcx.ymax);
@@ -283,7 +283,7 @@ static unsigned char* LoadPCX_BGRA (const unsigned char *f, int filesize, int *m
 LoadPCX
 ============
 */
-qboolean LoadPCX_QWSkin(const unsigned char *f, int filesize, unsigned char *pixels, int outwidth, int outheight)
+qbool LoadPCX_QWSkin(const unsigned char *f, int filesize, unsigned char *pixels, int outwidth, int outheight)
 {
        pcx_t pcx;
        unsigned char *a;
@@ -300,7 +300,7 @@ qboolean LoadPCX_QWSkin(const unsigned char *f, int filesize, unsigned char *pix
        memcpy(&pcx, fin, sizeof(pcx));
        fin += sizeof(pcx);
 
-       // LordHavoc: big-endian support ported from QF newtree
+       // LadyHavoc: big-endian support ported from QF newtree
        pcx.xmax = LittleShort (pcx.xmax);
        pcx.xmin = LittleShort (pcx.xmin);
        pcx.ymax = LittleShort (pcx.ymax);
@@ -362,7 +362,7 @@ qboolean LoadPCX_QWSkin(const unsigned char *f, int filesize, unsigned char *pix
 LoadPCX
 ============
 */
-qboolean LoadPCX_PaletteOnly(const unsigned char *f, int filesize, unsigned char *palette768b)
+qbool LoadPCX_PaletteOnly(const unsigned char *f, int filesize, unsigned char *palette768b)
 {
        if (filesize < 768)
                return false;
@@ -797,7 +797,7 @@ static unsigned char *LoadWAL_BGRA (const unsigned char *f, int filesize, int *m
        return image_buffer;
 }
 
-qboolean LoadWAL_GetMetadata(const unsigned char *f, int filesize, int *retwidth, int *retheight, int *retflags, int *retvalue, int *retcontents, char *retanimname32c)
+qbool LoadWAL_GetMetadata(const unsigned char *f, int filesize, int *retwidth, int *retheight, int *retflags, int *retvalue, int *retcontents, char *retanimname32c)
 {
        const q2wal_t *inwal = (const q2wal_t *)f;
 
@@ -878,7 +878,7 @@ static unsigned char* LoadLMP_BGRA(const unsigned char *f, int filesize, int *mi
 }
 
 // gfx/conchars is a raw 128x128 image with 0 as transparent color rather than 255
-unsigned char *LoadConChars_BGRA(const unsigned char *f, int filesize, int *miplevel)
+static unsigned char *LoadConChars_BGRA(const unsigned char *f, int filesize, int *miplevel)
 {
        unsigned char *image_buffer;
        int i;
@@ -921,7 +921,7 @@ void Image_StripImageExtension (const char *in, char *out, size_t size_out)
        if (ext && (!strcmp(ext, "tga") || !strcmp(ext, "pcx") || !strcmp(ext, "lmp") || !strcmp(ext, "png") || !strcmp(ext, "jpg") || !strcmp(ext, "wal")))
                FS_StripExtension(in, out, size_out);
        else
-               strlcpy(out, in, size_out);
+               dp_strlcpy(out, in, size_out);
 }
 
 static unsigned char image_linearfromsrgb[256];
@@ -1040,10 +1040,11 @@ imageformat_t imageformats_other[] =
 };
 
 int fixtransparentpixels(unsigned char *data, int w, int h);
-unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qboolean allowFixtrans, qboolean convertsRGB, int *miplevel)
+unsigned char *loadimagepixelsbgra (const char *filename, qbool complain, qbool allowFixtrans, qbool convertsRGB, int *miplevel)
 {
        fs_offset_t filesize;
        imageformat_t *firstformat, *format;
+       int mymiplevel;
        unsigned char *f, *data = NULL, *data2 = NULL;
        char basename[MAX_QPATH], name[MAX_QPATH], name2[MAX_QPATH], path[MAX_QPATH], afterpath[MAX_QPATH], *c;
        char vabuf[1024];
@@ -1058,14 +1059,14 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo
                        *c = '#';
        path[0] = 0;
        name[0] = 0;
-       strlcpy(afterpath, basename, sizeof(afterpath));
+       dp_strlcpy(afterpath, basename, sizeof(afterpath));
        if (strchr(basename, '/'))
        {
                int i;
                for (i = 0;i < (int)sizeof(path)-1 && basename[i] != '/' && basename[i];i++)
                        path[i] = basename[i];
                path[i] = 0;
-               strlcpy(afterpath, basename + i + 1, sizeof(afterpath));
+               dp_strlcpy(afterpath, basename + i + 1, sizeof(afterpath));
        }
        if (gamemode == GAME_TENEBRAE)
                firstformat = imageformats_tenebrae;
@@ -1083,10 +1084,12 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo
        for (format = firstformat;format->formatstring;format++)
        {
                dpsnprintf (name, sizeof(name), format->formatstring, basename);
-               f = FS_LoadFile(name, tempmempool, true, &filesize);
-               if (f)
+
+               FS_SanitizePath(name);
+
+               if(FS_FileExists(name) && (f = FS_LoadFile(name, tempmempool, true, &filesize)) != NULL)
                {
-                       int mymiplevel = miplevel ? *miplevel : 0;
+                       mymiplevel = miplevel ? *miplevel : 0;
                        image_width = 0;
                        image_height = 0;
                        data = format->loadfunc(f, (int)filesize, &mymiplevel);
@@ -1152,7 +1155,7 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo
                        if (developer_loading.integer)
                                Con_Printf("loading gfx.wad lump \"%s\"\n", afterpath);
 
-                       int mymiplevel = miplevel ? *miplevel : 0;
+                       mymiplevel = miplevel ? *miplevel : 0;
                        if (!strcmp(afterpath, "conchars"))
                        {
                                // conchars is a raw image and with color 0 as transparent instead of 255
@@ -1190,7 +1193,7 @@ unsigned char *loadimagepixelsbgra (const char *filename, qboolean complain, qbo
        return NULL;
 }
 
-qboolean Image_GetStockPicSize(const char *filename, int *returnwidth, int *returnheight)
+qbool Image_GetStockPicSize(const char *filename, int *returnwidth, int *returnheight)
 {
        unsigned char *data;
        fs_offset_t filesize;
@@ -1239,7 +1242,7 @@ qboolean Image_GetStockPicSize(const char *filename, int *returnwidth, int *retu
 }
 
 extern cvar_t gl_picmip;
-rtexture_t *loadtextureimage (rtexturepool_t *pool, const char *filename, qboolean complain, int flags, qboolean allowFixtrans, qboolean sRGB)
+rtexture_t *loadtextureimage (rtexturepool_t *pool, const char *filename, qbool complain, int flags, qbool allowFixtrans, qbool sRGB)
 {
        unsigned char *data;
        rtexture_t *rt;
@@ -1370,20 +1373,20 @@ int fixtransparentpixels(unsigned char *data, int w, int h)
        return changedPixels;
 }
 
-void Image_FixTransparentPixels_f(void)
+void Image_FixTransparentPixels_f(cmd_state_t *cmd)
 {
        const char *filename, *filename_pattern;
        fssearch_t *search;
        int i, n;
        char outfilename[MAX_QPATH], buf[MAX_QPATH];
        unsigned char *data;
-       if(Cmd_Argc() != 2)
+       if(Cmd_Argc(cmd) != 2)
        {
-               Con_Printf("Usage: %s imagefile\n", Cmd_Argv(0));
+               Con_Printf("Usage: %s imagefile\n", Cmd_Argv(cmd, 0));
                return;
        }
-       filename_pattern = Cmd_Argv(1);
-       search = FS_Search(filename_pattern, true, true);
+       filename_pattern = Cmd_Argv(cmd, 1);
+       search = FS_Search(filename_pattern, true, true, NULL);
        if(!search)
                return;
        for(i = 0; i < search->numfilenames; ++i)
@@ -1406,9 +1409,9 @@ void Image_FixTransparentPixels_f(void)
        FS_FreeSearch(search);
 }
 
-qboolean Image_WriteTGABGR_preflipped (const char *filename, int width, int height, const unsigned char *data)
+qbool Image_WriteTGABGR_preflipped (const char *filename, int width, int height, const unsigned char *data)
 {
-       qboolean ret;
+       qbool ret;
        unsigned char buffer[18];
        const void *buffers[2];
        fs_offset_t sizes[2];
@@ -1430,12 +1433,12 @@ qboolean Image_WriteTGABGR_preflipped (const char *filename, int width, int heig
        return ret;
 }
 
-qboolean Image_WriteTGABGRA (const char *filename, int width, int height, const unsigned char *data)
+qbool Image_WriteTGABGRA (const char *filename, int width, int height, const unsigned char *data)
 {
        int y;
        unsigned char *buffer, *out;
        const unsigned char *in, *end;
-       qboolean ret;
+       qbool ret;
 
        buffer = (unsigned char *)Mem_Alloc(tempmempool, width*height*4 + 18);
 
@@ -1804,10 +1807,8 @@ void Image_HeightmapToNormalmap_BGRA(const unsigned char *inpixels, unsigned cha
        }
 }
 
-static const unsigned char concharimage[] =
-{
+
 #include "lhfont.h"
-};
 
 static unsigned char *Image_GenerateConChars(void)
 {
@@ -1894,10 +1895,10 @@ unsigned char *Image_GenerateNoTexture(void)
        {
                for (x = 0; x < 16; x++)
                {
-                       data[(y * 8 + x) * 4 + 0] =
-                               data[(y * 8 + x) * 4 + 1] =
-                               data[(y * 8 + x) * 4 + 2] = (y < 8) ^ (x < 8) ? 128 : 64;
-                       data[(y * 8 + x) * 4 + 3] = 255;
+                       data[(y * 16 + x) * 4 + 0] =
+                       data[(y * 16 + x) * 4 + 1] =
+                       data[(y * 16 + x) * 4 + 2] = (y < 8) ^ (x < 8) ? 128 : 64;
+                       data[(y * 16 + x) * 4 + 3] = 255;
                }
        }
        return data;
@@ -2094,7 +2095,7 @@ unsigned char *Image_GetEmbeddedPicBGRA(const char *name)
                        return data;
                }
        }
-       if (!strcmp(name, "white"))
+       if (!strcmp(name, "white") || !strcmp(name, "#white") || !strcmp(name, "*white") || !strcmp(name, "$whiteimage"))
                return Image_GenerateWhite();
        if (!strcmp(name, "gfx/conchars"))
                return Image_GenerateConChars();