/// <summary> /// Converts to the format /// </summary> /// <returns>The task</returns> public override async Task ConvertToAsync() { var attr = GameModeSelection.SelectedValue.GetAttribute <OpenSpaceGameModeInfoAttribute>(); var settings = OpenSpaceSettings.GetDefaultSettings(attr.Game, attr.Platform); await ConvertToAsync <OpenSpaceGFFile>(settings, (filePath, format) => { // Create the GF data var gf = new OpenSpaceGFFile { // Set the .gf format GFPixelFormat = Enum.Parse(typeof(OpenSpaceGFFormat), format).CastTo <OpenSpaceGFFormat>() }; // Read the image using var bmp = new Bitmap(filePath); // IDEA: If bmp is not in supported format, then convert it? // Import from the bitmap gf.ImportFromBitmap(settings, new RawBitmapData(bmp), RCPServices.Data.Archive_GF_GenerateMipmaps); // Return the data return(gf); }, new FileFilterItemCollection(ImageHelpers.GetSupportedBitmapExtensions().Select(x => new FileFilterItem($"*{x}", x.Substring(1).ToUpper()))).ToString(), new FileExtension(".gf"), Enum.GetNames(typeof(OpenSpaceGFFormat))); }
/// <summary> /// Converts the import file data from the input stream to the output stream /// </summary> /// <param name="fileBytes">The file bytes</param> /// <param name="inputStream">The input stream to import from</param> /// <param name="outputStream">The destination stream</param> /// <param name="format">The file format to use</param> public void ConvertImportData(byte[] fileBytes, Stream inputStream, Stream outputStream, FileExtension format) { // Load the bitmap using var bmp = new Bitmap(inputStream); // Load the current file OpenSpaceGFFile gf = GetFileContent(fileBytes); // IDEA: If bmp is not in supported format, then convert it? RawBitmapData rawBitmapData; // Get the bitmap lock using (var bmpLock = new BitmapLock(bmp)) { // Get the raw bitmap data rawBitmapData = new RawBitmapData(bmp.Width, bmp.Height, bmpLock.Pixels, bmp.PixelFormat); // Force the new pixel format to be 888 or 8888 if set to do so if (RCPServices.Data.Archive_GF_ForceGF8888Import) { gf.GFPixelFormat = gf.GFPixelFormat.SupportsTransparency() ? OpenSpaceGFFormat.Format_32bpp_BGRA_8888 : OpenSpaceGFFormat.Format_24bpp_BGR_888; } // Check if the format should be updated for transparency if (RCPServices.Data.Archive_GF_UpdateTransparency != Archive_GF_TransparencyMode.PreserveFormat) { // NOTE: Only 24 and 32 bpp bitmaps are supported // Check if the imported file is transparent var isTransparent = bmp.PixelFormat switch { PixelFormat.Format32bppArgb => (RCPServices.Data.Archive_GF_UpdateTransparency == Archive_GF_TransparencyMode.UpdateBasedOnPixelFormat || bmpLock.UtilizesAlpha()), PixelFormat.Format24bppRgb => false, _ => (bool?)null }; // NOTE: Currently only supported for formats with 3 or 4 channels // Check if the format should be updated for transparency if (gf.Channels >= 3 && isTransparent != null) { // Update the format gf.GFPixelFormat = isTransparent.Value ? OpenSpaceGFFormat.Format_32bpp_BGRA_8888 : OpenSpaceGFFormat.Format_24bpp_BGR_888; } } } // Import the bitmap gf.ImportFromBitmap(Settings, rawBitmapData, RCPServices.Data.Archive_GF_GenerateMipmaps); // Serialize the data to get the bytes BinarySerializableHelpers.WriteToStream(gf, outputStream, Settings, RCPServices.App.GetBinarySerializerLogger()); } #endregion }