From 9b15a3d5fe8d164012d653b20d0847dc38357c55 Mon Sep 17 00:00:00 2001 From: KillzXGaming Date: Wed, 17 Jul 2019 16:14:55 -0400 Subject: [PATCH] Some bffnt stuff --- .vs/Toolbox/v15/.suo | Bin 0 -> 296448 bytes .../FileFormats/Archives/SARC.cs | 13 +- .../FileFormats/Archives/SARC_OLD.cs | 1 + File_Format_Library/FileFormats/Font/BFFNT.cs | 194 ++++--- .../FileFormats/Texture/BFLIM.cs | 2 +- .../FileFormats/Texture/BNTX.cs | 2 +- .../File_Format_Library.csproj | 11 +- .../GUI/BFFNT/BffntEditor.Designer.cs | 499 +++++++++++++++++ File_Format_Library/GUI/BFFNT/BffntEditor.cs | 94 ++++ .../GUI/BFFNT/BffntEditor.resx | 331 ++++++++++++ .../BFFNT/New folder/BffntEditor.Designer.cs | 501 ++++++++++++++++++ .../GUI/BFFNT/New folder/BffntEditor.cs | 73 +++ .../GUI/BFFNT/New folder/BffntEditor.resx | 331 ++++++++++++ .../Archive/ArchiveFilePanel.Designer.cs | 13 + .../Forms/Archive/ArchiveFilePanel.cs | 31 +- .../Forms/Custom/STUserControl.cs | 2 + .../Editors/ImageEditor/ImageEditorBase.cs | 8 +- .../Forms/Editors/TextEditor/TextEditor.cs | 5 + .../Generics/GenericTexture.cs | 46 +- Switch_Toolbox_Library/Helpers/TreeHelper.cs | 43 ++ .../Interfaces/IArchiveFile.cs | 34 +- 21 files changed, 2145 insertions(+), 89 deletions(-) create mode 100644 .vs/Toolbox/v15/.suo create mode 100644 File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs create mode 100644 File_Format_Library/GUI/BFFNT/BffntEditor.cs create mode 100644 File_Format_Library/GUI/BFFNT/BffntEditor.resx create mode 100644 File_Format_Library/GUI/BFFNT/New folder/BffntEditor.Designer.cs create mode 100644 File_Format_Library/GUI/BFFNT/New folder/BffntEditor.cs create mode 100644 File_Format_Library/GUI/BFFNT/New folder/BffntEditor.resx diff --git a/.vs/Toolbox/v15/.suo b/.vs/Toolbox/v15/.suo new file mode 100644 index 0000000000000000000000000000000000000000..e2e91df577f089f0f8d472c4f4708271a663b562 GIT binary patch literal 296448 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 Pw_`z; FormClosing(sender, e, fileFormat); if (editorForm.ShowDialog() == DialogResult.OK) { diff --git a/File_Format_Library/FileFormats/Font/BFFNT.cs b/File_Format_Library/FileFormats/Font/BFFNT.cs index 869a8a96..6370aae9 100644 --- a/File_Format_Library/FileFormats/Font/BFFNT.cs +++ b/File_Format_Library/FileFormats/Font/BFFNT.cs @@ -3,17 +3,17 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using Toolbox; using System.Windows.Forms; using Toolbox.Library; using System.IO; using Toolbox.Library.IO; using Toolbox.Library.Forms; using System.Drawing; +using FirstPlugin.Forms; namespace FirstPlugin { - public class BFFNT : TreeNodeFile, IFileFormat + public class BFFNT : IFileFormat, IEditor { public FileType FileType { get; set; } = FileType.Font; @@ -41,28 +41,35 @@ namespace FirstPlugin } } - FFNT bffnt; - public BNTX BinaryTextureFile; - public List Gx2Textures = new List(); + public FFNT bffnt; + + public BffntEditor OpenForm() + { + BffntEditor form = new BffntEditor(); + form.Text = "BFFNT Editor"; + form.Dock = DockStyle.Fill; + form.LoadFontFile(this); + return form; + } + + public void FillEditor(UserControl control) + { + ((BffntEditor)control).LoadFontFile(this); + } public void Load(System.IO.Stream stream) { - Text = FileName; - bffnt = new FFNT(); bffnt.Read(new FileReader(stream)); - TGLP tglp = bffnt.GetFontSection().tglp; + TGLP tglp = bffnt.FontSection.TextureGlyph; - var textureFolder = new TreeNode("Textures"); - Nodes.Add(textureFolder); if (tglp.SheetDataList.Count > 0) { var bntx = STFileLoader.OpenFileFormat("Sheet_0", Utils.CombineByteArray(tglp.SheetDataList.ToArray())); - if (bntx != null) + if (bntx != null) { - BinaryTextureFile = (BNTX)bntx; - textureFolder.Nodes.Add((BNTX)bntx); + tglp.BinaryTextureFile = (BNTX)bntx; } else { @@ -71,18 +78,16 @@ namespace FirstPlugin var surface = new Gx2ImageBlock(); surface.Text = $"Sheet_{s}"; surface.Load(tglp, s); - textureFolder.Nodes.Add(surface); - Gx2Textures.Add(surface); + tglp.Gx2Textures.Add(surface); } } } - int i = 0; foreach (byte[] texture in tglp.SheetDataList) { - // BNTX file = (BNTX)STFileLoader.OpenFileFormat("Sheet" + i++, texture); - // Nodes.Add(file); + // BNTX file = (BNTX)STFileLoader.OpenFileFormat("Sheet" + i++, texture); + // Nodes.Add(file); } } public void Unload() @@ -138,17 +143,9 @@ namespace FirstPlugin { public ushort BOM; public ushort HeaderSize; - public uint Version; + public uint Version { get; set; } - public FINF GetFontSection() - { - foreach (var block in Blocks) - { - if (block.GetType() == typeof(FINF)) - return (FINF)block; - } - return null; - } + public FINF FontSection { get; set; } public List Blocks = new List(); @@ -173,9 +170,9 @@ namespace FirstPlugin switch (SignatureCheck) { case "FINF": - FINF finf = new FINF(); - finf.Read(reader); - Blocks.Add(finf); + FontSection = new FINF(); + FontSection.Read(reader, this); + Blocks.Add(FontSection); break; default: throw new NotImplementedException("Unsupported block found! " + SignatureCheck); @@ -473,59 +470,81 @@ namespace FirstPlugin public class FINF : BFFNT_Block { public uint Size; - public byte Type; - public byte Width; - public byte Height; - public byte Ascend; - public ushort LineFeed; - public ushort AlterCharIndex; - public byte DefaultLeftWidth; - public byte DefaultGlyphWidth; - public byte DefaultCharWidth; - public byte CharEncoding; - public TGLP tglp; + public FontType Type { get; set; } + public byte Width { get; set; } + public byte Height { get; set; } + public byte Ascent { get; set; } + public ushort LineFeed { get; set; } + public ushort AlterCharIndex { get; set; } + public byte DefaultLeftWidth { get; set; } + public byte DefaultGlyphWidth { get; set; } + public byte DefaultCharWidth { get; set; } + public CharacterCode CharEncoding { get; set; } + public TGLP TextureGlyph; + public CMAP CodeMap; + public CWDH CharacterWidth; - public void Read(FileReader reader) + public enum FontType : byte + { + Glyph = 1, + Texture = 2, + PackedTexture = 3, + } + + public enum CharacterCode : byte + { + Unicode = 1, + ShiftJIS = 2, + CP1252 = 3, + } + + public void Read(FileReader reader, FFNT Header) { string Signature = reader.ReadString(4, Encoding.ASCII); if (Signature != "FINF") throw new Exception($"Invalid signature {Signature}! Expected FINF."); Size = reader.ReadUInt32(); - Type = reader.ReadByte(); + Type = reader.ReadEnum(true); Height = reader.ReadByte(); Width = reader.ReadByte(); - Ascend = reader.ReadByte(); + Ascent = reader.ReadByte(); LineFeed = reader.ReadUInt16(); AlterCharIndex = reader.ReadUInt16(); DefaultLeftWidth = reader.ReadByte(); DefaultGlyphWidth = reader.ReadByte(); DefaultCharWidth = reader.ReadByte(); - CharEncoding = reader.ReadByte(); + CharEncoding = reader.ReadEnum(true); uint tglpOffset = reader.ReadUInt32(); uint cwdhOffset = reader.ReadUInt32(); uint cmapOffset = reader.ReadUInt32(); - tglp = new TGLP(); + TextureGlyph = new TGLP(); using (reader.TemporarySeek(tglpOffset - 8, SeekOrigin.Begin)) - { - tglp.Read(reader); - } + TextureGlyph.Read(reader); + + CharacterWidth = new CWDH(); + using (reader.TemporarySeek(cwdhOffset - 8, SeekOrigin.Begin)) + CharacterWidth.Read(reader, Header); + + CodeMap = new CMAP(); + using (reader.TemporarySeek(cmapOffset - 8, SeekOrigin.Begin)) + CodeMap.Read(reader, Header); } public void Write(FileWriter writer) { writer.WriteSignature("FINF"); writer.Write(uint.MaxValue); - writer.Write(Type); + writer.Write(Type, true); writer.Write(Height); writer.Write(Width); - writer.Write(Ascend); + writer.Write(Ascent); writer.Write(LineFeed); writer.Write(AlterCharIndex); writer.Write(DefaultLeftWidth); writer.Write(DefaultGlyphWidth); writer.Write(DefaultCharWidth); - writer.Write(CharEncoding); + writer.Write(CharEncoding, true); long _ofsTGLP = writer.Position; writer.Write(uint.MaxValue); @@ -537,17 +556,21 @@ namespace FirstPlugin } public class TGLP { + public BNTX BinaryTextureFile; + public List Gx2Textures = new List(); + public uint Size; - public byte CellWidth; - public byte CellHeight; - public byte MaxCharWidth; - public uint SheetSize; - public ushort BaseLinePos; - public ushort Format; - public ushort ColumnCount; - public ushort RowCount; - public ushort SheetWidth; - public ushort SheetHeight; + public byte CellWidth { get; set; } + public byte CellHeight { get; set; } + public byte MaxCharWidth { get; set; } + public byte SheetCount { get; private set; } + public uint SheetSize { get; set; } + public ushort BaseLinePos { get; set; } + public ushort Format { get; set; } + public ushort ColumnCount { get; set; } + public ushort RowCount { get; set; } + public ushort SheetWidth { get; set; } + public ushort SheetHeight { get; set; } public List SheetDataList = new List(); public void Read(FileReader reader) @@ -558,7 +581,7 @@ namespace FirstPlugin Size = reader.ReadUInt32(); CellWidth = reader.ReadByte(); CellHeight = reader.ReadByte(); - byte SheetCount = reader.ReadByte(); + SheetCount = reader.ReadByte(); MaxCharWidth = reader.ReadByte(); SheetSize = reader.ReadUInt32(); BaseLinePos = reader.ReadUInt16(); @@ -618,6 +641,14 @@ namespace FirstPlugin writer.Write((uint)(SectionEndPosition - _ofsSectionSize - 4)); } } + + public STGenericTexture GetImageSheet(int Index) + { + if (BinaryTextureFile != null) //BNTX uses only one image with multiple arrays + return BinaryTextureFile.Textures.ElementAt(0).Value; + else + return Gx2Textures[Index]; + } } public class CMAP @@ -638,7 +669,7 @@ namespace FirstPlugin public void Read(FileReader reader, FFNT header) { - reader.ReadSignature(4, "CMAP "); + reader.ReadSignature(4, "CMAP"); uint SectionSize = reader.ReadUInt32(); if (header.Version > 0x3000000) { @@ -661,4 +692,37 @@ namespace FirstPlugin } } } + + public class CWDH + { + public ushort GlobalIndexFirstWidthEntry { get; set; } + public ushort GlobalIndexLastWidthEntry { get; set; } + + public List WidthEntries = new List(); + + public CWDH NextWidthSection { get; set; } + + public ushort EntryCount + { + get { return (ushort)(GlobalIndexLastWidthEntry - GlobalIndexFirstWidthEntry + 1); } + } + + public void Read(FileReader reader, FFNT header) + { + reader.ReadSignature(4, "CWDH"); + uint SectionSize = reader.ReadUInt32(); + GlobalIndexFirstWidthEntry = reader.ReadUInt16(); + GlobalIndexLastWidthEntry = reader.ReadUInt16(); + uint NextWidthSectionOffset = reader.ReadUInt32(); + + reader.Seek((int)NextWidthSectionOffset - 8, SeekOrigin.Current); + } + } + + public class CharacterWidthEntry + { + public sbyte LeftWidth { get; set; } + public byte GlyphWidth { get; set; } + public byte Width { get; set; } + } } diff --git a/File_Format_Library/FileFormats/Texture/BFLIM.cs b/File_Format_Library/FileFormats/Texture/BFLIM.cs index 87aa5c4c..a4a3f928 100644 --- a/File_Format_Library/FileFormats/Texture/BFLIM.cs +++ b/File_Format_Library/FileFormats/Texture/BFLIM.cs @@ -243,7 +243,7 @@ namespace FirstPlugin } if (FileFormat is BFFNT) { - foreach (STGenericTexture texture in ((BFFNT)FileFormat).Gx2Textures) + foreach (STGenericTexture texture in ((BFFNT)FileFormat).bffnt.FontSection.TextureGlyph.Gx2Textures) texture.Export(Path.Combine(Folder, $"{texture.Text}{Extension}")); } if (FileFormat is BFRES) diff --git a/File_Format_Library/FileFormats/Texture/BNTX.cs b/File_Format_Library/FileFormats/Texture/BNTX.cs index bdbc6dc1..ea4ebb81 100644 --- a/File_Format_Library/FileFormats/Texture/BNTX.cs +++ b/File_Format_Library/FileFormats/Texture/BNTX.cs @@ -187,7 +187,7 @@ namespace FirstPlugin } if (FileFormat is BFFNT) { - var bntx = ((BFFNT)FileFormat).BinaryTextureFile; + var bntx = ((BFFNT)FileFormat).bffnt.FontSection.TextureGlyph.BinaryTextureFile; if (bntx != null) { foreach (var texture in bntx.Textures.Values) diff --git a/File_Format_Library/File_Format_Library.csproj b/File_Format_Library/File_Format_Library.csproj index ff6f6d7b..a876d75d 100644 --- a/File_Format_Library/File_Format_Library.csproj +++ b/File_Format_Library/File_Format_Library.csproj @@ -20,7 +20,7 @@ true full false - ..\Toolbox\bin\Release\Lib\Plugins\ + ..\Toolbox\bin\Debug\Lib\Plugins\ DEBUG;TRACE prompt 4 @@ -257,6 +257,12 @@ + + UserControl + + + BffntEditor.cs + Form @@ -975,6 +981,9 @@ SamplerEditorSimple.cs + + BffntEditor.cs + BatchEditBaseAnimDataForm.cs diff --git a/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs b/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs new file mode 100644 index 00000000..a919643d --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/BffntEditor.Designer.cs @@ -0,0 +1,499 @@ +namespace FirstPlugin.Forms +{ + partial class BffntEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BffntEditor)); + this.stPanel1 = new Toolbox.Library.Forms.STPanel(); + this.lineFeedUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel13 = new Toolbox.Library.Forms.STLabel(); + this.fontTypeCB = new Toolbox.Library.Forms.STComboBox(); + this.encodingTypeCB = new Toolbox.Library.Forms.STComboBox(); + this.stLabel12 = new Toolbox.Library.Forms.STLabel(); + this.stLabel11 = new Toolbox.Library.Forms.STLabel(); + this.stLabel10 = new Toolbox.Library.Forms.STLabel(); + this.leftSpacingUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel9 = new Toolbox.Library.Forms.STLabel(); + this.glyphWidthCB = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel8 = new Toolbox.Library.Forms.STLabel(); + this.charWidthUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel7 = new Toolbox.Library.Forms.STLabel(); + this.fontHeightUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel6 = new Toolbox.Library.Forms.STLabel(); + this.fontWidthUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel5 = new Toolbox.Library.Forms.STLabel(); + this.ascentUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel4 = new Toolbox.Library.Forms.STLabel(); + this.stLabel1 = new Toolbox.Library.Forms.STLabel(); + this.stPanel2 = new Toolbox.Library.Forms.STPanel(); + this.stLabel2 = new Toolbox.Library.Forms.STLabel(); + this.splitter1 = new System.Windows.Forms.Splitter(); + this.splitter2 = new System.Windows.Forms.Splitter(); + this.stPanel3 = new Toolbox.Library.Forms.STPanel(); + this.imagesCB = new Toolbox.Library.Forms.STComboBox(); + this.stLabel3 = new Toolbox.Library.Forms.STLabel(); + this.stPanel4 = new Toolbox.Library.Forms.STPanel(); + this.imageMenuStrip = new Toolbox.Library.Forms.STContextMenuStrip(this.components); + this.pictureBoxCustom1 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.exportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.stPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lineFeedUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.leftSpacingUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.glyphWidthCB)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.charWidthUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontHeightUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontWidthUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.ascentUD)).BeginInit(); + this.stPanel2.SuspendLayout(); + this.stPanel3.SuspendLayout(); + this.stPanel4.SuspendLayout(); + this.imageMenuStrip.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).BeginInit(); + this.SuspendLayout(); + // + // stPanel1 + // + this.stPanel1.Controls.Add(this.lineFeedUD); + this.stPanel1.Controls.Add(this.stLabel13); + this.stPanel1.Controls.Add(this.fontTypeCB); + this.stPanel1.Controls.Add(this.encodingTypeCB); + this.stPanel1.Controls.Add(this.stLabel12); + this.stPanel1.Controls.Add(this.stLabel11); + this.stPanel1.Controls.Add(this.stLabel10); + this.stPanel1.Controls.Add(this.leftSpacingUD); + this.stPanel1.Controls.Add(this.stLabel9); + this.stPanel1.Controls.Add(this.glyphWidthCB); + this.stPanel1.Controls.Add(this.stLabel8); + this.stPanel1.Controls.Add(this.charWidthUD); + this.stPanel1.Controls.Add(this.stLabel7); + this.stPanel1.Controls.Add(this.fontHeightUD); + this.stPanel1.Controls.Add(this.stLabel6); + this.stPanel1.Controls.Add(this.fontWidthUD); + this.stPanel1.Controls.Add(this.stLabel5); + this.stPanel1.Controls.Add(this.ascentUD); + this.stPanel1.Controls.Add(this.stLabel4); + this.stPanel1.Controls.Add(this.stLabel1); + this.stPanel1.Dock = System.Windows.Forms.DockStyle.Left; + this.stPanel1.Location = new System.Drawing.Point(0, 0); + this.stPanel1.Name = "stPanel1"; + this.stPanel1.Size = new System.Drawing.Size(201, 438); + this.stPanel1.TabIndex = 0; + // + // lineFeedUD + // + this.lineFeedUD.Location = new System.Drawing.Point(86, 139); + this.lineFeedUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.lineFeedUD.Name = "lineFeedUD"; + this.lineFeedUD.Size = new System.Drawing.Size(97, 20); + this.lineFeedUD.TabIndex = 19; + // + // stLabel13 + // + this.stLabel13.AutoSize = true; + this.stLabel13.Location = new System.Drawing.Point(-1, 141); + this.stLabel13.Name = "stLabel13"; + this.stLabel13.Size = new System.Drawing.Size(57, 13); + this.stLabel13.TabIndex = 18; + this.stLabel13.Text = "Line Feed:"; + // + // fontTypeCB + // + this.fontTypeCB.BorderColor = System.Drawing.Color.Empty; + this.fontTypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.fontTypeCB.ButtonColor = System.Drawing.Color.Empty; + this.fontTypeCB.FormattingEnabled = true; + this.fontTypeCB.Location = new System.Drawing.Point(87, 42); + this.fontTypeCB.Name = "fontTypeCB"; + this.fontTypeCB.ReadOnly = true; + this.fontTypeCB.Size = new System.Drawing.Size(108, 21); + this.fontTypeCB.TabIndex = 17; + // + // encodingTypeCB + // + this.encodingTypeCB.BorderColor = System.Drawing.Color.Empty; + this.encodingTypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.encodingTypeCB.ButtonColor = System.Drawing.Color.Empty; + this.encodingTypeCB.FormattingEnabled = true; + this.encodingTypeCB.Location = new System.Drawing.Point(87, 73); + this.encodingTypeCB.Name = "encodingTypeCB"; + this.encodingTypeCB.ReadOnly = true; + this.encodingTypeCB.Size = new System.Drawing.Size(108, 21); + this.encodingTypeCB.TabIndex = 16; + // + // stLabel12 + // + this.stLabel12.AutoSize = true; + this.stLabel12.Location = new System.Drawing.Point(3, 73); + this.stLabel12.Name = "stLabel12"; + this.stLabel12.Size = new System.Drawing.Size(55, 13); + this.stLabel12.TabIndex = 15; + this.stLabel12.Text = "Encoding:"; + // + // stLabel11 + // + this.stLabel11.AutoSize = true; + this.stLabel11.Location = new System.Drawing.Point(3, 45); + this.stLabel11.Name = "stLabel11"; + this.stLabel11.Size = new System.Drawing.Size(34, 13); + this.stLabel11.TabIndex = 14; + this.stLabel11.Text = "Type:"; + // + // stLabel10 + // + this.stLabel10.AutoSize = true; + this.stLabel10.Location = new System.Drawing.Point(3, 106); + this.stLabel10.Name = "stLabel10"; + this.stLabel10.Size = new System.Drawing.Size(69, 13); + this.stLabel10.TabIndex = 13; + this.stLabel10.Text = "Default Char:"; + // + // leftSpacingUD + // + this.leftSpacingUD.Location = new System.Drawing.Point(86, 165); + this.leftSpacingUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.leftSpacingUD.Name = "leftSpacingUD"; + this.leftSpacingUD.Size = new System.Drawing.Size(97, 20); + this.leftSpacingUD.TabIndex = 12; + // + // stLabel9 + // + this.stLabel9.AutoSize = true; + this.stLabel9.Location = new System.Drawing.Point(-1, 167); + this.stLabel9.Name = "stLabel9"; + this.stLabel9.Size = new System.Drawing.Size(73, 13); + this.stLabel9.TabIndex = 11; + this.stLabel9.Text = "Left Spacing::"; + // + // glyphWidthCB + // + this.glyphWidthCB.Location = new System.Drawing.Point(86, 217); + this.glyphWidthCB.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.glyphWidthCB.Name = "glyphWidthCB"; + this.glyphWidthCB.Size = new System.Drawing.Size(97, 20); + this.glyphWidthCB.TabIndex = 10; + // + // stLabel8 + // + this.stLabel8.AutoSize = true; + this.stLabel8.Location = new System.Drawing.Point(2, 219); + this.stLabel8.Name = "stLabel8"; + this.stLabel8.Size = new System.Drawing.Size(68, 13); + this.stLabel8.TabIndex = 9; + this.stLabel8.Text = "Glyph Width:"; + // + // charWidthUD + // + this.charWidthUD.Location = new System.Drawing.Point(86, 191); + this.charWidthUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.charWidthUD.Name = "charWidthUD"; + this.charWidthUD.Size = new System.Drawing.Size(97, 20); + this.charWidthUD.TabIndex = 8; + // + // stLabel7 + // + this.stLabel7.AutoSize = true; + this.stLabel7.Location = new System.Drawing.Point(-1, 193); + this.stLabel7.Name = "stLabel7"; + this.stLabel7.Size = new System.Drawing.Size(63, 13); + this.stLabel7.TabIndex = 7; + this.stLabel7.Text = "Char Width:"; + // + // fontHeightUD + // + this.fontHeightUD.Location = new System.Drawing.Point(86, 295); + this.fontHeightUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.fontHeightUD.Name = "fontHeightUD"; + this.fontHeightUD.Size = new System.Drawing.Size(97, 20); + this.fontHeightUD.TabIndex = 6; + // + // stLabel6 + // + this.stLabel6.AutoSize = true; + this.stLabel6.Location = new System.Drawing.Point(3, 297); + this.stLabel6.Name = "stLabel6"; + this.stLabel6.Size = new System.Drawing.Size(41, 13); + this.stLabel6.TabIndex = 5; + this.stLabel6.Text = "Height:"; + // + // fontWidthUD + // + this.fontWidthUD.Location = new System.Drawing.Point(86, 269); + this.fontWidthUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.fontWidthUD.Name = "fontWidthUD"; + this.fontWidthUD.Size = new System.Drawing.Size(97, 20); + this.fontWidthUD.TabIndex = 4; + // + // stLabel5 + // + this.stLabel5.AutoSize = true; + this.stLabel5.Location = new System.Drawing.Point(2, 271); + this.stLabel5.Name = "stLabel5"; + this.stLabel5.Size = new System.Drawing.Size(38, 13); + this.stLabel5.TabIndex = 3; + this.stLabel5.Text = "Width:"; + // + // ascentUD + // + this.ascentUD.Location = new System.Drawing.Point(86, 243); + this.ascentUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.ascentUD.Name = "ascentUD"; + this.ascentUD.Size = new System.Drawing.Size(97, 20); + this.ascentUD.TabIndex = 2; + // + // stLabel4 + // + this.stLabel4.AutoSize = true; + this.stLabel4.Location = new System.Drawing.Point(2, 245); + this.stLabel4.Name = "stLabel4"; + this.stLabel4.Size = new System.Drawing.Size(43, 13); + this.stLabel4.TabIndex = 1; + this.stLabel4.Text = "Ascent:"; + // + // stLabel1 + // + this.stLabel1.AutoSize = true; + this.stLabel1.Location = new System.Drawing.Point(3, 9); + this.stLabel1.Name = "stLabel1"; + this.stLabel1.Size = new System.Drawing.Size(28, 13); + this.stLabel1.TabIndex = 0; + this.stLabel1.Text = "Font"; + // + // stPanel2 + // + this.stPanel2.Controls.Add(this.stLabel2); + this.stPanel2.Dock = System.Windows.Forms.DockStyle.Right; + this.stPanel2.Location = new System.Drawing.Point(619, 0); + this.stPanel2.Name = "stPanel2"; + this.stPanel2.Size = new System.Drawing.Size(200, 438); + this.stPanel2.TabIndex = 1; + // + // stLabel2 + // + this.stLabel2.AutoSize = true; + this.stLabel2.Location = new System.Drawing.Point(13, 9); + this.stLabel2.Name = "stLabel2"; + this.stLabel2.Size = new System.Drawing.Size(58, 13); + this.stLabel2.TabIndex = 1; + this.stLabel2.Text = "Characters"; + // + // splitter1 + // + this.splitter1.Location = new System.Drawing.Point(201, 0); + this.splitter1.Name = "splitter1"; + this.splitter1.Size = new System.Drawing.Size(3, 438); + this.splitter1.TabIndex = 2; + this.splitter1.TabStop = false; + // + // splitter2 + // + this.splitter2.Dock = System.Windows.Forms.DockStyle.Right; + this.splitter2.Location = new System.Drawing.Point(616, 0); + this.splitter2.Name = "splitter2"; + this.splitter2.Size = new System.Drawing.Size(3, 438); + this.splitter2.TabIndex = 3; + this.splitter2.TabStop = false; + // + // stPanel3 + // + this.stPanel3.Controls.Add(this.pictureBoxCustom1); + this.stPanel3.Controls.Add(this.imagesCB); + this.stPanel3.Controls.Add(this.stLabel3); + this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.stPanel3.Location = new System.Drawing.Point(204, 0); + this.stPanel3.Name = "stPanel3"; + this.stPanel3.Size = new System.Drawing.Size(412, 438); + this.stPanel3.TabIndex = 4; + // + // imagesCB + // + this.imagesCB.BorderColor = System.Drawing.Color.Empty; + this.imagesCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.imagesCB.ButtonColor = System.Drawing.Color.Empty; + this.imagesCB.FormattingEnabled = true; + this.imagesCB.Location = new System.Drawing.Point(82, 6); + this.imagesCB.Name = "imagesCB"; + this.imagesCB.ReadOnly = true; + this.imagesCB.Size = new System.Drawing.Size(213, 21); + this.imagesCB.TabIndex = 1; + this.imagesCB.SelectedIndexChanged += new System.EventHandler(this.imagesCB_SelectedIndexChanged); + // + // stLabel3 + // + this.stLabel3.AutoSize = true; + this.stLabel3.Location = new System.Drawing.Point(19, 9); + this.stLabel3.Name = "stLabel3"; + this.stLabel3.Size = new System.Drawing.Size(41, 13); + this.stLabel3.TabIndex = 0; + this.stLabel3.Text = "Images"; + // + // stPanel4 + // + this.stPanel4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.stPanel4.Controls.Add(this.stPanel3); + this.stPanel4.Controls.Add(this.splitter2); + this.stPanel4.Controls.Add(this.splitter1); + this.stPanel4.Controls.Add(this.stPanel2); + this.stPanel4.Controls.Add(this.stPanel1); + this.stPanel4.Location = new System.Drawing.Point(0, 24); + this.stPanel4.Name = "stPanel4"; + this.stPanel4.Size = new System.Drawing.Size(819, 438); + this.stPanel4.TabIndex = 2; + // + // imageMenuStrip + // + this.imageMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exportToolStripMenuItem, + this.copyToolStripMenuItem}); + this.imageMenuStrip.Name = "stContextMenuStrip1"; + this.imageMenuStrip.Size = new System.Drawing.Size(181, 70); + // + // pictureBoxCustom1 + // + this.pictureBoxCustom1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxCustom1.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxCustom1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBoxCustom1.BackgroundImage"))); + this.pictureBoxCustom1.ContextMenuStrip = this.imageMenuStrip; + this.pictureBoxCustom1.Location = new System.Drawing.Point(6, 36); + this.pictureBoxCustom1.Name = "pictureBoxCustom1"; + this.pictureBoxCustom1.Size = new System.Drawing.Size(400, 399); + this.pictureBoxCustom1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxCustom1.TabIndex = 2; + this.pictureBoxCustom1.TabStop = false; + // + // exportToolStripMenuItem + // + this.exportToolStripMenuItem.Name = "exportToolStripMenuItem"; + this.exportToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.exportToolStripMenuItem.Text = "Export"; + this.exportToolStripMenuItem.Click += new System.EventHandler(this.exportToolStripMenuItem_Click); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.Size = new System.Drawing.Size(180, 22); + this.copyToolStripMenuItem.Text = "Copy"; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); + // + // BffntEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.stPanel4); + this.Name = "BffntEditor"; + this.Size = new System.Drawing.Size(819, 462); + this.stPanel1.ResumeLayout(false); + this.stPanel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lineFeedUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.leftSpacingUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.glyphWidthCB)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.charWidthUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontHeightUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontWidthUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.ascentUD)).EndInit(); + this.stPanel2.ResumeLayout(false); + this.stPanel2.PerformLayout(); + this.stPanel3.ResumeLayout(false); + this.stPanel3.PerformLayout(); + this.stPanel4.ResumeLayout(false); + this.imageMenuStrip.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private Toolbox.Library.Forms.STPanel stPanel1; + private Toolbox.Library.Forms.STLabel stLabel1; + private Toolbox.Library.Forms.STPanel stPanel2; + private Toolbox.Library.Forms.STLabel stLabel2; + private System.Windows.Forms.Splitter splitter1; + private System.Windows.Forms.Splitter splitter2; + private Toolbox.Library.Forms.STPanel stPanel3; + private Toolbox.Library.Forms.STComboBox imagesCB; + private Toolbox.Library.Forms.STLabel stLabel3; + private Toolbox.Library.Forms.NumericUpDownUint ascentUD; + private Toolbox.Library.Forms.STLabel stLabel4; + private Toolbox.Library.Forms.STLabel stLabel10; + private Toolbox.Library.Forms.NumericUpDownUint leftSpacingUD; + private Toolbox.Library.Forms.STLabel stLabel9; + private Toolbox.Library.Forms.NumericUpDownUint glyphWidthCB; + private Toolbox.Library.Forms.STLabel stLabel8; + private Toolbox.Library.Forms.NumericUpDownUint charWidthUD; + private Toolbox.Library.Forms.STLabel stLabel7; + private Toolbox.Library.Forms.NumericUpDownUint fontHeightUD; + private Toolbox.Library.Forms.STLabel stLabel6; + private Toolbox.Library.Forms.NumericUpDownUint fontWidthUD; + private Toolbox.Library.Forms.STLabel stLabel5; + private Toolbox.Library.Forms.STComboBox fontTypeCB; + private Toolbox.Library.Forms.STComboBox encodingTypeCB; + private Toolbox.Library.Forms.STLabel stLabel12; + private Toolbox.Library.Forms.STLabel stLabel11; + private Toolbox.Library.Forms.STPanel stPanel4; + private Toolbox.Library.Forms.NumericUpDownUint lineFeedUD; + private Toolbox.Library.Forms.STLabel stLabel13; + private Toolbox.Library.Forms.PictureBoxCustom pictureBoxCustom1; + private Toolbox.Library.Forms.STContextMenuStrip imageMenuStrip; + private System.Windows.Forms.ToolStripMenuItem exportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + } +} \ No newline at end of file diff --git a/File_Format_Library/GUI/BFFNT/BffntEditor.cs b/File_Format_Library/GUI/BFFNT/BffntEditor.cs new file mode 100644 index 00000000..018688a9 --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/BffntEditor.cs @@ -0,0 +1,94 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Toolbox.Library.Forms; + +namespace FirstPlugin.Forms +{ + public partial class BffntEditor : STUserControl + { + public BffntEditor() + { + InitializeComponent(); + } + + private FFNT ActiveFile; + public void LoadFontFile(BFFNT fontFile) + { + ActiveFile = fontFile.bffnt; + + fontTypeCB.Bind(typeof(FINF.FontType), ActiveFile.FontSection, "Type"); + fontTypeCB.SelectedItem = ActiveFile.FontSection.Type; + + encodingTypeCB.Bind(typeof(FINF.CharacterCode), ActiveFile.FontSection, "CharEncoding"); + encodingTypeCB.SelectedItem = ActiveFile.FontSection.CharEncoding; + + lineFeedUD.Bind(ActiveFile.FontSection, "LineFeed"); + leftSpacingUD.Bind(ActiveFile.FontSection, "DefaultLeftWidth"); + charWidthUD.Bind(ActiveFile.FontSection, "DefaultCharWidth"); + glyphWidthCB.Bind(ActiveFile.FontSection, "DefaultGlyphWidth"); + ascentUD.Bind(ActiveFile.FontSection, "Ascent"); + fontWidthUD.Bind(ActiveFile.FontSection, "Width"); + fontHeightUD.Bind(ActiveFile.FontSection, "Height"); + + ReloadTextures(); + } + + private void ReloadTextures() + { + imagesCB.Items.Clear(); + var textureGlyph = ActiveFile.FontSection.TextureGlyph; + for (int i = 0; i < textureGlyph.SheetCount; i++) + imagesCB.Items.Add($"Image {i}"); + + if (textureGlyph.SheetCount > 0) + imagesCB.SelectedIndex = 0; + } + + private void imagesCB_SelectedIndexChanged(object sender, EventArgs e) + { + int ImageIndex = imagesCB.SelectedIndex; + if (ImageIndex != -1) + { + var image = ActiveFile.FontSection.TextureGlyph.GetImageSheet(ImageIndex); + bool IsBntx = ActiveFile.FontSection.TextureGlyph.BinaryTextureFile != null; + + if (IsBntx) + { + pictureBoxCustom1.Image = image.GetBitmap(ImageIndex); + } + else + { + pictureBoxCustom1.Image = image.GetBitmap(); + } + } + } + + private void exportToolStripMenuItem_Click(object sender, EventArgs e) + { + int ImageIndex = imagesCB.SelectedIndex; + if (ImageIndex != -1) + { + var image = ActiveFile.FontSection.TextureGlyph.GetImageSheet(ImageIndex); + bool IsBntx = ActiveFile.FontSection.TextureGlyph.BinaryTextureFile != null; + + if(IsBntx) + image.ExportArrayImage(ImageIndex); + else + image.ExportImage(); + } + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + if (pictureBoxCustom1.Image != null) + Clipboard.SetImage(pictureBoxCustom1.Image); + } + } +} diff --git a/File_Format_Library/GUI/BFFNT/BffntEditor.resx b/File_Format_Library/GUI/BFFNT/BffntEditor.resx new file mode 100644 index 00000000..4b04e0f9 --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/BffntEditor.resx @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS + 0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm + 5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6 + +vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDTbOhAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRF + 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 + + + + 17, 17 + + \ No newline at end of file diff --git a/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.Designer.cs b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.Designer.cs new file mode 100644 index 00000000..5d7f5d2c --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.Designer.cs @@ -0,0 +1,501 @@ +namespace FirstPlugin.Forms +{ + partial class BffntEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(BffntEditor)); + this.stPanel1 = new Toolbox.Library.Forms.STPanel(); + this.lineFeedUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel13 = new Toolbox.Library.Forms.STLabel(); + this.fontTypeCB = new Toolbox.Library.Forms.STComboBox(); + this.encodingTypeCB = new Toolbox.Library.Forms.STComboBox(); + this.stLabel12 = new Toolbox.Library.Forms.STLabel(); + this.stLabel11 = new Toolbox.Library.Forms.STLabel(); + this.stLabel10 = new Toolbox.Library.Forms.STLabel(); + this.leftSpacingUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel9 = new Toolbox.Library.Forms.STLabel(); + this.glyphWidthCB = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel8 = new Toolbox.Library.Forms.STLabel(); + this.charWidthUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel7 = new Toolbox.Library.Forms.STLabel(); + this.fontHeightUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel6 = new Toolbox.Library.Forms.STLabel(); + this.fontWidthUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel5 = new Toolbox.Library.Forms.STLabel(); + this.ascentUD = new Toolbox.Library.Forms.NumericUpDownUint(); + this.stLabel4 = new Toolbox.Library.Forms.STLabel(); + this.stLabel1 = new Toolbox.Library.Forms.STLabel(); + this.stPanel2 = new Toolbox.Library.Forms.STPanel(); + this.stLabel2 = new Toolbox.Library.Forms.STLabel(); + this.splitter1 = new System.Windows.Forms.Splitter(); + this.splitter2 = new System.Windows.Forms.Splitter(); + this.stPanel3 = new Toolbox.Library.Forms.STPanel(); + this.imagesCB = new Toolbox.Library.Forms.STComboBox(); + this.stLabel3 = new Toolbox.Library.Forms.STLabel(); + this.stPanel4 = new Toolbox.Library.Forms.STPanel(); + this.stMenuStrip1 = new Toolbox.Library.Forms.STMenuStrip(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pictureBoxCustom1 = new Toolbox.Library.Forms.PictureBoxCustom(); + this.stPanel1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lineFeedUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.leftSpacingUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.glyphWidthCB)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.charWidthUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontHeightUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontWidthUD)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.ascentUD)).BeginInit(); + this.stPanel2.SuspendLayout(); + this.stPanel3.SuspendLayout(); + this.stPanel4.SuspendLayout(); + this.stMenuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).BeginInit(); + this.SuspendLayout(); + // + // stPanel1 + // + this.stPanel1.Controls.Add(this.lineFeedUD); + this.stPanel1.Controls.Add(this.stLabel13); + this.stPanel1.Controls.Add(this.fontTypeCB); + this.stPanel1.Controls.Add(this.encodingTypeCB); + this.stPanel1.Controls.Add(this.stLabel12); + this.stPanel1.Controls.Add(this.stLabel11); + this.stPanel1.Controls.Add(this.stLabel10); + this.stPanel1.Controls.Add(this.leftSpacingUD); + this.stPanel1.Controls.Add(this.stLabel9); + this.stPanel1.Controls.Add(this.glyphWidthCB); + this.stPanel1.Controls.Add(this.stLabel8); + this.stPanel1.Controls.Add(this.charWidthUD); + this.stPanel1.Controls.Add(this.stLabel7); + this.stPanel1.Controls.Add(this.fontHeightUD); + this.stPanel1.Controls.Add(this.stLabel6); + this.stPanel1.Controls.Add(this.fontWidthUD); + this.stPanel1.Controls.Add(this.stLabel5); + this.stPanel1.Controls.Add(this.ascentUD); + this.stPanel1.Controls.Add(this.stLabel4); + this.stPanel1.Controls.Add(this.stLabel1); + this.stPanel1.Dock = System.Windows.Forms.DockStyle.Left; + this.stPanel1.Location = new System.Drawing.Point(0, 0); + this.stPanel1.Name = "stPanel1"; + this.stPanel1.Size = new System.Drawing.Size(201, 438); + this.stPanel1.TabIndex = 0; + // + // lineFeedUD + // + this.lineFeedUD.Location = new System.Drawing.Point(86, 139); + this.lineFeedUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.lineFeedUD.Name = "lineFeedUD"; + this.lineFeedUD.Size = new System.Drawing.Size(97, 20); + this.lineFeedUD.TabIndex = 19; + // + // stLabel13 + // + this.stLabel13.AutoSize = true; + this.stLabel13.Location = new System.Drawing.Point(-1, 141); + this.stLabel13.Name = "stLabel13"; + this.stLabel13.Size = new System.Drawing.Size(57, 13); + this.stLabel13.TabIndex = 18; + this.stLabel13.Text = "Line Feed:"; + // + // fontTypeCB + // + this.fontTypeCB.BorderColor = System.Drawing.Color.Empty; + this.fontTypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.fontTypeCB.ButtonColor = System.Drawing.Color.Empty; + this.fontTypeCB.FormattingEnabled = true; + this.fontTypeCB.Location = new System.Drawing.Point(87, 42); + this.fontTypeCB.Name = "fontTypeCB"; + this.fontTypeCB.ReadOnly = true; + this.fontTypeCB.Size = new System.Drawing.Size(108, 21); + this.fontTypeCB.TabIndex = 17; + // + // encodingTypeCB + // + this.encodingTypeCB.BorderColor = System.Drawing.Color.Empty; + this.encodingTypeCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.encodingTypeCB.ButtonColor = System.Drawing.Color.Empty; + this.encodingTypeCB.FormattingEnabled = true; + this.encodingTypeCB.Location = new System.Drawing.Point(87, 73); + this.encodingTypeCB.Name = "encodingTypeCB"; + this.encodingTypeCB.ReadOnly = true; + this.encodingTypeCB.Size = new System.Drawing.Size(108, 21); + this.encodingTypeCB.TabIndex = 16; + // + // stLabel12 + // + this.stLabel12.AutoSize = true; + this.stLabel12.Location = new System.Drawing.Point(3, 73); + this.stLabel12.Name = "stLabel12"; + this.stLabel12.Size = new System.Drawing.Size(55, 13); + this.stLabel12.TabIndex = 15; + this.stLabel12.Text = "Encoding:"; + // + // stLabel11 + // + this.stLabel11.AutoSize = true; + this.stLabel11.Location = new System.Drawing.Point(3, 45); + this.stLabel11.Name = "stLabel11"; + this.stLabel11.Size = new System.Drawing.Size(34, 13); + this.stLabel11.TabIndex = 14; + this.stLabel11.Text = "Type:"; + // + // stLabel10 + // + this.stLabel10.AutoSize = true; + this.stLabel10.Location = new System.Drawing.Point(3, 106); + this.stLabel10.Name = "stLabel10"; + this.stLabel10.Size = new System.Drawing.Size(69, 13); + this.stLabel10.TabIndex = 13; + this.stLabel10.Text = "Default Char:"; + // + // leftSpacingUD + // + this.leftSpacingUD.Location = new System.Drawing.Point(86, 165); + this.leftSpacingUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.leftSpacingUD.Name = "leftSpacingUD"; + this.leftSpacingUD.Size = new System.Drawing.Size(97, 20); + this.leftSpacingUD.TabIndex = 12; + // + // stLabel9 + // + this.stLabel9.AutoSize = true; + this.stLabel9.Location = new System.Drawing.Point(-1, 167); + this.stLabel9.Name = "stLabel9"; + this.stLabel9.Size = new System.Drawing.Size(73, 13); + this.stLabel9.TabIndex = 11; + this.stLabel9.Text = "Left Spacing::"; + // + // glyphWidthCB + // + this.glyphWidthCB.Location = new System.Drawing.Point(86, 217); + this.glyphWidthCB.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.glyphWidthCB.Name = "glyphWidthCB"; + this.glyphWidthCB.Size = new System.Drawing.Size(97, 20); + this.glyphWidthCB.TabIndex = 10; + // + // stLabel8 + // + this.stLabel8.AutoSize = true; + this.stLabel8.Location = new System.Drawing.Point(2, 219); + this.stLabel8.Name = "stLabel8"; + this.stLabel8.Size = new System.Drawing.Size(68, 13); + this.stLabel8.TabIndex = 9; + this.stLabel8.Text = "Glyph Width:"; + // + // charWidthUD + // + this.charWidthUD.Location = new System.Drawing.Point(86, 191); + this.charWidthUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.charWidthUD.Name = "charWidthUD"; + this.charWidthUD.Size = new System.Drawing.Size(97, 20); + this.charWidthUD.TabIndex = 8; + // + // stLabel7 + // + this.stLabel7.AutoSize = true; + this.stLabel7.Location = new System.Drawing.Point(-1, 193); + this.stLabel7.Name = "stLabel7"; + this.stLabel7.Size = new System.Drawing.Size(63, 13); + this.stLabel7.TabIndex = 7; + this.stLabel7.Text = "Char Width:"; + // + // fontHeightUD + // + this.fontHeightUD.Location = new System.Drawing.Point(86, 295); + this.fontHeightUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.fontHeightUD.Name = "fontHeightUD"; + this.fontHeightUD.Size = new System.Drawing.Size(97, 20); + this.fontHeightUD.TabIndex = 6; + // + // stLabel6 + // + this.stLabel6.AutoSize = true; + this.stLabel6.Location = new System.Drawing.Point(3, 297); + this.stLabel6.Name = "stLabel6"; + this.stLabel6.Size = new System.Drawing.Size(41, 13); + this.stLabel6.TabIndex = 5; + this.stLabel6.Text = "Height:"; + // + // fontWidthUD + // + this.fontWidthUD.Location = new System.Drawing.Point(86, 269); + this.fontWidthUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.fontWidthUD.Name = "fontWidthUD"; + this.fontWidthUD.Size = new System.Drawing.Size(97, 20); + this.fontWidthUD.TabIndex = 4; + // + // stLabel5 + // + this.stLabel5.AutoSize = true; + this.stLabel5.Location = new System.Drawing.Point(2, 271); + this.stLabel5.Name = "stLabel5"; + this.stLabel5.Size = new System.Drawing.Size(38, 13); + this.stLabel5.TabIndex = 3; + this.stLabel5.Text = "Width:"; + // + // ascentUD + // + this.ascentUD.Location = new System.Drawing.Point(86, 243); + this.ascentUD.Maximum = new decimal(new int[] { + 255, + 0, + 0, + 0}); + this.ascentUD.Name = "ascentUD"; + this.ascentUD.Size = new System.Drawing.Size(97, 20); + this.ascentUD.TabIndex = 2; + // + // stLabel4 + // + this.stLabel4.AutoSize = true; + this.stLabel4.Location = new System.Drawing.Point(2, 245); + this.stLabel4.Name = "stLabel4"; + this.stLabel4.Size = new System.Drawing.Size(43, 13); + this.stLabel4.TabIndex = 1; + this.stLabel4.Text = "Ascent:"; + // + // stLabel1 + // + this.stLabel1.AutoSize = true; + this.stLabel1.Location = new System.Drawing.Point(3, 9); + this.stLabel1.Name = "stLabel1"; + this.stLabel1.Size = new System.Drawing.Size(28, 13); + this.stLabel1.TabIndex = 0; + this.stLabel1.Text = "Font"; + // + // stPanel2 + // + this.stPanel2.Controls.Add(this.stLabel2); + this.stPanel2.Dock = System.Windows.Forms.DockStyle.Right; + this.stPanel2.Location = new System.Drawing.Point(619, 0); + this.stPanel2.Name = "stPanel2"; + this.stPanel2.Size = new System.Drawing.Size(200, 438); + this.stPanel2.TabIndex = 1; + // + // stLabel2 + // + this.stLabel2.AutoSize = true; + this.stLabel2.Location = new System.Drawing.Point(13, 9); + this.stLabel2.Name = "stLabel2"; + this.stLabel2.Size = new System.Drawing.Size(58, 13); + this.stLabel2.TabIndex = 1; + this.stLabel2.Text = "Characters"; + // + // splitter1 + // + this.splitter1.Location = new System.Drawing.Point(201, 0); + this.splitter1.Name = "splitter1"; + this.splitter1.Size = new System.Drawing.Size(3, 438); + this.splitter1.TabIndex = 2; + this.splitter1.TabStop = false; + // + // splitter2 + // + this.splitter2.Dock = System.Windows.Forms.DockStyle.Right; + this.splitter2.Location = new System.Drawing.Point(616, 0); + this.splitter2.Name = "splitter2"; + this.splitter2.Size = new System.Drawing.Size(3, 438); + this.splitter2.TabIndex = 3; + this.splitter2.TabStop = false; + // + // stPanel3 + // + this.stPanel3.Controls.Add(this.pictureBoxCustom1); + this.stPanel3.Controls.Add(this.imagesCB); + this.stPanel3.Controls.Add(this.stLabel3); + this.stPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.stPanel3.Location = new System.Drawing.Point(204, 0); + this.stPanel3.Name = "stPanel3"; + this.stPanel3.Size = new System.Drawing.Size(412, 438); + this.stPanel3.TabIndex = 4; + // + // imagesCB + // + this.imagesCB.BorderColor = System.Drawing.Color.Empty; + this.imagesCB.BorderStyle = System.Windows.Forms.ButtonBorderStyle.Solid; + this.imagesCB.ButtonColor = System.Drawing.Color.Empty; + this.imagesCB.FormattingEnabled = true; + this.imagesCB.Location = new System.Drawing.Point(82, 6); + this.imagesCB.Name = "imagesCB"; + this.imagesCB.ReadOnly = true; + this.imagesCB.Size = new System.Drawing.Size(213, 21); + this.imagesCB.TabIndex = 1; + this.imagesCB.SelectedIndexChanged += new System.EventHandler(this.imagesCB_SelectedIndexChanged); + // + // stLabel3 + // + this.stLabel3.AutoSize = true; + this.stLabel3.Location = new System.Drawing.Point(19, 9); + this.stLabel3.Name = "stLabel3"; + this.stLabel3.Size = new System.Drawing.Size(41, 13); + this.stLabel3.TabIndex = 0; + this.stLabel3.Text = "Images"; + // + // stPanel4 + // + this.stPanel4.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.stPanel4.Controls.Add(this.stPanel3); + this.stPanel4.Controls.Add(this.splitter2); + this.stPanel4.Controls.Add(this.splitter1); + this.stPanel4.Controls.Add(this.stPanel2); + this.stPanel4.Controls.Add(this.stPanel1); + this.stPanel4.Location = new System.Drawing.Point(0, 24); + this.stPanel4.Name = "stPanel4"; + this.stPanel4.Size = new System.Drawing.Size(819, 438); + this.stPanel4.TabIndex = 2; + // + // stMenuStrip1 + // + this.stMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.editToolStripMenuItem, + this.viewToolStripMenuItem}); + this.stMenuStrip1.Location = new System.Drawing.Point(0, 0); + this.stMenuStrip1.Name = "stMenuStrip1"; + this.stMenuStrip1.Size = new System.Drawing.Size(819, 24); + this.stMenuStrip1.TabIndex = 3; + this.stMenuStrip1.Text = "stMenuStrip1"; + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(39, 20); + this.editToolStripMenuItem.Text = "Edit"; + // + // viewToolStripMenuItem + // + this.viewToolStripMenuItem.Name = "viewToolStripMenuItem"; + this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20); + this.viewToolStripMenuItem.Text = "View"; + // + // pictureBoxCustom1 + // + this.pictureBoxCustom1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pictureBoxCustom1.BackColor = System.Drawing.Color.Transparent; + this.pictureBoxCustom1.BackgroundImage = ((System.Drawing.Image)(resources.GetObject("pictureBoxCustom1.BackgroundImage"))); + this.pictureBoxCustom1.Location = new System.Drawing.Point(6, 36); + this.pictureBoxCustom1.Name = "pictureBoxCustom1"; + this.pictureBoxCustom1.Size = new System.Drawing.Size(400, 399); + this.pictureBoxCustom1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBoxCustom1.TabIndex = 2; + this.pictureBoxCustom1.TabStop = false; + // + // BffntEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.stPanel4); + this.Controls.Add(this.stMenuStrip1); + this.Name = "BffntEditor"; + this.Size = new System.Drawing.Size(819, 462); + this.stPanel1.ResumeLayout(false); + this.stPanel1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.lineFeedUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.leftSpacingUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.glyphWidthCB)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.charWidthUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontHeightUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.fontWidthUD)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.ascentUD)).EndInit(); + this.stPanel2.ResumeLayout(false); + this.stPanel2.PerformLayout(); + this.stPanel3.ResumeLayout(false); + this.stPanel3.PerformLayout(); + this.stPanel4.ResumeLayout(false); + this.stMenuStrip1.ResumeLayout(false); + this.stMenuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBoxCustom1)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private Toolbox.Library.Forms.STPanel stPanel1; + private Toolbox.Library.Forms.STLabel stLabel1; + private Toolbox.Library.Forms.STPanel stPanel2; + private Toolbox.Library.Forms.STLabel stLabel2; + private System.Windows.Forms.Splitter splitter1; + private System.Windows.Forms.Splitter splitter2; + private Toolbox.Library.Forms.STPanel stPanel3; + private Toolbox.Library.Forms.STComboBox imagesCB; + private Toolbox.Library.Forms.STLabel stLabel3; + private Toolbox.Library.Forms.NumericUpDownUint ascentUD; + private Toolbox.Library.Forms.STLabel stLabel4; + private Toolbox.Library.Forms.STLabel stLabel10; + private Toolbox.Library.Forms.NumericUpDownUint leftSpacingUD; + private Toolbox.Library.Forms.STLabel stLabel9; + private Toolbox.Library.Forms.NumericUpDownUint glyphWidthCB; + private Toolbox.Library.Forms.STLabel stLabel8; + private Toolbox.Library.Forms.NumericUpDownUint charWidthUD; + private Toolbox.Library.Forms.STLabel stLabel7; + private Toolbox.Library.Forms.NumericUpDownUint fontHeightUD; + private Toolbox.Library.Forms.STLabel stLabel6; + private Toolbox.Library.Forms.NumericUpDownUint fontWidthUD; + private Toolbox.Library.Forms.STLabel stLabel5; + private Toolbox.Library.Forms.STComboBox fontTypeCB; + private Toolbox.Library.Forms.STComboBox encodingTypeCB; + private Toolbox.Library.Forms.STLabel stLabel12; + private Toolbox.Library.Forms.STLabel stLabel11; + private Toolbox.Library.Forms.STPanel stPanel4; + private Toolbox.Library.Forms.STMenuStrip stMenuStrip1; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem; + private Toolbox.Library.Forms.NumericUpDownUint lineFeedUD; + private Toolbox.Library.Forms.STLabel stLabel13; + private Toolbox.Library.Forms.PictureBoxCustom pictureBoxCustom1; + } +} \ No newline at end of file diff --git a/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.cs b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.cs new file mode 100644 index 00000000..1cafb918 --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.cs @@ -0,0 +1,73 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Toolbox.Library.Forms; + +namespace FirstPlugin.Forms +{ + public partial class BffntEditor : STUserControl + { + public BffntEditor() + { + InitializeComponent(); + } + + private FFNT ActiveFile; + public void LoadFontFile(BFFNT fontFile) + { + ActiveFile = fontFile.bffnt; + + fontTypeCB.Bind(typeof(FINF.FontType), ActiveFile.FontSection, "Type"); + fontTypeCB.SelectedItem = ActiveFile.FontSection.Type; + + encodingTypeCB.Bind(typeof(FINF.CharacterCode), ActiveFile.FontSection, "CharEncoding"); + encodingTypeCB.SelectedItem = ActiveFile.FontSection.CharEncoding; + + lineFeedUD.Bind(ActiveFile.FontSection, "LineFeed"); + leftSpacingUD.Bind(ActiveFile.FontSection, "DefaultLeftWidth"); + charWidthUD.Bind(ActiveFile.FontSection, "DefaultCharWidth"); + glyphWidthCB.Bind(ActiveFile.FontSection, "DefaultGlyphWidth"); + ascentUD.Bind(ActiveFile.FontSection, "Ascent"); + fontWidthUD.Bind(ActiveFile.FontSection, "Width"); + fontHeightUD.Bind(ActiveFile.FontSection, "Height"); + + ReloadTextures(); + } + + private void ReloadTextures() + { + imagesCB.Items.Clear(); + var textureGlyph = ActiveFile.FontSection.TextureGlyph; + for (int i = 0; i < textureGlyph.SheetCount; i++) + imagesCB.Items.Add($"Image {i}"); + + if (textureGlyph.SheetCount > 0) + imagesCB.SelectedIndex = 0; + } + + private void imagesCB_SelectedIndexChanged(object sender, EventArgs e) + { + int ImageIndex = imagesCB.SelectedIndex; + if (ImageIndex != -1) + { + var image = ActiveFile.FontSection.TextureGlyph.GetImageSheet(ImageIndex); + bool IsBntx = ActiveFile.FontSection.TextureGlyph.BinaryTextureFile != null; + + if (IsBntx) + { + pictureBoxCustom1.Image = image.GetBitmap(ImageIndex); + } + else + { + pictureBoxCustom1.Image = image.GetBitmap(); + } + } + } + } +} diff --git a/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.resx b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.resx new file mode 100644 index 00000000..243a640e --- /dev/null +++ b/File_Format_Library/GUI/BFFNT/New folder/BffntEditor.resx @@ -0,0 +1,331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + iVBORw0KGgoAAAANSUhEUgAAAlgAAAJYCAMAAACJuGjuAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6 + JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAADAFBMVEXMzMzNzc3Ozs7Pz8/Q0NDR0dHS + 0tLT09PU1NTV1dXW1tbX19fY2NjZ2dna2trb29vc3Nzd3d3e3t7f39/g4ODh4eHi4uLj4+Pk5OTl5eXm + 5ubn5+fo6Ojp6enq6urr6+vs7Ozt7e3u7u7v7+/w8PDx8fHy8vLz8/P09PT19fX29vb39/f4+Pj5+fn6 + +vr7+/v8/Pz9/f3+/v7///8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACDTbOhAAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRF + 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 + + + + 17, 17 + + \ No newline at end of file diff --git a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs index 6800a27d..a9a2f732 100644 --- a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs +++ b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.Designer.cs @@ -32,6 +32,7 @@ this.stPanel2 = new Toolbox.Library.Forms.STPanel(); this.stLabel1 = new Toolbox.Library.Forms.STLabel(); this.stComboBox1 = new Toolbox.Library.Forms.STComboBox(); + this.saveBtn = new Toolbox.Library.Forms.STButton(); this.stPanel2.SuspendLayout(); this.SuspendLayout(); // @@ -47,6 +48,7 @@ // // stPanel2 // + this.stPanel2.Controls.Add(this.saveBtn); this.stPanel2.Controls.Add(this.stLabel1); this.stPanel2.Controls.Add(this.stComboBox1); this.stPanel2.Dock = System.Windows.Forms.DockStyle.Top; @@ -77,6 +79,16 @@ this.stComboBox1.TabIndex = 0; this.stComboBox1.SelectedIndexChanged += new System.EventHandler(this.stComboBox1_SelectedIndexChanged); // + // saveBtn + // + this.saveBtn.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.saveBtn.Location = new System.Drawing.Point(249, 0); + this.saveBtn.Name = "saveBtn"; + this.saveBtn.Size = new System.Drawing.Size(105, 23); + this.saveBtn.TabIndex = 2; + this.saveBtn.Text = "Save"; + this.saveBtn.UseVisualStyleBackColor = false; + // // ArchiveFilePanel // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); @@ -97,5 +109,6 @@ private STPanel stPanel2; private STLabel stLabel1; private STComboBox stComboBox1; + private STButton saveBtn; } } diff --git a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.cs b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.cs index c1961184..ef22f425 100644 --- a/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.cs +++ b/Switch_Toolbox_Library/Forms/Archive/ArchiveFilePanel.cs @@ -24,9 +24,11 @@ namespace Toolbox.Library.Forms ReloadEditors(); _IsLoaded = true; + saveBtn.Visible = false; } - public void LoadFile(ArchiveFileInfo archiveFileInfo) { + public void LoadFile(ArchiveFileInfo archiveFileInfo) + { ArchiveFileInfo = archiveFileInfo; } @@ -67,6 +69,11 @@ namespace Toolbox.Library.Forms UpdateFileEditor(); else if (GetEditor() == 3) UpdateTextView(); + + if (GetEditor() == 2 || GetEditor() == 3) + saveBtn.Visible = true; + else + saveBtn.Visible = false; } private void UpdateFileEditor() @@ -221,5 +228,27 @@ namespace Toolbox.Library.Forms UpdateEditor(); } } + + private void saveBtn_Click(object sender, EventArgs e) + { + bool IsTextEditor = GetEditor() == 3; + + var File = ArchiveFileInfo.FileFormat; + if (IsTextEditor && File != null && IsConvertableText(File.GetType()) && ((IConvertableTextFormat)File).CanConvertBack) + { + TextEditor editor = (TextEditor)GetActiveEditor(typeof(TextEditor)); + ((IConvertableTextFormat)File).ConvertFromString(editor.GetText()); + + ArchiveFileInfo.SaveFileFormat(); + MessageBox.Show($"Saved {File.FileName} to archive!"); + } + else if (File != null && File.CanSave) + { + ArchiveFileInfo.SaveFileFormat(); + MessageBox.Show($"Saved {File.FileName} to archive!"); + } + else + MessageBox.Show($"File format does not support saving!"); + } } } diff --git a/Switch_Toolbox_Library/Forms/Custom/STUserControl.cs b/Switch_Toolbox_Library/Forms/Custom/STUserControl.cs index dfbf52f3..60a2631d 100644 --- a/Switch_Toolbox_Library/Forms/Custom/STUserControl.cs +++ b/Switch_Toolbox_Library/Forms/Custom/STUserControl.cs @@ -4,6 +4,8 @@ namespace Toolbox.Library.Forms { public class STUserControl : UserControl { + public string Text { get; set; } = ""; + public STUserControl() { BackColor = FormThemes.BaseTheme.FormBackColor; diff --git a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs index c865dde9..1f9b5f1e 100644 --- a/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs +++ b/Switch_Toolbox_Library/Forms/Editors/ImageEditor/ImageEditorBase.cs @@ -963,16 +963,16 @@ namespace Toolbox.Library.Forms switch (UseExtension) { case ".dds": - ActiveTexture.SaveDDS(TemporaryName, CurArrayDisplayLevel, CurMipDisplayLevel); + ActiveTexture.SaveDDS(TemporaryName, true, false, CurArrayDisplayLevel, CurMipDisplayLevel); break; case ".astc": - ActiveTexture.SaveASTC(TemporaryName, CurArrayDisplayLevel, CurMipDisplayLevel); + ActiveTexture.SaveASTC(TemporaryName, true, false, CurArrayDisplayLevel, CurMipDisplayLevel); break; case ".tga": - ActiveTexture.SaveTGA(TemporaryName, CurArrayDisplayLevel, CurMipDisplayLevel); + ActiveTexture.SaveTGA(TemporaryName, true, false, CurArrayDisplayLevel, CurMipDisplayLevel); break; default: - ActiveTexture.SaveBitMap(TemporaryName, CurArrayDisplayLevel, CurMipDisplayLevel); + ActiveTexture.SaveBitMap(TemporaryName, true, false, CurArrayDisplayLevel, CurMipDisplayLevel); break; } diff --git a/Switch_Toolbox_Library/Forms/Editors/TextEditor/TextEditor.cs b/Switch_Toolbox_Library/Forms/Editors/TextEditor/TextEditor.cs index 662a652f..ad6347cd 100644 --- a/Switch_Toolbox_Library/Forms/Editors/TextEditor/TextEditor.cs +++ b/Switch_Toolbox_Library/Forms/Editors/TextEditor/TextEditor.cs @@ -112,6 +112,11 @@ namespace Toolbox.Library.Forms private Color BACK_COLOR = Color.FromArgb(30, 30, 30); private Color FORE_COLOR = Color.White; + public string GetText() + { + return scintilla1.Text; + } + public void FillEditor(byte[] Data) { FillEditor(Encoding.Default.GetString(Data)); diff --git a/Switch_Toolbox_Library/Generics/GenericTexture.cs b/Switch_Toolbox_Library/Generics/GenericTexture.cs index 390323aa..3d15710b 100644 --- a/Switch_Toolbox_Library/Generics/GenericTexture.cs +++ b/Switch_Toolbox_Library/Generics/GenericTexture.cs @@ -666,6 +666,19 @@ namespace Toolbox.Library Export(FileName); } + public void ExportArrayImage(int ArrayIndex = 0) + { + SaveFileDialog sfd = new SaveFileDialog(); + sfd.FileName = Text; + sfd.DefaultExt = "dds"; + sfd.Filter = ExportFilter; + + if (sfd.ShowDialog() == DialogResult.OK) + { + Export(sfd.FileName, true, false, ArrayIndex); + } + } + public void ExportImage() { SaveFileDialog sfd = new SaveFileDialog(); @@ -688,18 +701,25 @@ namespace Toolbox.Library switch (ext) { case ".dds": - SaveDDS(FileName); + SaveDDS(FileName, ExportSurfaceLevel, ExportMipMapLevel, SurfaceLevel, MipLevel); break; case ".astc": - SaveASTC(FileName); + SaveASTC(FileName, ExportSurfaceLevel, ExportMipMapLevel, SurfaceLevel, MipLevel); break; default: - SaveBitMap(FileName); + SaveBitMap(FileName, ExportSurfaceLevel, ExportMipMapLevel, SurfaceLevel, MipLevel); break; } } - public void SaveASTC(string FileName, int SurfaceLevel = 0, int MipLevel = 0) + public void SaveASTC(string FileName, bool ExportSurfaceLevel = false, + bool ExportMipMapLevel = false, int SurfaceLevel = 0, int MipLevel = 0) { + List surfaces = null; + if (ExportSurfaceLevel) + surfaces = GetSurfaces(SurfaceLevel); + else + surfaces = GetSurfaces(); + ASTC atsc = new ASTC(); atsc.Width = Width; atsc.Height = Height; @@ -707,15 +727,16 @@ namespace Toolbox.Library atsc.BlockDimX = (byte)GetBlockWidth(Format); atsc.BlockDimY = (byte)GetBlockHeight(Format); atsc.BlockDimZ = (byte)GetBlockDepth(Format); - var surfaces = GetSurfaces(); atsc.DataBlock = Utils.CombineByteArray(surfaces[0].mipmaps.ToArray()); File.WriteAllBytes(FileName, atsc.Save()); } - public void SaveTGA(string FileName, int SurfaceLevel = 0, int MipLevel = 0) + public void SaveTGA(string FileName, bool ExportSurfaceLevel = false, + bool ExportMipMapLevel = false, int SurfaceLevel = 0, int MipLevel = 0) { } - public void SaveBitMap(string FileName, int SurfaceLevel = 0, int MipLevel = 0) + public void SaveBitMap(string FileName, bool ExportSurfaceLevel = false, + bool ExportMipMapLevel = false, int SurfaceLevel = 0, int MipLevel = 0) { STProgressBar progressBar = new STProgressBar(); progressBar.Task = "Exporting Image Data..."; @@ -724,7 +745,7 @@ namespace Toolbox.Library progressBar.Show(); progressBar.Refresh(); - if (ArrayCount > 1) + if (ArrayCount > 1 && !ExportSurfaceLevel) { progressBar.Task = "Select dialog option... "; @@ -770,9 +791,14 @@ namespace Toolbox.Library progressBar.Value = 100; progressBar.Close(); } - public void SaveDDS(string FileName, int SurfaceLevel = 0, int MipLevel = 0) + public void SaveDDS(string FileName, bool ExportSurfaceLevel = false, + bool ExportMipMapLevel = false, int SurfaceLevel = 0, int MipLevel = 0) { - var surfaces = GetSurfaces(); + List surfaces = null; + if (ExportSurfaceLevel) + surfaces = GetSurfaces(SurfaceLevel); + else + surfaces = GetSurfaces(); if (Depth == 0) Depth = 1; diff --git a/Switch_Toolbox_Library/Helpers/TreeHelper.cs b/Switch_Toolbox_Library/Helpers/TreeHelper.cs index c3a288bd..3bf07473 100644 --- a/Switch_Toolbox_Library/Helpers/TreeHelper.cs +++ b/Switch_Toolbox_Library/Helpers/TreeHelper.cs @@ -66,6 +66,49 @@ namespace Toolbox.Library } } + public static List> ReadFiles(string directory) + { + var Files = new List>(); + ProcessDirectory(directory, Files); + return Files; + } + + private static void ProcessDirectory(string targetDirectory, List> FileList) + { + var fileEntries = GetRelativePaths(targetDirectory); + + foreach (string fileName in fileEntries) + { + char[] sep = { '\\' }; + string[] fn = fileName.Split(sep); + string tempf = ""; + for (int i = 0; i < fn.Length; i++) + { + tempf += fn[i]; + if (fn.Length > 2 && (i != fn.Length - 1)) + { + tempf += "/"; + } + } + + FileList.Add(Tuple.Create(tempf, $"{targetDirectory}/{fileName}")); + } + + string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory); + foreach (string subdirectory in subdirectoryEntries) + ProcessDirectory(subdirectory, FileList); + } + + private static IEnumerable GetRelativePaths(string root) + { + int rootLength = root.Length + (root[root.Length - 1] == '\\' ? 0 : 1); + + foreach (string path in Directory.GetFiles(root, "*", SearchOption.AllDirectories)) + { + yield return path.Remove(0, rootLength); + } + } + private static void CreateDirectoryIfExists(string Dir) { if (!String.IsNullOrWhiteSpace(Path.GetDirectoryName(Dir))) diff --git a/Switch_Toolbox_Library/Interfaces/IArchiveFile.cs b/Switch_Toolbox_Library/Interfaces/IArchiveFile.cs index 51f87814..0410073a 100644 --- a/Switch_Toolbox_Library/Interfaces/IArchiveFile.cs +++ b/Switch_Toolbox_Library/Interfaces/IArchiveFile.cs @@ -7,7 +7,6 @@ using System.Windows.Forms; using Toolbox.Library.Forms; using Toolbox.Library.IO; using System.Text.RegularExpressions; -using System.ComponentModel; namespace Toolbox.Library { @@ -249,6 +248,39 @@ namespace Toolbox.Library if (dlg.ShowDialog() == DialogResult.OK) { string FolderPath = dlg.SelectedPath; + + STProgressBar progressBar = new STProgressBar(); + progressBar.Task = "Reading Directory..."; + progressBar.Value = 0; + progressBar.StartPosition = FormStartPosition.CenterScreen; + progressBar.Show(); + progressBar.Refresh(); + + var ProccessedFiles = TreeHelper.ReadFiles(FolderPath); + + progressBar.Task = "Repacking Files..."; + progressBar.Refresh(); + + for (int i = 0; i < ProccessedFiles.Count; i++) + { + progressBar.Value = (i * 100) / ProccessedFiles.Count; + progressBar.Task = $"Packing {ProccessedFiles[i].Item1}"; + progressBar.Refresh(); + + ArchiveFile.AddFile(new ArchiveFileInfo() + { + FileName = ProccessedFiles[i].Item1, + FileData = File.ReadAllBytes(ProccessedFiles[i].Item2), + }); + } + + progressBar.Close(); + progressBar.Dispose(); + ProccessedFiles.Clear(); + + GC.Collect(); + + FillTreeNodes(); } }