fteqw/engine/sw/sw_image.c
Spoike 4a1416a5d2 removed hunk memory (as well as -mem argument).
removed cache memory.
added fallback normalmap texture.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@4421 fc73d0e0-1445-4013-8a0c-d673dee63da5
2013-07-14 12:22:51 +00:00

167 lines
3.9 KiB
C

#include "quakedef.h"
#ifdef SWQUAKE
#include "sw.h"
void SW_RoundDimensions(int width, int height, int *scaled_width, int *scaled_height, qboolean mipmap)
{
for (*scaled_width = 1 ; *scaled_width < width ; *scaled_width<<=1)
;
for (*scaled_height = 1 ; *scaled_height < height ; *scaled_height<<=1)
;
if (*scaled_width != width)
*scaled_width >>= 1;
if (*scaled_height != height)
*scaled_height >>= 1;
if (*scaled_width > 256)
*scaled_width = 256;
if (*scaled_height > 256)
*scaled_height = 256;
}
texid_tf SW_AllocNewTexture(char *identifier, int w, int h, unsigned int flags)
{
int nw, nh;
texid_t n;
swimage_t *img;
if (w & 3)
return r_nulltex;
SW_RoundDimensions(w, h, &nw, &nh, false);
img = BZ_Malloc(sizeof(*img) - sizeof(img->data) + (nw * nh * 4));
Q_strncpy(img->name, identifier, sizeof(img->name));
img->com.width = w;
img->com.height = h;
img->pwidth = nw;
img->pheight = nh;
img->pitch = nw;
img->pwidthmask = nw-1;
img->pheightmask = nh-1;
n.ptr = img;
n.ref = &img->com;
return n;
}
texid_tf SW_FindTexture(char *identifier, unsigned int flags)
{
return r_nulltex;
}
void SW_RGBToBGR(swimage_t *img)
{
int x, y;
unsigned int *d = img->data;
for (y = 0; y < img->pheight; y++)
{
for (x = 0; x < img->pwidth; x++)
{
d[x] = (d[x]&0xff00ff00) | ((d[x]&0xff)<<16) | ((d[x]&0xff0000)>>16);
}
d += img->pitch;
}
}
void SW_Upload32(swimage_t *img, int iw, int ih, unsigned int *data)
{
//rescale the input to the output.
//just use nearest-sample, cos we're lazy.
int x, y;
unsigned int *out = img->data;
unsigned int *in;
int sx, sy, stx, sty;
int ow = img->pwidth, oh = img->pheight;
stx = (iw<<16) / ow;
sty = (ih<<16) / oh;
for (y = 0, sy = 0; y < oh; y++, sy += sty)
{
in = data + iw*(sy>>16);
for (x = 0, sx = 0; x < ow; x++, sx += stx)
{
out[x] = in[sx>>16];
}
out += img->pitch;
}
SW_RGBToBGR(img);
}
void SW_Upload8(swimage_t *img, int iw, int ih, unsigned char *data)
{
//rescale the input to the output.
//just use nearest-sample, cos we're lazy.
int x, y;
unsigned int *out = img->data;
unsigned char *in;
int sx, sy, stx, sty;
int ow = img->pwidth, oh = img->pheight;
stx = (iw<<16) / ow;
sty = (ih<<16) / oh;
for (y = 0, sy = 0; y < oh; y++, sy += sty)
{
in = data + iw*(sy>>16);
for (x = 0, sx = 0; x < ow; x++, sx += stx)
{
out[x] = d_8to24rgbtable[in[sx>>16]];
}
out += img->pitch;
}
SW_RGBToBGR(img);
}
texid_tf SW_LoadTexture(char *identifier, int width, int height, uploadfmt_t fmt, void *data, unsigned int flags)
{
texid_t img = SW_FindTexture(identifier, flags);
if (!img.ptr)
img = SW_AllocNewTexture(identifier, width, height, flags);
if (!img.ptr)
return r_nulltex;
switch(fmt)
{
case TF_SOLID8:
SW_Upload8(img.ptr, width, height, data);
break;
case TF_TRANS8:
SW_Upload8(img.ptr, width, height, data);
break;
case TF_TRANS8_FULLBRIGHT:
SW_Upload8(img.ptr, width, height, data);
break;
case TF_RGBA32:
SW_Upload32(img.ptr, width, height, data);
break;
default:
//shouldn't happen, so I'm gonna leak
Con_Printf("SW_LoadTexture: unsupported format %i\n", fmt);
return r_nulltex;
}
return img;
}
texid_tf SW_LoadTexture8Pal24(char *identifier, int width, int height, qbyte *data, qbyte *palette24, unsigned int flags)
{
return r_nulltex;
}
texid_tf SW_LoadTexture8Pal32(char *identifier, int width, int height, qbyte *data, qbyte *palette32, unsigned int flags)
{
return r_nulltex;
}
texid_tf SW_LoadCompressed(char *name)
{
return r_nulltex;
}
void SW_Upload(texid_t tex, char *name, uploadfmt_t fmt, void *data, void *palette, int width, int height, unsigned int flags)
{
}
void SW_DestroyTexture(texid_t tex)
{
swimage_t *img = tex.ptr;
/*make sure its not in use by the renderer*/
SWRast_Sync(&commandqueue);
/*okay, it can be killed*/
BZ_Free(img);
}
#endif