return NULL;
}
+int image_makemask (byte *in, byte *out, int size)
+{
+ int i, count;
+ count = 0;
+ for (i = 0;i < size;i++)
+ {
+ out[0] = out[1] = out[2] = 255;
+ out[3] = in[3];
+ if (in[3] != 255)
+ count++;
+ in += 4;
+ out += 4;
+ }
+ return count;
+}
+
+byte* loadimagepixelsmask (char* filename, qboolean complain, int matchwidth, int matchheight)
+{
+ byte *in, *data;
+ in = data = loadimagepixels(filename, complain, matchwidth, matchheight);
+ if (!data)
+ return NULL;
+ if (image_makemask(data, data, image_width * image_height))
+ return data; // some transparency
+ else
+ {
+ free(data);
+ return NULL; // all opaque
+ }
+}
+
int loadtextureimage (char* filename, int matchwidth, int matchheight, qboolean complain, qboolean mipmap)
{
int texnum;
texnum = GL_LoadTexture (filename, image_width, image_height, data, mipmap, true, 4);
free(data);
return texnum;
- /*
- if (texnum >= 0) // specific texnum, not cached
+}
+
+int loadtextureimagemask (char* filename, int matchwidth, int matchheight, qboolean complain, qboolean mipmap)
+{
+ int texnum;
+ byte *data;
+ if (!(data = loadimagepixelsmask (filename, complain, matchwidth, matchheight)))
+ return 0;
+ texnum = GL_LoadTexture (filename, image_width, image_height, data, mipmap, true, 4);
+ free(data);
+ return texnum;
+}
+
+int image_masktexnum;
+int loadtextureimagewithmask (char* filename, int matchwidth, int matchheight, qboolean complain, qboolean mipmap)
+{
+ int texnum, count;
+ byte *data;
+ char *filename2;
+ image_masktexnum = 0;
+ if (!(data = loadimagepixels (filename, complain, matchwidth, matchheight)))
+ return 0;
+ texnum = GL_LoadTexture (filename, image_width, image_height, data, mipmap, true, 4);
+ count = image_makemask(data, data, image_width * image_height);
+ if (count)
{
- glBindTexture(GL_TEXTURE_2D, texnum);
- GL_Upload32 (data, image_width, image_height, mipmap, true);
- free(data);
- return texnum;
+ filename2 = malloc(strlen(filename) + 6);
+ sprintf(filename2, "%s_mask", filename);
+ image_masktexnum = GL_LoadTexture (filename2, image_width, image_height, data, mipmap, true, 4);
+ free(filename2);
}
- else // any texnum, cached
+ free(data);
+ return texnum;
+}
+
+void Image_WriteTGARGB (char *filename, int width, int height, byte *data)
+{
+ byte *buffer, *in, *out, *end;
+
+ buffer = malloc(width*height*3 + 18);
+
+ memset (buffer, 0, 18);
+ buffer[2] = 2; // uncompressed type
+ buffer[12] = (width >> 0) & 0xFF;
+ buffer[13] = (width >> 8) & 0xFF;
+ buffer[14] = (height >> 0) & 0xFF;
+ buffer[15] = (height >> 8) & 0xFF;
+ buffer[16] = 24; // pixel size
+
+ // swap rgb to bgr
+ in = data;
+ end = in + width*height*3;
+ out = buffer + 18;
+ for (;in < end;in += 3)
{
- texnum = GL_LoadTexture (filename, image_width, image_height, data, mipmap, true, 4);
- free(data);
- return texnum;
+ *out++ = in[2];
+ *out++ = in[1];
+ *out++ = in[0];
}
- */
+ COM_WriteFile (filename, buffer, glwidth*glheight*3 + 18 );
+
+ free(buffer);
}