diff --git a/neo/swf/SWF_Main.cpp b/neo/swf/SWF_Main.cpp index 29c84671..d38694f8 100644 --- a/neo/swf/SWF_Main.cpp +++ b/neo/swf/SWF_Main.cpp @@ -29,12 +29,14 @@ If you have questions concerning this license or the applicable additional terms #pragma hdrstop #include "precompiled.h" #include "../renderer/Image.h" +#include "../renderer/DXT//DXTCodec.h" #pragma warning(disable: 4355) // 'this' : used in base member initializer list idCVar swf_loadBinary( "swf_loadBinary", "1", CVAR_INTEGER, "used to set whether to load binary swf from generated" ); // RB begin idCVar swf_exportXML( "swf_exportXML", "1", CVAR_INTEGER, "" ); +idCVar swf_exportAtlas( "swf_exportAtlas", "1", CVAR_INTEGER, "" ); // RB end int idSWF::mouseX = -1; @@ -157,12 +159,114 @@ idSWF::idSWF( const char* filename_, idSoundWorld* soundWorld_ ) WriteXML( xmlFileName ); } - // RB end idStr atlasFileName = binaryFileName; atlasFileName.SetFileExtension( ".tga" ); atlasMaterial = declManager->FindMaterial( atlasFileName ); + if( swf_exportAtlas.GetBool() ) + { + idStrStatic< MAX_OSPATH > generatedName = atlasFileName; + generatedName.StripFileExtension(); + idImage::GetGeneratedName( generatedName, TD_DEFAULT, CF_2D ); + + idBinaryImage im( generatedName ); + ID_TIME_T binaryFileTime = im.LoadFromGeneratedFile( FILE_NOT_FOUND_TIMESTAMP ); + + if( binaryFileTime != FILE_NOT_FOUND_TIMESTAMP ) + { + const bimageFile_t& imgHeader = im.GetFileHeader(); + const bimageImage_t& img = im.GetImageHeader( 0 ); + + const byte* data = im.GetImageData( 0 ); + + //( img.level, 0, 0, img.destZ, img.width, img.height, data ); + + idTempArray rgba( img.width * img.height * 4 ); + memset( rgba.Ptr(), 255, rgba.Size() ); + + if( imgHeader.format == FMT_DXT1 ) + { + idDxtDecoder dxt; + dxt.DecompressImageDXT1( data, rgba.Ptr(), img.width, img.height ); + } + else if( imgHeader.format == FMT_DXT5 ) + { + idDxtDecoder dxt; + + if( imgHeader.colorFormat == CFM_NORMAL_DXT5 ) + { + dxt.DecompressNormalMapDXT5( data, rgba.Ptr(), img.width, img.height ); + } + else if( imgHeader.colorFormat == CFM_YCOCG_DXT5 ) + { + dxt.DecompressYCoCgDXT5( data, rgba.Ptr(), img.width, img.height ); + } + else + { + + dxt.DecompressImageDXT5( data, rgba.Ptr(), img.width, img.height ); + } + } + else if( imgHeader.format == FMT_LUM8 || imgHeader.format == FMT_INT8 ) + { + // LUM8 and INT8 just read the red channel + byte* pic = rgba.Ptr(); + for( int i = 0; i < img.dataSize; i++ ) + { + pic[ i * 4 ] = data[ i ]; + } + } + else if( imgHeader.format == FMT_ALPHA ) + { + // ALPHA reads the alpha channel + byte* pic = rgba.Ptr(); + for( int i = 0; i < img.dataSize; i++ ) + { + pic[ i * 4 + 3 ] = data[ i ]; + } + } + else if( imgHeader.format == FMT_L8A8 ) + { + // L8A8 reads the alpha and red channels + byte* pic = rgba.Ptr(); + for( int i = 0; i < img.dataSize / 2; i++ ) + { + pic[ i * 4 + 0 ] = data[ i * 2 + 0 ]; + pic[ i * 4 + 3 ] = data[ i * 2 + 1 ]; + } + } + else if( imgHeader.format == FMT_RGB565 ) + { + // FIXME + /* + byte* pic = rgba.Ptr(); + for( int i = 0; i < img.dataSize / 2; i++ ) + { + unsigned short color = ( ( pic[ i * 4 + 0 ] >> 3 ) << 11 ) | ( ( pic[ i * 4 + 1 ] >> 2 ) << 5 ) | ( pic[ i * 4 + 2 ] >> 3 ); + img.data[ i * 2 + 0 ] = ( color >> 8 ) & 0xFF; + img.data[ i * 2 + 1 ] = color & 0xFF; + } + */ + } + else + { + byte* pic = rgba.Ptr(); + for( int i = 0; i < img.dataSize; i++ ) + { + pic[ i ] = data[ i ]; + } + } + + idStr atlasFileNameExport = atlasFileName; + atlasFileNameExport.SetFileExtension( ".png" ); + + R_WritePNG( atlasFileNameExport, rgba.Ptr(), 4, img.width, img.height, true, "fs_basepath" ); + } + + } + // RB end + globals = idSWFScriptObject::Alloc(); globals->Set( "_global", globals ); diff --git a/neo/swf/SWF_Sprites.cpp b/neo/swf/SWF_Sprites.cpp index f622bcbd..86655efa 100644 --- a/neo/swf/SWF_Sprites.cpp +++ b/neo/swf/SWF_Sprites.cpp @@ -321,6 +321,7 @@ void idSWFSprite::WriteXML( idFile* f, const char* indentPrefix, int characterID } +#if 1 idBase64 base64; for( int i = 0; i < commands.Num(); i++ ) @@ -366,6 +367,7 @@ void idSWFSprite::WriteXML( idFile* f, const char* indentPrefix, int characterID //f->WriteFloatString( "%s\t%s\n", indentPrefix, doInitActions[i].Length(), doInitActions[i].Ptr() ); } +#endif f->WriteFloatString( "%s\n", indentPrefix ); }