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);
        }
Example #3
0
		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;
		}
Example #4
0
        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 =
        }
Example #5
0
                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);
                }