private Image LoadDDSSquish(string name) { Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(ThumbnailCallback); DdsFile dds = new DdsFile(); name = File.Exists(name) == false ? "Resources/texture.dds" : name; var bLoaded = false; using (var stream = File.Open(name, FileMode.Open)) { try { dds.Load(stream); bLoaded = true; } catch (Exception ex) { Utils.Logging.Log.WriteLine("Failed to load DDS: " + name, Utils.Logging.LoggingTypes.WARNING); } } Image thumbnail = null; if (bLoaded) { thumbnail = dds.Image().GetThumbnailImage(128, 120, myCallback, IntPtr.Zero); } else { thumbnail = LoadDDSSquish("Resources/texture.dds"); } dds = null; return(thumbnail); }
/// <summary> /// Gets the DDS. /// </summary> /// <param name="stream">The stream.</param> /// <returns>MemoryStream.</returns> /// <exception cref="System.AggregateException"></exception> private async Task <MemoryStream> GetDDS(Stream stream) { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } var exceptions = new List <Exception>(); MemoryStream ms = null; // Default provider (SixLabors.Textures) try { var image = await ddsDecoder.DecodeStreamToImageAsync(stream); ms = new MemoryStream(); await image.SaveAsPngAsync(ms); } catch (Exception ex) { if (ms != null) { ms.Close(); await ms.DisposeAsync(); } ms = null; exceptions.Add(ex); } // fallback #1 (BCnEncoder.NET) if (ms == null) { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } try { var file = DdsFile.Load(stream); var image = await ddsDecoder.DecodeToImageAsync(file); ms = new MemoryStream(); await image.SaveAsPngAsync(ms); } catch (Exception ex) { if (ms != null) { ms.Close(); await ms.DisposeAsync(); } ms = null; exceptions.Add(ex); } } // fallback #2 (pfim) if (ms == null) { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } try { using var pfimImage = Dds.Create(stream, new PfimConfig()); if (pfimImage.Compressed) { pfimImage.Decompress(); } if (pfimImage.Format == ImageFormat.Rgba32) { ms = new MemoryStream(); using var image = Image.LoadPixelData <Bgra32>(ddsDecoder.TightData(pfimImage), pfimImage.Width, pfimImage.Height); await image.SaveAsPngAsync(ms); } else if (pfimImage.Format == ImageFormat.Rgb24) { ms = new MemoryStream(); using var image = Image.LoadPixelData <Bgr24>(ddsDecoder.TightData(pfimImage), pfimImage.Width, pfimImage.Height); await image.SaveAsPngAsync(ms); } } catch (Exception ex) { if (ms != null) { ms.Close(); await ms.DisposeAsync(); } ms = null; exceptions.Add(ex); } } // Fallback can result in memory stream being empty so throw aggregate exception only if all attempts failed if (ms == null && exceptions.Count == 3) { throw new AggregateException(exceptions); } return(ms); }
protected override Document OnLoad( Stream input ) { DdsFile ddsFile = new DdsFile(); ddsFile.Load( input ); BitmapLayer layer = Layer.CreateBackgroundLayer( ddsFile.GetWidth(), ddsFile.GetHeight() ); Surface surface = layer.Surface; ColorBgra writeColour = new ColorBgra(); byte[] readPixelData = ddsFile.GetPixelData(); for ( int y = 0; y < ddsFile.GetHeight(); y++ ) { for ( int x = 0; x < ddsFile.GetWidth(); x++ ) { int readPixelOffset = ( y * ddsFile.GetWidth() * 4 ) + ( x * 4 ); writeColour.R = readPixelData[ readPixelOffset + 0 ]; writeColour.G = readPixelData[ readPixelOffset + 1 ]; writeColour.B = readPixelData[ readPixelOffset + 2 ]; writeColour.A = readPixelData[ readPixelOffset + 3 ]; surface[ x, y ] = writeColour; } } // Create a document, add the surface layer to it, and return to caller. Document document = new Document( surface.Width, surface.Height ); document.Layers.Add( layer ); return document; }
private void openTattooPackageToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = PackageFilter; openFileDialog1.Title = "Select Tattoo Package File"; openFileDialog1.FilterIndex = 1; openFileDialog1.CheckFileExists = true; if (openFileDialog1.ShowDialog() != DialogResult.OK) { return; } Package myPack; try { myPack = (Package)Package.OpenPackage(0, openFileDialog1.FileName); } catch (Exception ex) { MessageBox.Show("Cannot open package: " + openFileDialog1.FileName + " - Error is:" + System.Environment.NewLine + ex.Message + System.Environment.NewLine + ex.InnerException); return; } Predicate <IResourceIndexEntry> isCASP = r => r.ResourceType == (uint)ResourceTypes.CASP; List <IResourceIndexEntry> CASPlist = myPack.FindAll(isCASP); if (CASPlist.Count == 0) { MessageBox.Show("No CASP files found in package!"); Package.ClosePackage(0, (IPackage)myPack); return; } Predicate <IResourceIndexEntry> isKEY = r => r.ResourceType == (uint)ResourceTypes.KEY; IResourceIndexEntry irKey = myPack.Find(isKEY); NameMapResource.NameMapResource nMap = null; if (irKey != null) { Stream n = myPack.GetResource(irKey); nMap = new NameMapResource.NameMapResource(0, n); } int numTattoos = 0; foreach (IResourceIndexEntry r in CASPlist) { Stream s = myPack.GetResource(r); s.Position = 0; CASPartResource.CASPartResource casp = new CASPartResource.CASPartResource(0, s); if (casp.Clothing == ClothingType.TattooTemplate) { numTattoos++; string tatName = ""; if (casp.Presets.Count > 0) { XmlDocument imp = new XmlDocument(); imp.LoadXml(casp.Presets[0].XmlFile.ReadToEnd()); XmlNodeList nodes = imp.GetElementsByTagName("value"); foreach (XmlNode n in nodes) { if (n.Attributes["key"].InnerXml.Contains("daeFileName")) { tatName = n.Attributes["value"].InnerXml; break; } } } string tmp; if (nMap != null && nMap.TryGetValue(r.Instance, out tmp)) { tatName = tmp; } DialogResult res = MessageBox.Show("Open tattoo: " + tatName + "?", "Select Tattoo", MessageBoxButtons.YesNoCancel); if (res == DialogResult.Yes) { bool gotImage = false; for (int i = 0; i < Math.Min(casp.Presets.Count, 3); i++) { XmlDocument imp = new XmlDocument(); imp.LoadXml(casp.Presets[i].XmlFile.ReadToEnd()); XmlNodeList nodes = imp.GetElementsByTagName("value"); foreach (XmlNode n in nodes) { if (n.Attributes["key"].InnerXml.Contains("Layer1ColorR")) { presets[i].rChannelColor = new Color(n.Attributes["value"].InnerXml); } else if (n.Attributes["key"].InnerXml.Contains("Layer1ColorG")) { presets[i].gChannelColor = new Color(n.Attributes["value"].InnerXml); } else if (n.Attributes["key"].InnerXml.Contains("Layer1ColorB")) { presets[i].bChannelColor = new Color(n.Attributes["value"].InnerXml); } else if (n.Attributes["key"].InnerXml.Contains("Layer1ColorA")) { presets[i].aChannelColor = new Color(n.Attributes["value"].InnerXml); } else if (n.Attributes["key"].InnerXml.Contains("Layer1Mask") && !gotImage) { string[] imgTgi = n.Attributes["value"].InnerXml.Split(':'); Predicate <IResourceIndexEntry> isIMG; try { isIMG = ri => ri.ResourceType == UInt32.Parse(imgTgi[1], System.Globalization.NumberStyles.HexNumber) & ri.ResourceGroup == UInt32.Parse(imgTgi[2], System.Globalization.NumberStyles.HexNumber) & ri.Instance == UInt64.Parse(imgTgi[3], System.Globalization.NumberStyles.HexNumber); } catch { MessageBox.Show("Could not parse TGI of tattoo image!"); return; } IResourceIndexEntry img = myPack.Find(isIMG); if (img != null) { Stream d = myPack.GetResource(img); d.Position = 0; dds = new DdsFile(); dds.Load(d, false); ddsOriginal = new DdsFile(); ddsOriginal.CreateImage(dds, false); gotImage = true; } } } } if (!gotImage) { MessageBox.Show("Could not find tattoo image!"); } bgColor = new Color(0x00D2B48Cu); BGcolor_panel.BackColor = System.Drawing.Color.FromArgb(bgColor.Red, bgColor.Green, bgColor.Blue); currentPreset = 0; PresetPrep(); Update_DDSdisplay(); TattooImageFile.Text = ""; Predicate <IResourceIndexEntry> isTHUM = ri => ri.ResourceType == (uint)ResourceTypes.THUM & ri.ResourceGroup == 1U & ri.Instance == r.Instance; IResourceIndexEntry irThum = myPack.Find(isTHUM); if (irThum != null) { Stream t = myPack.GetResource(irThum); thumbNail = new Bitmap(t); } else { thumbNail = null; } TattooName.Text = tatName; TattooInstance.Text = r.Instance.ToString("X16"); AgeGenderFlags ag = casp.AgeGender; CASPtodder_checkBox.Checked = ((ag.Age & AgeFlags.Toddler) > 0); CASPchild_checkBox.Checked = ((ag.Age & AgeFlags.Child) > 0); CASPteen_checkBox.Checked = ((ag.Age & AgeFlags.Teen) > 0); CASPadult_checkBox.Checked = ((ag.Age & AgeFlags.Adult) > 0); CASPelder_checkBox.Checked = ((ag.Age & AgeFlags.Elder) > 0); CASPmale_checkBox.Checked = ((ag.Gender & GenderFlags.Male) > 0); CASPfemale_checkBox.Checked = ((ag.Gender & GenderFlags.Female) > 0); CASPsortOrder.Text = casp.SortPriority.ToString(); saveOptionsDDS = new DdsSaveOptions("DXT5", true, 90); PhotoConvert_radioButton.Checked = false; Black2Red_radioButton.Checked = false; Resize_checkBox.Checked = false; ReplaceAlpha_checkBox.Checked = false; Black2Alpha_radioButton.Checked = true; White2Alpha_radioButton.Checked = false; BlankAlpha_radioButton.Checked = false; invertAlpha_radioButton.Checked = false; White2Back_checkBox.Checked = false; break; } else if (res == DialogResult.No) { continue; } else { Package.ClosePackage(0, (IPackage)myPack); return; } } } if (numTattoos == 0) { MessageBox.Show("No tattoos found in package!"); } Package.ClosePackage(0, (IPackage)myPack); // CASPartResource.CASPartResource casp = }
static async Task <MemoryStream> getDDS(Stream stream) { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } var exceptions = new List <Exception>(); MemoryStream ms = null; try { ms = new MemoryStream(); var file = DdsFile.Load(stream); var decoder = new BcDecoder(); var image = decoder.Decode(file); await image.SaveAsPngAsync(ms); } catch (Exception ex) { if (ms != null) { ms.Close(); await ms.DisposeAsync(); } ms = null; exceptions.Add(ex); } // fallback if (ms == null) { if (stream.CanSeek) { stream.Seek(0, SeekOrigin.Begin); } try { using var pfimImage = Dds.Create(stream, new PfimConfig()); if (pfimImage.Compressed) { pfimImage.Decompress(); } if (pfimImage.Format == ImageFormat.Rgba32) { ms = new MemoryStream(); using var image = Image.LoadPixelData <Bgra32>(tightData(pfimImage), pfimImage.Width, pfimImage.Height); await image.SaveAsPngAsync(ms); } else if (pfimImage.Format == ImageFormat.Rgb24) { ms = new MemoryStream(); using var image = Image.LoadPixelData <Bgr24>(tightData(pfimImage), pfimImage.Width, pfimImage.Height); await image.SaveAsPngAsync(ms); } } catch (Exception ex) { if (ms != null) { ms.Close(); await ms.DisposeAsync(); } ms = null; exceptions.Add(ex); } } // Fallback can result in memory stream being empty so throw aggregate exception only if both attempts failed if (ms == null && exceptions.Count == 2) { throw new AggregateException(exceptions); } return(ms); }