/* ============ ConvFNT ============ */ bool ConvFNT( const char *name, byte *buffer, size_t filesize, const char *ext ) { rgbdata_t *pic = FS_LoadImage( va( "#%s.fnt", name ), buffer, filesize ); if( pic ) { FS_SaveImage(va("%s/%s.%s", gs_gamedir, name, ext ), pic ); Msg("%s.fnt\n", name ); // echo to console FS_FreeImage( pic ); return true; } return false; }
/* ============= ConvPCX this also uses by SP2_ConvertFrame ============= */ bool ConvPCX( const char *name, byte *buffer, size_t filesize, const char *ext ) { rgbdata_t *pic = FS_LoadImage( va( "#%s.pcx", name ), buffer, filesize ); if( pic ) { FS_SaveImage( va("%s/%s.%s", gs_gamedir, name, ext ), pic ); // pcx images not required shader because it hud pics or sprite frames Msg( "%s.pcx\n", name ); // echo to console FS_FreeImage( pic ); return true; } return false; }
/* ============= ConvBMP ============= */ bool ConvBMP( const char *name, byte *buffer, size_t filesize, const char *ext ) { rgbdata_t *pic = FS_LoadImage( va( "#%s.bmp", name ), buffer, filesize ); if( pic ) { FS_SaveImage( va("%s/%s.%s", gs_gamedir, name, ext ), pic ); Conv_CreateShader( name, pic, ext, NULL, 0, 0 ); Msg( "%s.bmp\n", name, ext ); // echo to console FS_FreeImage( pic ); return true; } return false; }
/* ============ ConvWAL ============ */ bool ConvWAL( const char *name, byte *buffer, size_t filesize, const char *ext ) { rgbdata_t *pic = FS_LoadImage( va( "#%s.wal", name ), buffer, filesize ); if( pic ) { wal_t *wal = (wal_t *)buffer; FS_SaveImage( va("%s/%s.%s", gs_gamedir, name, ext ), pic ); Conv_CreateShader( name, pic, ext, wal->animname, wal->flags, wal->contents ); Msg("%s.wal\n", name ); // echo to console FS_FreeImage( pic ); return true; } return false; }
/* ================= VID_CubemapShot ================= */ qboolean VID_CubemapShot( const char *base, uint size, const float *vieworg, qboolean skyshot ) { rgbdata_t *r_shot, *r_side; byte *temp = NULL; byte *buffer = NULL; string basename; int i = 1, flags, result; if( !RI.drawWorld || !cl.worldmodel ) return false; // make sure the specified size is valid while( i < size ) i<<=1; if( i != size ) return false; if( size > glState.width || size > glState.height ) return false; // setup refdef RI.params |= RP_ENVVIEW; // do not render non-bmodel entities // alloc space temp = Mem_Alloc( r_temppool, size * size * 3 ); buffer = Mem_Alloc( r_temppool, size * size * 3 * 6 ); r_shot = Mem_Alloc( r_temppool, sizeof( rgbdata_t )); r_side = Mem_Alloc( r_temppool, sizeof( rgbdata_t )); // use client vieworg if( !vieworg ) vieworg = cl.refdef.vieworg; for( i = 0; i < 6; i++ ) { // go into 3d mode R_Set2DMode( false ); if( skyshot ) { R_DrawCubemapView( vieworg, r_skyBoxInfo[i].angles, size ); flags = r_skyBoxInfo[i].flags; } else { R_DrawCubemapView( vieworg, r_envMapInfo[i].angles, size ); flags = r_envMapInfo[i].flags; } pglReadPixels( 0, 0, size, size, GL_RGB, GL_UNSIGNED_BYTE, temp ); r_side->flags = IMAGE_HAS_COLOR; r_side->width = r_side->height = size; r_side->type = PF_RGB_24; r_side->size = r_side->width * r_side->height * 3; r_side->buffer = temp; if( flags ) Image_Process( &r_side, 0, 0, 0.0f, flags, NULL ); Q_memcpy( buffer + (size * size * 3 * i), r_side->buffer, size * size * 3 ); } RI.params &= ~RP_ENVVIEW; r_shot->flags = IMAGE_HAS_COLOR; r_shot->flags |= (skyshot) ? IMAGE_SKYBOX : IMAGE_CUBEMAP; r_shot->width = size; r_shot->height = size; r_shot->type = PF_RGB_24; r_shot->size = r_shot->width * r_shot->height * 3 * 6; r_shot->palette = NULL; r_shot->buffer = buffer; // make sure what we have right extension Q_strncpy( basename, base, MAX_STRING ); FS_StripExtension( basename ); FS_DefaultExtension( basename, ".tga" ); // write image as 6 sides result = FS_SaveImage( basename, r_shot ); FS_FreeImage( r_shot ); FS_FreeImage( r_side ); return result; }
qboolean VID_ScreenShot( const char *filename, int shot_type ) { rgbdata_t *r_shot; uint flags = IMAGE_FLIP_Y; int width = 0, height = 0; qboolean result; r_shot = Mem_Alloc( r_temppool, sizeof( rgbdata_t )); r_shot->width = (glState.width + 3) & ~3; r_shot->height = (glState.height + 3) & ~3; r_shot->flags = IMAGE_HAS_COLOR | IMAGE_HAS_ALPHA; r_shot->type = PF_RGBA_32; r_shot->size = r_shot->width * r_shot->height * PFDesc[r_shot->type].bpp; r_shot->palette = NULL; r_shot->buffer = Mem_Alloc( r_temppool, r_shot->size ); // get screen frame pglPixelStorei(GL_PACK_ALIGNMENT, 1); // PANDORA, just in case pglReadPixels( 0, 0, r_shot->width, r_shot->height, GL_RGBA, GL_UNSIGNED_BYTE, r_shot->buffer ); switch( shot_type ) { case VID_SCREENSHOT: if( !gl_overview->integer ) VID_ImageAdjustGamma( r_shot->buffer, r_shot->width, r_shot->height ); // scrshot gamma break; case VID_SNAPSHOT: if( !gl_overview->integer ) VID_ImageAdjustGamma( r_shot->buffer, r_shot->width, r_shot->height ); // scrshot gamma FS_AllowDirectPaths( true ); break; case VID_LEVELSHOT: flags |= IMAGE_RESAMPLE; if( glState.wideScreen ) { height = 480; width = 800; } else { height = 480; width = 640; } break; case VID_MINISHOT: flags |= IMAGE_RESAMPLE; height = 200; width = 320; break; case VID_MAPSHOT: V_WriteOverviewScript(); // store overview script too flags |= IMAGE_RESAMPLE|IMAGE_QUANTIZE; // GoldSrc request overviews in 8-bit format height = 768; width = 1024; break; } Image_Process( &r_shot, width, height, 0.0f, flags, NULL ); // write image result = FS_SaveImage( filename, r_shot ); host.write_to_clipboard = false; // disable write to clipboard FS_AllowDirectPaths( false ); // always reset after store screenshot FS_FreeImage( r_shot ); return result; }