void LoadJPG( const char *filename, unsigned char **pic, int *width, int *height ) { unsigned char *fbuffer = NULL; int nLen = vfsLoadFile ((char *)filename, (void **)&fbuffer, 0 ); if (nLen == -1) return; if ( LoadJPGBuff( fbuffer, nLen, pic, width, height ) != 0 ) { g_FuncTable.m_pfnSysPrintf( "WARNING: JPEG library failed to load %s because %s\n", filename, *pic ); *pic = NULL; } vfsFreeFile( fbuffer ); }
image_t *ImageLoad( const char *filename ) { int i; image_t *image; char name[ 1024 ]; int size; byte *buffer = NULL; qboolean alphaHack = qfalse; /* init */ ImageInit(); /* dummy check */ if( filename == NULL || filename[ 0 ] == '\0' ) return NULL; /* strip file extension off name */ strcpy( name, filename ); StripExtension( name ); /* try to find existing image */ image = ImageFind( name ); if( image != NULL ) { image->refCount++; return image; } /* none found, so find first non-null image */ image = NULL; for( i = 0; i < MAX_IMAGES; i++ ) { if( images[ i ].name == NULL ) { image = &images[ i ]; break; } } /* too many images? */ if( image == NULL ) Error( "MAX_IMAGES (%d) exceeded, there are too many image files referenced by the map.", MAX_IMAGES ); /* set it up */ image->name = safe_malloc( strlen( name ) + 1 ); strcpy( image->name, name ); /* attempt to load tga */ StripExtension( name ); strcat( name, ".tga" ); size = vfsLoadFile( (const char*) name, (void**) &buffer, 0 ); if( size > 0 ) LoadTGABuffer( buffer, buffer + size, &image->pixels, &image->width, &image->height ); else { /* attempt to load png */ StripExtension( name ); strcat( name, ".png" ); size = vfsLoadFile( (const char*) name, (void**) &buffer, 0 ); if( size > 0 ) LoadPNGBuffer( buffer, size, &image->pixels, &image->width, &image->height ); else { /* attempt to load jpg */ StripExtension( name ); strcat( name, ".jpg" ); size = vfsLoadFile( (const char*) name, (void**) &buffer, 0 ); if( size > 0 ) { if( LoadJPGBuff( buffer, size, &image->pixels, &image->width, &image->height ) == -1 && image->pixels != NULL ) Sys_Printf( "WARNING: LoadJPGBuff: %s\n", (unsigned char*) image->pixels ); alphaHack = qtrue; } else { /* attempt to load dds */ StripExtension( name ); strcat( name, ".dds" ); size = vfsLoadFile( (const char*) name, (void**) &buffer, 0 ); if( size > 0 ) { LoadDDSBuffer( buffer, size, &image->pixels, &image->width, &image->height ); /* debug code */ #if 1 { ddsPF_t pf; DDSGetInfo( (ddsBuffer_t*) buffer, NULL, NULL, &pf ); Sys_Printf( "pf = %d\n", pf ); if( image->width > 0 ) { StripExtension( name ); strcat( name, "_converted.tga" ); WriteTGA( "C:\\games\\quake3\\baseq3\\textures\\rad\\dds_converted.tga", image->pixels, image->width, image->height ); } } #endif } } } } /* free file buffer */ free( buffer ); /* make sure everything's kosher */ if( size <= 0 || image->width <= 0 || image->height <= 0 || image->pixels == NULL ) { //% Sys_Printf( "size = %d width = %d height = %d pixels = 0x%08x (%s)\n", //% size, image->width, image->height, image->pixels, name ); free( image->name ); image->name = NULL; return NULL; } /* set filename */ image->filename = safe_malloc( strlen( name ) + 1 ); strcpy( image->filename, name ); /* set count */ image->refCount = 1; numImages++; if(alphaHack) { StripExtension( name ); strcat( name, "_alpha.jpg" ); size = vfsLoadFile( (const char*) name, (void**) &buffer, 0 ); if( size > 0 ) { unsigned char *pixels; int width, height; if( LoadJPGBuff( buffer, size, &pixels, &width, &height ) == -1 && pixels != NULL ) Sys_Printf( "WARNING: LoadJPGBuff: %s\n", (unsigned char*) image->pixels ); if(pixels && width == image->width && height == image->height) { int i; for(i = 0; i < width*height; ++i) image->pixels[4*i+3] = pixels[4*i+2]; // copy alpha from blue channel } free(pixels); free(buffer); } } /* return the image */ return image; }