mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-10 07:12:07 +00:00
Reuse TGA loader from STB
This commit is contained in:
parent
17d9ff77a6
commit
17c5e04d8f
2 changed files with 8 additions and 214 deletions
|
@ -78,14 +78,14 @@ LoadSTB(const char *origname, const char* type, byte **pic, int *width, int *hei
|
|||
data = stbi_load_from_memory(rawdata, rawsize, &w, &h, &bytesPerPixel, STBI_rgb_alpha);
|
||||
if (data == NULL)
|
||||
{
|
||||
R_Printf(PRINT_ALL, "stb_image couldn't load data from %s: %s!\n", filename, stbi_failure_reason());
|
||||
R_Printf(PRINT_ALL, "%s couldn't load data from %s: %s!\n", __func__, filename, stbi_failure_reason());
|
||||
ri.FS_FreeFile(rawdata);
|
||||
return false;
|
||||
}
|
||||
|
||||
ri.FS_FreeFile(rawdata);
|
||||
|
||||
R_Printf(PRINT_DEVELOPER, "LoadSTB() loaded: %s\n", filename);
|
||||
R_Printf(PRINT_DEVELOPER, "%s() loaded: %s\n", __func__, filename);
|
||||
|
||||
*pic = data;
|
||||
*width = w;
|
||||
|
|
|
@ -580,10 +580,10 @@ void Vk_ImageList_f (void)
|
|||
#define BLOCK_WIDTH 256
|
||||
#define BLOCK_HEIGHT 256
|
||||
|
||||
int scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH];
|
||||
byte scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT];
|
||||
static int scrap_allocated[MAX_SCRAPS][BLOCK_WIDTH];
|
||||
static byte scrap_texels[MAX_SCRAPS][BLOCK_WIDTH*BLOCK_HEIGHT];
|
||||
// textures for storing scrap image data (tiny image atlas)
|
||||
qvktexture_t vk_scrapTextures[MAX_SCRAPS] = { QVVKTEXTURE_INIT };
|
||||
static qvktexture_t vk_scrapTextures[MAX_SCRAPS] = { QVVKTEXTURE_INIT };
|
||||
|
||||
// returns a texture number and the position inside it
|
||||
static int Scrap_AllocBlock (int w, int h, int *x, int *y)
|
||||
|
@ -636,7 +636,7 @@ typedef struct
|
|||
qvksampler_t samplerType;
|
||||
} vkmode_t;
|
||||
|
||||
vkmode_t modes[] = {
|
||||
static vkmode_t modes[] = {
|
||||
{"VK_NEAREST", S_NEAREST },
|
||||
{"VK_LINEAR", S_LINEAR },
|
||||
{"VK_MIPMAP_NEAREST", S_MIPMAP_NEAREST },
|
||||
|
@ -730,213 +730,6 @@ void Vk_LmapTextureMode( char *string )
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
=========================================================
|
||||
|
||||
TARGA LOADING
|
||||
|
||||
=========================================================
|
||||
*/
|
||||
|
||||
typedef struct _TargaHeader {
|
||||
unsigned char id_length, colormap_type, image_type;
|
||||
unsigned short colormap_index, colormap_length;
|
||||
unsigned char colormap_size;
|
||||
unsigned short x_origin, y_origin, width, height;
|
||||
unsigned char pixel_size, attributes;
|
||||
} TargaHeader;
|
||||
|
||||
|
||||
/*
|
||||
=============
|
||||
LoadTGA
|
||||
=============
|
||||
*/
|
||||
static void LoadTGA (char *name, byte **pic, int *width, int *height)
|
||||
{
|
||||
int columns, rows, numPixels;
|
||||
byte *pixbuf;
|
||||
int row, column;
|
||||
byte *buf_p;
|
||||
byte *buffer;
|
||||
int length;
|
||||
TargaHeader targa_header;
|
||||
byte *targa_rgba;
|
||||
byte tmp[2];
|
||||
|
||||
*pic = NULL;
|
||||
|
||||
//
|
||||
// load the file
|
||||
//
|
||||
length = ri.FS_LoadFile (name, (void **)&buffer);
|
||||
if (!length || !buffer)
|
||||
{
|
||||
R_Printf(PRINT_DEVELOPER, "%s(): Bad tga file %s\n", __func__, name);
|
||||
return;
|
||||
}
|
||||
|
||||
buf_p = buffer;
|
||||
|
||||
targa_header.id_length = *buf_p++;
|
||||
targa_header.colormap_type = *buf_p++;
|
||||
targa_header.image_type = *buf_p++;
|
||||
|
||||
tmp[0] = buf_p[0];
|
||||
tmp[1] = buf_p[1];
|
||||
targa_header.colormap_index = LittleShort ( *((short *)tmp) );
|
||||
buf_p+=2;
|
||||
tmp[0] = buf_p[0];
|
||||
tmp[1] = buf_p[1];
|
||||
targa_header.colormap_length = LittleShort ( *((short *)tmp) );
|
||||
buf_p+=2;
|
||||
targa_header.colormap_size = *buf_p++;
|
||||
targa_header.x_origin = LittleShort ( *((short *)buf_p) );
|
||||
buf_p+=2;
|
||||
targa_header.y_origin = LittleShort ( *((short *)buf_p) );
|
||||
buf_p+=2;
|
||||
targa_header.width = LittleShort ( *((short *)buf_p) );
|
||||
buf_p+=2;
|
||||
targa_header.height = LittleShort ( *((short *)buf_p) );
|
||||
buf_p+=2;
|
||||
targa_header.pixel_size = *buf_p++;
|
||||
targa_header.attributes = *buf_p++;
|
||||
|
||||
if (targa_header.image_type!=2
|
||||
&& targa_header.image_type!=10)
|
||||
ri.Sys_Error (ERR_DROP, "LoadTGA: Only type 2 and 10 targa RGB images supported\n");
|
||||
|
||||
if (targa_header.colormap_type !=0
|
||||
|| (targa_header.pixel_size!=32 && targa_header.pixel_size!=24))
|
||||
ri.Sys_Error (ERR_DROP, "LoadTGA: Only 32 or 24 bit images supported (no colormaps)\n");
|
||||
|
||||
columns = targa_header.width;
|
||||
rows = targa_header.height;
|
||||
numPixels = columns * rows;
|
||||
|
||||
if (width)
|
||||
*width = columns;
|
||||
if (height)
|
||||
*height = rows;
|
||||
|
||||
targa_rgba = malloc (numPixels*4);
|
||||
*pic = targa_rgba;
|
||||
|
||||
if (targa_header.id_length != 0)
|
||||
buf_p += targa_header.id_length; // skip TARGA image comment
|
||||
|
||||
if (targa_header.image_type==2) { // Uncompressed, RGB images
|
||||
for(row=rows-1; row>=0; row--) {
|
||||
pixbuf = targa_rgba + row*columns*4;
|
||||
for(column=0; column<columns; column++) {
|
||||
unsigned char red,green,blue,alphabyte;
|
||||
switch (targa_header.pixel_size) {
|
||||
case 24:
|
||||
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
*pixbuf++ = red;
|
||||
*pixbuf++ = green;
|
||||
*pixbuf++ = blue;
|
||||
*pixbuf++ = 255;
|
||||
break;
|
||||
case 32:
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
alphabyte = *buf_p++;
|
||||
*pixbuf++ = red;
|
||||
*pixbuf++ = green;
|
||||
*pixbuf++ = blue;
|
||||
*pixbuf++ = alphabyte;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (targa_header.image_type==10) { // Runlength encoded RGB images
|
||||
unsigned char red = 0,green = 0,blue = 0,alphabyte = 0,packetHeader,packetSize,j;
|
||||
for(row=rows-1; row>=0; row--) {
|
||||
pixbuf = targa_rgba + row*columns*4;
|
||||
for(column=0; column<columns; ) {
|
||||
packetHeader= *buf_p++;
|
||||
packetSize = 1 + (packetHeader & 0x7f);
|
||||
if (packetHeader & 0x80) { // run-length packet
|
||||
switch (targa_header.pixel_size) {
|
||||
case 24:
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
alphabyte = 255;
|
||||
break;
|
||||
case 32:
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
alphabyte = *buf_p++;
|
||||
break;
|
||||
}
|
||||
|
||||
for(j=0;j<packetSize;j++) {
|
||||
*pixbuf++=red;
|
||||
*pixbuf++=green;
|
||||
*pixbuf++=blue;
|
||||
*pixbuf++=alphabyte;
|
||||
column++;
|
||||
if (column==columns) { // run spans across rows
|
||||
column=0;
|
||||
if (row>0)
|
||||
row--;
|
||||
else
|
||||
goto breakOut;
|
||||
pixbuf = targa_rgba + row*columns*4;
|
||||
}
|
||||
}
|
||||
}
|
||||
else { // non run-length packet
|
||||
for(j=0;j<packetSize;j++) {
|
||||
switch (targa_header.pixel_size) {
|
||||
case 24:
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
*pixbuf++ = red;
|
||||
*pixbuf++ = green;
|
||||
*pixbuf++ = blue;
|
||||
*pixbuf++ = 255;
|
||||
break;
|
||||
case 32:
|
||||
blue = *buf_p++;
|
||||
green = *buf_p++;
|
||||
red = *buf_p++;
|
||||
alphabyte = *buf_p++;
|
||||
*pixbuf++ = red;
|
||||
*pixbuf++ = green;
|
||||
*pixbuf++ = blue;
|
||||
*pixbuf++ = alphabyte;
|
||||
break;
|
||||
}
|
||||
column++;
|
||||
if (column==columns) { // pixel packet run spans across rows
|
||||
column=0;
|
||||
if (row>0)
|
||||
row--;
|
||||
else
|
||||
goto breakOut;
|
||||
pixbuf = targa_rgba + row*columns*4;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
breakOut:;
|
||||
}
|
||||
}
|
||||
|
||||
ri.FS_FreeFile (buffer);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
|
||||
|
@ -1472,7 +1265,8 @@ Vk_LoadImage(char *name, const char* namewe, const char *ext, imagetype_t type,
|
|||
}
|
||||
else if (!strcmp(ext, "tga"))
|
||||
{
|
||||
LoadTGA (name, &pic, &width, &height);
|
||||
if (!LoadSTB (namewe, "tga", &pic, &width, &height))
|
||||
return NULL;
|
||||
if (!pic)
|
||||
return NULL;
|
||||
image = Vk_LoadPic(name, pic,
|
||||
|
|
Loading…
Reference in a new issue