X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=image.c;h=bc58a7247e43c155f1b73b3e7485f076751a54a0;hb=1bcc071e269a026b1c20cb5613480e60a423c8ad;hp=2624544f1f30200b70e436e5127619df6f887d80;hpb=77f8bde166d6e0061eb25faf3c33cc24fce2caca;p=xonotic%2Fdarkplaces.git diff --git a/image.c b/image.c index 2624544f..bc58a724 100644 --- a/image.c +++ b/image.c @@ -762,30 +762,16 @@ unsigned char *LoadWAL (const unsigned char *f, int filesize, int matchwidth, in } -static void Image_StripImageExtension (const char *in, char *out, size_t size_out) +void Image_StripImageExtension (const char *in, char *out, size_t size_out) { - const char *end, *temp; + const char *ext; if (size_out == 0) return; - end = in + strlen(in); - if ((end - in) >= 4) - { - temp = end - 4; - if (strcmp(temp, ".tga") == 0 - || strcmp(temp, ".pcx") == 0 - || strcmp(temp, ".lmp") == 0 - || strcmp(temp, ".png") == 0 - || strcmp(temp, ".jpg") == 0) - end = temp; - while (in < end && size_out > 1) - { - *out++ = *in++; - size_out--; - } - *out++ = 0; - } + ext = FS_FileExtension(in); + if (ext && (!strcmp(ext, "tga") || !strcmp(ext, "pcx") || !strcmp(ext, "lmp") || !strcmp(ext, "png") || !strcmp(ext, "jpg"))) + FS_StripExtension(in, out, size_out); else strlcpy(out, in, size_out); } @@ -879,7 +865,7 @@ unsigned char *loadimagepixels (const char *filename, qboolean complain, int mat firstformat = imageformats_textures; else if (!strcasecmp(name, "gfx")) firstformat = imageformats_gfx; - else if (!strchr(name, '/')) + else if (!strchr(basename, '/')) firstformat = imageformats_nopath; else firstformat = imageformats_other; @@ -975,24 +961,54 @@ void Image_WriteTGARGBA (const char *filename, int width, int height, const unsi buffer[13] = (width >> 8) & 0xFF; buffer[14] = (height >> 0) & 0xFF; buffer[15] = (height >> 8) & 0xFF; - buffer[16] = 32; // pixel size - buffer[17] = 8; // 8 bits of alpha - // swap rgba to bgra and flip upside down - out = buffer + 18; - for (y = height - 1;y >= 0;y--) + for (y = 3;y < width*height*4;y += 4) + if (data[y] < 255) + break; + + if (y < width*height*4) { - in = data + y * width * 4; - end = in + width * 4; - for (;in < end;in += 4) + // save the alpha channel + buffer[16] = 32; // pixel size + buffer[17] = 8; // 8 bits of alpha + + // swap rgba to bgra and flip upside down + out = buffer + 18; + for (y = height - 1;y >= 0;y--) { - *out++ = in[2]; - *out++ = in[1]; - *out++ = in[0]; - *out++ = in[3]; + in = data + y * width * 4; + end = in + width * 4; + for (;in < end;in += 4) + { + *out++ = in[2]; + *out++ = in[1]; + *out++ = in[0]; + *out++ = in[3]; + } + } + FS_WriteFile (filename, buffer, width*height*4 + 18 ); + } + else + { + // save only the color channels + buffer[16] = 24; // pixel size + buffer[17] = 0; // 8 bits of alpha + + // swap rgba to bgr and flip upside down + out = buffer + 18; + for (y = height - 1;y >= 0;y--) + { + in = data + y * width * 4; + end = in + width * 4; + for (;in < end;in += 4) + { + *out++ = in[2]; + *out++ = in[1]; + *out++ = in[0]; + } } + FS_WriteFile (filename, buffer, width*height*3 + 18 ); } - FS_WriteFile (filename, buffer, width*height*4 + 18 ); Mem_Free(buffer); } @@ -1540,120 +1556,3 @@ void Image_HeightmapToNormalmap(const unsigned char *inpixels, unsigned char *ou } } } - -int image_loadskin(imageskin_t *s, const char *shadername) -{ - int j; - unsigned char *bumppixels; - int bumppixels_width, bumppixels_height; - char name[MAX_QPATH]; - Image_StripImageExtension(shadername, name, sizeof(name)); - memset(s, 0, sizeof(*s)); - s->basepixels = loadimagepixels(name, false, 0, 0); - if (s->basepixels == NULL) - return false; - s->basepixels_width = image_width; - s->basepixels_height = image_height; - - bumppixels = NULL;bumppixels_width = 0;bumppixels_height = 0; - for (j = 3;j < s->basepixels_width * s->basepixels_height * 4;j += 4) - if (s->basepixels[j] < 255) - break; - if (j < s->basepixels_width * s->basepixels_height * 4) - { - // has transparent pixels - s->maskpixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s->basepixels_width * s->basepixels_height * 4); - s->maskpixels_width = s->basepixels_width; - s->maskpixels_height = s->basepixels_height; - memcpy(s->maskpixels, s->basepixels, s->maskpixels_width * s->maskpixels_height * 4); - for (j = 0;j < s->basepixels_width * s->basepixels_height * 4;j += 4) - { - s->maskpixels[j+0] = 255; - s->maskpixels[j+1] = 255; - s->maskpixels[j+2] = 255; - } - } - - // _luma is supported for tenebrae compatibility - // (I think it's a very stupid name, but oh well) - if ((s->glowpixels = loadimagepixels(va("%s_glow", name), false, 0, 0)) != NULL - || (s->glowpixels = loadimagepixels(va("%s_luma", name), false, 0, 0)) != NULL) - { - s->glowpixels_width = image_width; - s->glowpixels_height = image_height; - } - // _norm is the name used by tenebrae - // (I don't like the name much) - if ((s->nmappixels = loadimagepixels(va("%s_norm", name), false, 0, 0)) != NULL) - { - s->nmappixels_width = image_width; - s->nmappixels_height = image_height; - } - else if ((bumppixels = loadimagepixels(va("%s_bump", name), false, 0, 0)) != NULL) - { - bumppixels_width = image_width; - bumppixels_height = image_height; - } - if ((s->glosspixels = loadimagepixels(va("%s_gloss", name), false, 0, 0)) != NULL) - { - s->glosspixels_width = image_width; - s->glosspixels_height = image_height; - } - if ((s->pantspixels = loadimagepixels(va("%s_pants", name), false, 0, 0)) != NULL) - { - s->pantspixels_width = image_width; - s->pantspixels_height = image_height; - } - if ((s->shirtpixels = loadimagepixels(va("%s_shirt", name), false, 0, 0)) != NULL) - { - s->shirtpixels_width = image_width; - s->shirtpixels_height = image_height; - } - - if (s->nmappixels == NULL) - { - if (bumppixels != NULL) - { - if (r_shadow_bumpscale_bumpmap.value > 0) - { - s->nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, bumppixels_width * bumppixels_height * 4); - s->nmappixels_width = bumppixels_width; - s->nmappixels_height = bumppixels_height; - Image_HeightmapToNormalmap(bumppixels, s->nmappixels, s->nmappixels_width, s->nmappixels_height, false, r_shadow_bumpscale_bumpmap.value); - } - } - else - { - if (r_shadow_bumpscale_basetexture.value > 0) - { - s->nmappixels = (unsigned char *)Mem_Alloc(loadmodel->mempool, s->basepixels_width * s->basepixels_height * 4); - s->nmappixels_width = s->basepixels_width; - s->nmappixels_height = s->basepixels_height; - Image_HeightmapToNormalmap(s->basepixels, s->nmappixels, s->nmappixels_width, s->nmappixels_height, false, r_shadow_bumpscale_basetexture.value); - } - } - } - if (bumppixels != NULL) - Mem_Free(bumppixels); - return true; -} - -void image_freeskin(imageskin_t *s) -{ - if (s->basepixels) - Mem_Free(s->basepixels); - if (s->maskpixels) - Mem_Free(s->maskpixels); - if (s->nmappixels) - Mem_Free(s->nmappixels); - if (s->glowpixels) - Mem_Free(s->glowpixels); - if (s->glosspixels) - Mem_Free(s->glosspixels); - if (s->pantspixels) - Mem_Free(s->pantspixels); - if (s->shirtpixels) - Mem_Free(s->shirtpixels); - memset(s, 0, sizeof(*s)); -} -