void WriteBitmap(const TCHAR* BitmapBaseName, SampleType* Samples, int32 Width, int32 Height) { // Without any data, just return if( Samples == NULL ) { return; } // look to make sure that any texel has been mapped bool bTextureIsMapped = false; for(int32 Y = 0; Y < Height; Y++) { for(int32 X = 0; X < Width; X++) { const SampleType& Sample = Samples[Y * Width + X]; if (Sample.bIsMapped) { bTextureIsMapped = true; break; } } } // if it's all black, just punt out if (!bTextureIsMapped) { return; } #pragma pack (push,1) struct BITMAPFILEHEADER { uint16 bfType GCC_PACK(1); uint32 bfSize GCC_PACK(1); uint16 bfReserved1 GCC_PACK(1); uint16 bfReserved2 GCC_PACK(1); uint32 bfOffBits GCC_PACK(1); } FH;
/** * Saves a 24Bit BMP file to disk * * @param Pattern filename with path, must not be 0, if with "bmp" extension (e.g. "out.bmp") the filename stays like this, if without (e.g. "out") automatic index numbers are addended (e.g. "out00002.bmp") * @param DataWidth - Width of the bitmap supplied in Data >0 * @param DataHeight - Height of the bitmap supplied in Data >0 * @param Data must not be 0 * @param SubRectangle optional, specifies a sub-rectangle of the source image to save out. If NULL, the whole bitmap is saved * @param FileManager must not be 0 * @param OutFilename optional, if specified filename will be output * * @return true if success */ bool FFileHelper::CreateBitmap( const TCHAR* Pattern, int32 SourceWidth, int32 SourceHeight, const FColor* Data, struct FIntRect* SubRectangle, IFileManager* FileManager /*= &IFileManager::Get()*/, FString* OutFilename /*= NULL*/, bool bInWriteAlpha /*= false*/ ) { #if ALLOW_DEBUG_FILES FIntRect Src(0, 0, SourceWidth, SourceHeight); if (SubRectangle == NULL || SubRectangle->Area() == 0) { SubRectangle = &Src; } FString File; // if the Pattern already has a .bmp extension, then use that the file to write to if (FPaths::GetExtension(Pattern) == TEXT("bmp")) { File = Pattern; } else { if (GenerateNextBitmapFilename(Pattern, TEXT("bmp"), File, FileManager)) { if ( OutFilename ) { *OutFilename = File; } } else { return false; } } FArchive* Ar = FileManager->CreateDebugFileWriter( *File ); if( Ar ) { // Types. #if PLATFORM_SUPPORTS_PRAGMA_PACK #pragma pack (push,1) #endif struct BITMAPFILEHEADER { uint16 bfType GCC_PACK(1); uint32 bfSize GCC_PACK(1); uint16 bfReserved1 GCC_PACK(1); uint16 bfReserved2 GCC_PACK(1); uint32 bfOffBits GCC_PACK(1); } FH; struct BITMAPINFOHEADER { uint32 biSize GCC_PACK(1); int32 biWidth GCC_PACK(1); int32 biHeight GCC_PACK(1); uint16 biPlanes GCC_PACK(1); uint16 biBitCount GCC_PACK(1); uint32 biCompression GCC_PACK(1); uint32 biSizeImage GCC_PACK(1); int32 biXPelsPerMeter GCC_PACK(1); int32 biYPelsPerMeter GCC_PACK(1); uint32 biClrUsed GCC_PACK(1); uint32 biClrImportant GCC_PACK(1); } IH;