More archive improvements
This commit is contained in:
parent
60a1e52dfe
commit
7cb5885e6f
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -12,7 +12,7 @@ using Switch_Toolbox.Library.Forms;
|
||||
|
||||
namespace FirstPlugin
|
||||
{
|
||||
public class GFPAK : TreeNodeFile, IFileFormat
|
||||
public class GFPAK : IArchiveFile, IFileFormat
|
||||
{
|
||||
public FileType FileType { get; set; } = FileType.Archive;
|
||||
|
||||
@ -92,20 +92,19 @@ namespace FirstPlugin
|
||||
}
|
||||
}
|
||||
|
||||
public List<FileEntry> files = new List<FileEntry>();
|
||||
public IEnumerable<ArchiveFileInfo> Files => files;
|
||||
|
||||
public bool CanAddFiles { get; set; } = false;
|
||||
public bool CanRenameFiles { get; set; } = false;
|
||||
public bool CanReplaceFiles { get; set; } = true;
|
||||
public bool CanDeleteFiles { get; set; } = false;
|
||||
|
||||
public void Load(System.IO.Stream stream)
|
||||
{
|
||||
CanSave = true;
|
||||
|
||||
Read(new FileReader(stream));
|
||||
|
||||
Text = FileName;
|
||||
|
||||
ContextMenuStrip = new STContextMenuStrip();
|
||||
ContextMenuStrip.Items.Add(new STToolStipMenuItem("Save", null, Save, Keys.Control | Keys.S));
|
||||
ContextMenuStrip.Items.Add(new STToolStripSeparator());
|
||||
ContextMenuStrip.Items.Add(new STToolStipMenuItem("Preview Window", null, PreviewWindow, Keys.Control | Keys.P));
|
||||
|
||||
CanDelete = true;
|
||||
}
|
||||
public void Unload()
|
||||
{
|
||||
@ -132,17 +131,6 @@ namespace FirstPlugin
|
||||
}
|
||||
}
|
||||
|
||||
private void PreviewWindow(object sender, EventArgs args)
|
||||
{
|
||||
PreviewFormatList previewFormatList = new PreviewFormatList();
|
||||
|
||||
if (previewFormatList.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
CallRecursive(TreeView);
|
||||
PreviewEditor previewWindow = new PreviewEditor();
|
||||
previewWindow.Show();
|
||||
}
|
||||
}
|
||||
private void CallRecursive(TreeView treeView)
|
||||
{
|
||||
// Print each node recursively.
|
||||
@ -163,7 +151,6 @@ namespace FirstPlugin
|
||||
|
||||
public ushort BOM;
|
||||
public uint Version;
|
||||
public List<FileEntry> files = new List<FileEntry>();
|
||||
public List<Folder> folders = new List<Folder>();
|
||||
|
||||
public List<UInt64> hashes = new List<UInt64>();
|
||||
@ -206,8 +193,7 @@ namespace FirstPlugin
|
||||
{
|
||||
FileEntry fileEntry = new FileEntry();
|
||||
fileEntry.Read(reader);
|
||||
fileEntry.Text = GetString(hashes[i], fileEntry.data);
|
||||
Nodes.Add(fileEntry);
|
||||
fileEntry.FileName = GetString(hashes[i], fileEntry.FileData);
|
||||
files.Add(fileEntry);
|
||||
}
|
||||
|
||||
@ -324,22 +310,10 @@ namespace FirstPlugin
|
||||
writer.Write(unknown);
|
||||
}
|
||||
}
|
||||
public class FileEntry : TreeNodeCustom
|
||||
public class FileEntry : ArchiveFileInfo
|
||||
{
|
||||
public FileEntry()
|
||||
{
|
||||
ImageKey = "fileBlank";
|
||||
SelectedImageKey = "fileBlank";
|
||||
|
||||
ContextMenu = new ContextMenu();
|
||||
MenuItem export = new MenuItem("Export");
|
||||
ContextMenu.MenuItems.Add(export);
|
||||
export.Click += Export;
|
||||
|
||||
}
|
||||
public uint unkown;
|
||||
public uint CompressionType;
|
||||
public byte[] data;
|
||||
private long DataOffset;
|
||||
public IFileFormat FileHandler;
|
||||
|
||||
@ -357,30 +331,8 @@ namespace FirstPlugin
|
||||
|
||||
using (reader.TemporarySeek((long)FileOffset, SeekOrigin.Begin))
|
||||
{
|
||||
data = reader.ReadBytes((int)CompressedFileSize);
|
||||
data = STLibraryCompression.Type_LZ4.Decompress(data, 0, (int)CompressedFileSize, (int)DecompressedFileSize);
|
||||
|
||||
string ext = SARCExt.SARC.GuessFileExtension(data);
|
||||
|
||||
if (ext == ".bntx")
|
||||
{
|
||||
ImageKey = "bntx";
|
||||
SelectedImageKey = "bntx";
|
||||
}
|
||||
if (ext == ".byaml")
|
||||
{
|
||||
ImageKey = "byaml";
|
||||
SelectedImageKey = "byaml";
|
||||
}
|
||||
if (ext == ".aamp")
|
||||
{
|
||||
ImageKey = "aamp";
|
||||
SelectedImageKey = "aamp";
|
||||
}
|
||||
if (ext == ".lua")
|
||||
{
|
||||
|
||||
}
|
||||
FileData = reader.ReadBytes((int)CompressedFileSize);
|
||||
FileData = STLibraryCompression.Type_LZ4.Decompress(FileData, 0, (int)CompressedFileSize, (int)DecompressedFileSize);
|
||||
}
|
||||
}
|
||||
|
||||
@ -389,14 +341,14 @@ namespace FirstPlugin
|
||||
{
|
||||
if (FileHandler != null && FileHandler.CanSave)
|
||||
{
|
||||
data = FileHandler.Save();
|
||||
FileData = FileHandler.Save();
|
||||
}
|
||||
|
||||
CompressedData = Compress(data, CompressionType);
|
||||
CompressedData = Compress(FileData, CompressionType);
|
||||
|
||||
writer.Write((ushort)unkown);
|
||||
writer.Write((ushort)CompressionType);
|
||||
writer.Write(data.Length);
|
||||
writer.Write(FileData.Length);
|
||||
writer.Write(CompressedData.Length);
|
||||
writer.Write(padding);
|
||||
DataOffset = writer.Position;
|
||||
@ -417,39 +369,8 @@ namespace FirstPlugin
|
||||
else
|
||||
throw new Exception("Unkown compression type?");
|
||||
}
|
||||
public override void OnClick(TreeView treeView)
|
||||
{
|
||||
HexEditor editor = (HexEditor)LibraryGUI.Instance.GetActiveContent(typeof(HexEditor));
|
||||
if (editor == null)
|
||||
{
|
||||
editor = new HexEditor();
|
||||
LibraryGUI.Instance.LoadEditor(editor);
|
||||
}
|
||||
editor.Text = Text;
|
||||
editor.Dock = DockStyle.Fill;
|
||||
editor.LoadData(data);
|
||||
}
|
||||
|
||||
public override void OnDoubleMouseClick(TreeView treeView)
|
||||
{
|
||||
FileHandler = STFileLoader.OpenFileFormat(Name, data,false, true, this);
|
||||
|
||||
|
||||
if (FileHandler != null && FileHandler is TreeNode)
|
||||
ReplaceNode(this.Parent, this, (TreeNode)FileHandler);
|
||||
}
|
||||
private void Export(object sender, EventArgs args)
|
||||
{
|
||||
SaveFileDialog sfd = new SaveFileDialog();
|
||||
sfd.FileName = Text;
|
||||
sfd.Filter = "All files(*.*)|*.*";
|
||||
|
||||
if (sfd.ShowDialog() == DialogResult.OK)
|
||||
{
|
||||
File.WriteAllBytes(sfd.FileName, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
public static void ReplaceNode(TreeNode node, TreeNode replaceNode, TreeNode NewNode)
|
||||
{
|
||||
if (NewNode == null)
|
||||
@ -459,5 +380,16 @@ namespace FirstPlugin
|
||||
node.Nodes.RemoveAt(index);
|
||||
node.Nodes.Insert(index, NewNode);
|
||||
}
|
||||
|
||||
public bool AddFile(ArchiveFileInfo archiveFileInfo)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool DeleteFile(ArchiveFileInfo archiveFileInfo)
|
||||
{
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CSharpImageLibrary.DDS
|
||||
{
|
||||
class DDS_BlockHelpers
|
||||
{
|
||||
}
|
||||
}
|
@ -0,0 +1,494 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
// https://github.com/KFreon/CSharpImageLibrary
|
||||
|
||||
namespace CSharpImageLibrary.DDS
|
||||
{
|
||||
internal static class DX10_Helpers
|
||||
{
|
||||
public struct LDRColourEndPointPair
|
||||
{
|
||||
public LDRColour A;
|
||||
public LDRColour B;
|
||||
|
||||
public LDRColourEndPointPair(LDRColour a, LDRColour b)
|
||||
{
|
||||
A = a;
|
||||
B = b;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "A" + Environment.NewLine + $"R: {A.R} G: {A.G} B: {A.B} A: {A.A}" + Environment.NewLine +
|
||||
"B" + Environment.NewLine + $"R: {B.R} G: {B.G} B: {B.B} A: {B.A}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Structs
|
||||
public struct LDRColour
|
||||
{
|
||||
public int R;
|
||||
public int G;
|
||||
public int B;
|
||||
public int A;
|
||||
|
||||
public LDRColour(byte R, byte G, byte B, byte A)
|
||||
{
|
||||
this.R = R;
|
||||
this.B = B;
|
||||
this.G = G;
|
||||
this.A = A;
|
||||
}
|
||||
|
||||
public LDRColour(float r, float g, float b, float a)
|
||||
{
|
||||
R = (byte)(Clamp(r, 0f, 1f) * 255);
|
||||
G = (byte)(Clamp(g, 0f, 1f) * 255);
|
||||
B = (byte)(Clamp(b, 0f, 1f) * 255);
|
||||
A = (byte)(Clamp(a, 0f, 1f) * 255);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"R: {R}, G: {G}, B: {B}, A: {A}";
|
||||
}
|
||||
|
||||
static float Clamp(float val, float lower, float upper)
|
||||
{
|
||||
if (val > upper)
|
||||
return upper;
|
||||
|
||||
if (val < lower)
|
||||
return lower;
|
||||
|
||||
return val;
|
||||
}
|
||||
}
|
||||
|
||||
public struct HDRColour
|
||||
{
|
||||
public float R, G, B, A;
|
||||
|
||||
public HDRColour(LDRColour colour)
|
||||
{
|
||||
R = colour.R * 1f / 255f;
|
||||
G = colour.G * 1f / 255f;
|
||||
B = colour.B * 1f / 255f;
|
||||
A = colour.A * 1f / 255f;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"R: {R}, G: {G}, B: {B}, A: {A}";
|
||||
}
|
||||
}
|
||||
#endregion Structs
|
||||
|
||||
#region Constants
|
||||
internal const int BC67_WEIGHT_MAX = 64;
|
||||
internal const int BC67_WEIGHT_ROUND = 32;
|
||||
internal const int BC67_WEIGHT_SHIFT = 6;
|
||||
internal const int NUM_PIXELS_PER_BLOCK = 16;
|
||||
internal const int BC7_MAX_REGIONS = 3;
|
||||
internal const int BC7_MAX_SHAPES = 64;
|
||||
internal const int BC7_MAX_INDICIES = 16;
|
||||
internal const int BC7_NUM_CHANNELS = 4;
|
||||
#endregion Constants
|
||||
|
||||
#region Tables
|
||||
// 3,64,16
|
||||
internal static byte[][][] PartitionTable = new byte[3][][]
|
||||
{ // 1 Region case has no subsets (all 0)
|
||||
new byte[64][]
|
||||
{
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||
},
|
||||
|
||||
new byte[64][]
|
||||
{ // BC6H/BC7 Partition Set for 2 Subsets
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // Shape 0
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }, // Shape 1
|
||||
new byte[16] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, // Shape 2
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 3
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1 }, // Shape 4
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 5
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 6
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 7
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1 }, // Shape 8
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 9
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 10
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1 }, // Shape 11
|
||||
new byte[16] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 12
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 13
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 14
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }, // Shape 15
|
||||
new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, // Shape 16
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // Shape 17
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0 }, // Shape 18
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // Shape 19
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // Shape 20
|
||||
new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 }, // Shape 21
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // Shape 22
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1 }, // Shape 23
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // Shape 24
|
||||
new byte[16] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // Shape 25
|
||||
new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 }, // Shape 26
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, // Shape 27
|
||||
new byte[16] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 }, // Shape 28
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // Shape 29
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, // Shape 30
|
||||
new byte[16] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // Shape 31
|
||||
|
||||
// BC7 Partition Set for 2 Subsets (second-half)
|
||||
new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, // Shape 32
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, // Shape 33
|
||||
new byte[16] { 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 }, // Shape 34
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, // Shape 35
|
||||
new byte[16] { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, // Shape 36
|
||||
new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, // Shape 37
|
||||
new byte[16] { 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 }, // Shape 38
|
||||
new byte[16] { 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, // Shape 39
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 }, // Shape 40
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 }, // Shape 41
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 }, // Shape 42
|
||||
new byte[16] { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0 }, // Shape 43
|
||||
new byte[16] { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // Shape 44
|
||||
new byte[16] { 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, // Shape 45
|
||||
new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 }, // Shape 46
|
||||
new byte[16] { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Shape 47
|
||||
new byte[16] { 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // Shape 48
|
||||
new byte[16] { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0 }, // Shape 49
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0 }, // Shape 50
|
||||
new byte[16] { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, // Shape 51
|
||||
new byte[16] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, // Shape 52
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // Shape 53
|
||||
new byte[16] { 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // Shape 54
|
||||
new byte[16] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0 }, // Shape 55
|
||||
new byte[16] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // Shape 56
|
||||
new byte[16] { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 }, // Shape 57
|
||||
new byte[16] { 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, // Shape 58
|
||||
new byte[16] { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, // Shape 59
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // Shape 60
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // Shape 61
|
||||
new byte[16] { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, // Shape 62
|
||||
new byte[16] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 } // Shape 63
|
||||
},
|
||||
|
||||
new byte[64][]
|
||||
{ // BC7 Partition Set for 3 Subsets
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2 }, // Shape 0
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1 }, // Shape 1
|
||||
new byte[16] { 0, 0, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // Shape 2
|
||||
new byte[16] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 3
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2 }, // Shape 4
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2 }, // Shape 5
|
||||
new byte[16] { 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 6
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // Shape 7
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2 }, // Shape 8
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 }, // Shape 9
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 10
|
||||
new byte[16] { 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2 }, // Shape 11
|
||||
new byte[16] { 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2 }, // Shape 12
|
||||
new byte[16] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2 }, // Shape 13
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // Shape 14
|
||||
new byte[16] { 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2, 2, 2, 0 }, // Shape 15
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2 }, // Shape 16
|
||||
new byte[16] { 0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0 }, // Shape 17
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 }, // Shape 18
|
||||
new byte[16] { 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1 }, // Shape 19
|
||||
new byte[16] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 2 }, // Shape 20
|
||||
new byte[16] { 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1 }, // Shape 21
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2 }, // Shape 22
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0, 2, 2, 1, 0 }, // Shape 23
|
||||
new byte[16] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0 }, // Shape 24
|
||||
new byte[16] { 0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2 }, // Shape 25
|
||||
new byte[16] { 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1, 0, 1, 1, 0 }, // Shape 26
|
||||
new byte[16] { 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1 }, // Shape 27
|
||||
new byte[16] { 0, 0, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 2, 2 }, // Shape 28
|
||||
new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 0, 2, 2, 2, 2, 2 }, // Shape 29
|
||||
new byte[16] { 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1 }, // Shape 30
|
||||
new byte[16] { 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 1, 1, 2, 2, 2, 1 }, // Shape 31
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // Shape 32
|
||||
new byte[16] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 0, 1, 1 }, // Shape 33
|
||||
new byte[16] { 0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 2, 2, 0, 2, 2, 2 }, // Shape 34
|
||||
new byte[16] { 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0 }, // Shape 35
|
||||
new byte[16] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0 }, // Shape 36
|
||||
new byte[16] { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 }, // Shape 37
|
||||
new byte[16] { 0, 1, 2, 0, 2, 0, 1, 2, 1, 2, 0, 1, 0, 1, 2, 0 }, // Shape 38
|
||||
new byte[16] { 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1 }, // Shape 39
|
||||
new byte[16] { 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1 }, // Shape 40
|
||||
new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 41
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1 }, // Shape 42
|
||||
new byte[16] { 0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 2, 2 }, // Shape 43
|
||||
new byte[16] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1 }, // Shape 44
|
||||
new byte[16] { 0, 2, 2, 0, 1, 2, 2, 1, 0, 2, 2, 0, 1, 2, 2, 1 }, // Shape 45
|
||||
new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1 }, // Shape 46
|
||||
new byte[16] { 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 }, // Shape 47
|
||||
new byte[16] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2 }, // Shape 48
|
||||
new byte[16] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1 }, // Shape 49
|
||||
new byte[16] { 0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2 }, // Shape 50
|
||||
new byte[16] { 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2 }, // Shape 51
|
||||
new byte[16] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2 }, // Shape 52
|
||||
new byte[16] { 0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2 }, // Shape 53
|
||||
new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2 }, // Shape 54
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2 }, // Shape 55
|
||||
new byte[16] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 56
|
||||
new byte[16] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2 }, // Shape 57
|
||||
new byte[16] { 0, 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2 }, // Shape 58
|
||||
new byte[16] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2 }, // Shape 59
|
||||
new byte[16] { 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1 }, // Shape 60
|
||||
new byte[16] { 0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2 }, // Shape 61
|
||||
new byte[16] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 62
|
||||
new byte[16] { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 } // Shape 63
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 3,64,3
|
||||
internal static byte[][][] FixUpTable = new byte[3][][]
|
||||
{
|
||||
new byte[64][]
|
||||
{ // No fix-ups for 1st subset for BC6H or BC7
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 },
|
||||
new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }, new byte[3] { 0, 0, 0 }
|
||||
},
|
||||
|
||||
new byte[64][]
|
||||
{ // BC6H/BC7 Partition Set Fixups for 2 Subsets
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0, 2, 0 },
|
||||
new byte[3] { 0, 2, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0, 2, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 2, 0 },
|
||||
new byte[3] { 0, 8, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 2, 0 },
|
||||
|
||||
// BC7 Partition Set Fixups for 2 Subsets (second-half)
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0, 6, 0 }, new byte[3] { 0, 8, 0 },
|
||||
new byte[3] { 0, 2, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0, 2, 0 }, new byte[3] { 0, 8, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 2, 0 },
|
||||
new byte[3] { 0, 2, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0, 6, 0 },
|
||||
new byte[3] { 0, 6, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 6, 0 }, new byte[3] { 0, 8, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 2, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 }, new byte[3] { 0,15, 0 },
|
||||
new byte[3] { 0,15, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0, 2, 0 }, new byte[3] { 0,15, 0 }
|
||||
},
|
||||
|
||||
new byte[64][]
|
||||
{ // BC7 Partition Set Fixups for 3 Subsets
|
||||
new byte[3] { 0, 3,15 }, new byte[3] { 0, 3, 8 }, new byte[3] { 0,15, 8 }, new byte[3] { 0,15, 3 },
|
||||
new byte[3] { 0, 8,15 }, new byte[3] { 0, 3,15 }, new byte[3] { 0,15, 3 }, new byte[3] { 0,15, 8 },
|
||||
new byte[3] { 0, 8,15 }, new byte[3] { 0, 8,15 }, new byte[3] { 0, 6,15 }, new byte[3] { 0, 6,15 },
|
||||
new byte[3] { 0, 6,15 }, new byte[3] { 0, 5,15 }, new byte[3] { 0, 3,15 }, new byte[3] { 0, 3, 8 },
|
||||
new byte[3] { 0, 3,15 }, new byte[3] { 0, 3, 8 }, new byte[3] { 0, 8,15 }, new byte[3] { 0,15, 3 },
|
||||
new byte[3] { 0, 3,15 }, new byte[3] { 0, 3, 8 }, new byte[3] { 0, 6,15 }, new byte[3] { 0,10, 8 },
|
||||
new byte[3] { 0, 5, 3 }, new byte[3] { 0, 8,15 }, new byte[3] { 0, 8, 6 }, new byte[3] { 0, 6,10 },
|
||||
new byte[3] { 0, 8,15 }, new byte[3] { 0, 5,15 }, new byte[3] { 0,15,10 }, new byte[3] { 0,15, 8 },
|
||||
new byte[3] { 0, 8,15 }, new byte[3] { 0,15, 3 }, new byte[3] { 0, 3,15 }, new byte[3] { 0, 5,10 },
|
||||
new byte[3] { 0, 6,10 }, new byte[3] { 0,10, 8 }, new byte[3] { 0, 8, 9 }, new byte[3] { 0,15,10 },
|
||||
new byte[3] { 0,15, 6 }, new byte[3] { 0, 3,15 }, new byte[3] { 0,15, 8 }, new byte[3] { 0, 5,15 },
|
||||
new byte[3] { 0,15, 3 }, new byte[3] { 0,15, 6 }, new byte[3] { 0,15, 6 }, new byte[3] { 0,15, 8 },
|
||||
new byte[3] { 0, 3,15 }, new byte[3] { 0,15, 3 }, new byte[3] { 0, 5,15 }, new byte[3] { 0, 5,15 },
|
||||
new byte[3] { 0, 5,15 }, new byte[3] { 0, 8,15 }, new byte[3] { 0, 5,15 }, new byte[3] { 0,10,15 },
|
||||
new byte[3] { 0, 5,15 }, new byte[3] { 0,10,15 }, new byte[3] { 0, 8,15 }, new byte[3] { 0,13,15 },
|
||||
new byte[3] { 0,15, 3 }, new byte[3] { 0,12,15 }, new byte[3] { 0, 3,15 }, new byte[3] { 0, 3, 8 }
|
||||
}
|
||||
};
|
||||
|
||||
internal static int[] AWeights2 = new int[] { 0, 21, 43, 64 };
|
||||
internal static int[] AWeights3 = new int[] { 0, 9, 18, 27, 37, 46, 55, 64 };
|
||||
internal static int[] AWeights4 = new int[] { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 };
|
||||
#endregion Tables
|
||||
|
||||
|
||||
#region Decompression Helpers
|
||||
internal static int InterpolateA(LDRColour lDRColour1, LDRColour lDRColour2, int wa, int waPrec)
|
||||
{
|
||||
int[] weights = null;
|
||||
switch (waPrec)
|
||||
{
|
||||
case 2:
|
||||
weights = AWeights2;
|
||||
break;
|
||||
case 3:
|
||||
weights = AWeights3;
|
||||
break;
|
||||
case 4:
|
||||
weights = AWeights4;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return (lDRColour1.A * (BC67_WEIGHT_MAX - weights[wa]) + lDRColour2.A * weights[wa] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
}
|
||||
|
||||
internal static LDRColour InterpolateRGB(LDRColour lDRColour1, LDRColour lDRColour2, int wc, int wcPrec)
|
||||
{
|
||||
LDRColour temp = new LDRColour();
|
||||
int[] weights = null;
|
||||
switch (wcPrec)
|
||||
{
|
||||
case 2:
|
||||
weights = AWeights2;
|
||||
break;
|
||||
case 3:
|
||||
weights = AWeights3;
|
||||
break;
|
||||
case 4:
|
||||
weights = AWeights4;
|
||||
break;
|
||||
default:
|
||||
return temp;
|
||||
}
|
||||
temp.R = (lDRColour1.R * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.R * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
temp.G = (lDRColour1.G * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.G * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
temp.B = (lDRColour1.B * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.B * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
return temp;
|
||||
}
|
||||
|
||||
internal static bool IsFixUpOffset(int partitions, int shape, int offset)
|
||||
{
|
||||
for (int i = 0; i <= partitions; i++)
|
||||
{
|
||||
if (offset == FixUpTable[partitions][shape][i])
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static LDRColour Unquantise(LDRColour colour, LDRColour rGBPrecisionWithP)
|
||||
{
|
||||
LDRColour temp = new LDRColour()
|
||||
{
|
||||
R = Unquantise(colour.R, rGBPrecisionWithP.R),
|
||||
G = Unquantise(colour.G, rGBPrecisionWithP.G),
|
||||
B = Unquantise(colour.B, rGBPrecisionWithP.B),
|
||||
A = rGBPrecisionWithP.A > 0 ? Unquantise(colour.A, rGBPrecisionWithP.A) : 255
|
||||
};
|
||||
return temp;
|
||||
}
|
||||
|
||||
internal static int Unquantise(int r1, int r2)
|
||||
{
|
||||
int temp = r1 << (8 - r2);
|
||||
return temp | (temp >> r2);
|
||||
}
|
||||
|
||||
internal static int GetBit(byte[] source, int sourceStart, ref int start)
|
||||
{
|
||||
int uIndex = start >> 3;
|
||||
int ret = (source[sourceStart + uIndex] >> (start - (uIndex << 3))) & 0x01;
|
||||
start++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static int GetBits(byte[] source, int sourceStart, ref int start, int length)
|
||||
{
|
||||
if (length == 0)
|
||||
return 0;
|
||||
|
||||
int uIndex = start >> 3;
|
||||
int uBase = start - (uIndex << 3);
|
||||
int ret = 0;
|
||||
|
||||
if (uBase + length > 8)
|
||||
{
|
||||
int firstIndexBits = 8 - uBase;
|
||||
int nextIndexBits = length - firstIndexBits;
|
||||
ret = (source[sourceStart + uIndex] >> uBase) | ((source[sourceStart + uIndex + 1] & ((1 << nextIndexBits) - 1)) << firstIndexBits);
|
||||
}
|
||||
else
|
||||
ret = (source[sourceStart + uIndex] >> uBase) & ((1 << length) - 1);
|
||||
|
||||
|
||||
start += length;
|
||||
return ret;
|
||||
}
|
||||
#endregion Decompression Helpers
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
// https://github.com/KFreon/CSharpImageLibrary
|
||||
|
||||
namespace CSharpImageLibrary.DDS
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines how alpha is handled.
|
||||
/// </summary>
|
||||
public enum AlphaSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// Keeps any existing alpha.
|
||||
/// </summary>
|
||||
KeepAlpha,
|
||||
|
||||
/// <summary>
|
||||
/// Premultiplies RBG and Alpha channels. Alpha remains.
|
||||
/// </summary>
|
||||
Premultiply,
|
||||
|
||||
/// <summary>
|
||||
/// Removes alpha channel.
|
||||
/// </summary>
|
||||
RemoveAlphaChannel,
|
||||
}
|
||||
}
|
@ -1,429 +0,0 @@
|
||||
// https://github.com/KFreon/CSharpImageLibrary
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
namespace CSharpImageLibrary.DDS
|
||||
{
|
||||
internal static class DX10_Helpers
|
||||
{
|
||||
#region Structs
|
||||
public struct LDRColour
|
||||
{
|
||||
public int R;
|
||||
public int G;
|
||||
public int B;
|
||||
public int A;
|
||||
|
||||
public LDRColour(byte R, byte G, byte B, byte A)
|
||||
{
|
||||
this.R = R;
|
||||
this.B = B;
|
||||
this.G = G;
|
||||
this.A = A;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"R: {R}, G: {G}, B: {B}, A: {A}";
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Structs
|
||||
|
||||
#region Constants
|
||||
internal const int BC67_WEIGHT_MAX = 64;
|
||||
internal const int BC67_WEIGHT_ROUND = 32;
|
||||
internal const int BC67_WEIGHT_SHIFT = 6;
|
||||
internal const int NUM_PIXELS_PER_BLOCK = 16;
|
||||
#endregion Constants
|
||||
|
||||
#region Tables
|
||||
// 3,64,16
|
||||
internal static byte[][][] PartitionTable = {
|
||||
// 1 Region case has no subsets (all 0)
|
||||
new[]
|
||||
{
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
|
||||
},
|
||||
|
||||
new[]
|
||||
{ // BC6H/BC7 Partition Set for 2 Subsets
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // Shape 0
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 }, // Shape 1
|
||||
new byte[] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1 }, // Shape 2
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 3
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1 }, // Shape 4
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 5
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 6
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 7
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1 }, // Shape 8
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 9
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1 }, // Shape 10
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1 }, // Shape 11
|
||||
new byte[] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 12
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 13
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 14
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 }, // Shape 15
|
||||
new byte[] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1 }, // Shape 16
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // Shape 17
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0 }, // Shape 18
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // Shape 19
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, // Shape 20
|
||||
new byte[] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0 }, // Shape 21
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // Shape 22
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1 }, // Shape 23
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 }, // Shape 24
|
||||
new byte[] { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0 }, // Shape 25
|
||||
new byte[] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0 }, // Shape 26
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 0 }, // Shape 27
|
||||
new byte[] { 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0 }, // Shape 28
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // Shape 29
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0 }, // Shape 30
|
||||
new byte[] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // Shape 31
|
||||
|
||||
// BC7 Partition Set for 2 Subsets (second-half)
|
||||
new byte[] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1 }, // Shape 32
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1 }, // Shape 33
|
||||
new byte[] { 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0 }, // Shape 34
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0 }, // Shape 35
|
||||
new byte[] { 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 }, // Shape 36
|
||||
new byte[] { 0, 1, 0, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0 }, // Shape 37
|
||||
new byte[] { 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1 }, // Shape 38
|
||||
new byte[] { 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1 }, // Shape 39
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0 }, // Shape 40
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 }, // Shape 41
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0 }, // Shape 42
|
||||
new byte[] { 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0 }, // Shape 43
|
||||
new byte[] { 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0 }, // Shape 44
|
||||
new byte[] { 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1 }, // Shape 45
|
||||
new byte[] { 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1 }, // Shape 46
|
||||
new byte[] { 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0 }, // Shape 47
|
||||
new byte[] { 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, // Shape 48
|
||||
new byte[] { 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0 }, // Shape 49
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0 }, // Shape 50
|
||||
new byte[] { 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0 }, // Shape 51
|
||||
new byte[] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1 }, // Shape 52
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // Shape 53
|
||||
new byte[] { 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0 }, // Shape 54
|
||||
new byte[] { 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0 }, // Shape 55
|
||||
new byte[] { 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1 }, // Shape 56
|
||||
new byte[] { 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1 }, // Shape 57
|
||||
new byte[] { 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 }, // Shape 58
|
||||
new byte[] { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1 }, // Shape 59
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }, // Shape 60
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, // Shape 61
|
||||
new byte[] { 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0 }, // Shape 62
|
||||
new byte[] { 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1 } // Shape 63
|
||||
},
|
||||
|
||||
new[]
|
||||
{ // BC7 Partition Set for 3 Subsets
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 1, 2, 2, 2, 2 }, // Shape 0
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 2, 1 }, // Shape 1
|
||||
new byte[] { 0, 0, 0, 0, 2, 0, 0, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // Shape 2
|
||||
new byte[] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 1, 0, 1, 1, 1 }, // Shape 3
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2 }, // Shape 4
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 2, 2 }, // Shape 5
|
||||
new byte[] { 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1 }, // Shape 6
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1 }, // Shape 7
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2 }, // Shape 8
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2 }, // Shape 9
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 10
|
||||
new byte[] { 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2 }, // Shape 11
|
||||
new byte[] { 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2, 0, 1, 1, 2 }, // Shape 12
|
||||
new byte[] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2, 0, 1, 2, 2 }, // Shape 13
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // Shape 14
|
||||
new byte[] { 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0, 2, 2, 2, 0 }, // Shape 15
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 1, 2, 1, 1, 2, 2 }, // Shape 16
|
||||
new byte[] { 0, 1, 1, 1, 0, 0, 1, 1, 2, 0, 0, 1, 2, 2, 0, 0 }, // Shape 17
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2 }, // Shape 18
|
||||
new byte[] { 0, 0, 2, 2, 0, 0, 2, 2, 0, 0, 2, 2, 1, 1, 1, 1 }, // Shape 19
|
||||
new byte[] { 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 2, 2 }, // Shape 20
|
||||
new byte[] { 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 1, 2, 2, 2, 1 }, // Shape 21
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2 }, // Shape 22
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 0, 0, 2, 2, 1, 0, 2, 2, 1, 0 }, // Shape 23
|
||||
new byte[] { 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1, 0, 0, 0, 0 }, // Shape 24
|
||||
new byte[] { 0, 0, 1, 2, 0, 0, 1, 2, 1, 1, 2, 2, 2, 2, 2, 2 }, // Shape 25
|
||||
new byte[] { 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1, 0, 1, 1, 0 }, // Shape 26
|
||||
new byte[] { 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 2, 1, 1, 2, 2, 1 }, // Shape 27
|
||||
new byte[] { 0, 0, 2, 2, 1, 1, 0, 2, 1, 1, 0, 2, 0, 0, 2, 2 }, // Shape 28
|
||||
new byte[] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 0, 2, 2, 2, 2, 2 }, // Shape 29
|
||||
new byte[] { 0, 0, 1, 1, 0, 1, 2, 2, 0, 1, 2, 2, 0, 0, 1, 1 }, // Shape 30
|
||||
new byte[] { 0, 0, 0, 0, 2, 0, 0, 0, 2, 2, 1, 1, 2, 2, 2, 1 }, // Shape 31
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 2, 2, 2 }, // Shape 32
|
||||
new byte[] { 0, 2, 2, 2, 0, 0, 2, 2, 0, 0, 1, 2, 0, 0, 1, 1 }, // Shape 33
|
||||
new byte[] { 0, 0, 1, 1, 0, 0, 1, 2, 0, 0, 2, 2, 0, 2, 2, 2 }, // Shape 34
|
||||
new byte[] { 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0, 0, 1, 2, 0 }, // Shape 35
|
||||
new byte[] { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0 }, // Shape 36
|
||||
new byte[] { 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0 }, // Shape 37
|
||||
new byte[] { 0, 1, 2, 0, 2, 0, 1, 2, 1, 2, 0, 1, 0, 1, 2, 0 }, // Shape 38
|
||||
new byte[] { 0, 0, 1, 1, 2, 2, 0, 0, 1, 1, 2, 2, 0, 0, 1, 1 }, // Shape 39
|
||||
new byte[] { 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 0, 0, 0, 1, 1 }, // Shape 40
|
||||
new byte[] { 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 41
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1 }, // Shape 42
|
||||
new byte[] { 0, 0, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2, 1, 1, 2, 2 }, // Shape 43
|
||||
new byte[] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 2, 2, 0, 0, 1, 1 }, // Shape 44
|
||||
new byte[] { 0, 2, 2, 0, 1, 2, 2, 1, 0, 2, 2, 0, 1, 2, 2, 1 }, // Shape 45
|
||||
new byte[] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 0, 1, 0, 1 }, // Shape 46
|
||||
new byte[] { 0, 0, 0, 0, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 }, // Shape 47
|
||||
new byte[] { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 2, 2, 2, 2 }, // Shape 48
|
||||
new byte[] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 2, 2, 2, 0, 1, 1, 1 }, // Shape 49
|
||||
new byte[] { 0, 0, 0, 2, 1, 1, 1, 2, 0, 0, 0, 2, 1, 1, 1, 2 }, // Shape 50
|
||||
new byte[] { 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 1, 2 }, // Shape 51
|
||||
new byte[] { 0, 2, 2, 2, 0, 1, 1, 1, 0, 1, 1, 1, 0, 2, 2, 2 }, // Shape 52
|
||||
new byte[] { 0, 0, 0, 2, 1, 1, 1, 2, 1, 1, 1, 2, 0, 0, 0, 2 }, // Shape 53
|
||||
new byte[] { 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2 }, // Shape 54
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2, 2, 1, 1, 2 }, // Shape 55
|
||||
new byte[] { 0, 1, 1, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 56
|
||||
new byte[] { 0, 0, 2, 2, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 2, 2 }, // Shape 57
|
||||
new byte[] { 0, 0, 2, 2, 1, 1, 2, 2, 1, 1, 2, 2, 0, 0, 2, 2 }, // Shape 58
|
||||
new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 2 }, // Shape 59
|
||||
new byte[] { 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1 }, // Shape 60
|
||||
new byte[] { 0, 2, 2, 2, 1, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2 }, // Shape 61
|
||||
new byte[] { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 62
|
||||
new byte[] { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 } // Shape 63
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
// 3,64,3
|
||||
internal static byte[][][] FixUpTable = {
|
||||
new[]
|
||||
{ // No fix-ups for 1st subset for BC6H or BC7
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 },
|
||||
new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }, new byte[] { 0, 0, 0 }
|
||||
},
|
||||
|
||||
new[]
|
||||
{ // BC6H/BC7 Partition Set Fixups for 2 Subsets
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 },
|
||||
new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 },
|
||||
new byte[] { 0, 8, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 },
|
||||
|
||||
// BC7 Partition Set Fixups for 2 Subsets (second-half)
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 },
|
||||
new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0, 2, 0 }, new byte[] { 0, 8, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 },
|
||||
new byte[] { 0, 2, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0, 6, 0 },
|
||||
new byte[] { 0, 6, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 6, 0 }, new byte[] { 0, 8, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 }, new byte[] { 0,15, 0 },
|
||||
new byte[] { 0,15, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0, 2, 0 }, new byte[] { 0,15, 0 }
|
||||
},
|
||||
|
||||
new[]
|
||||
{ // BC7 Partition Set Fixups for 3 Subsets
|
||||
new byte[] { 0, 3,15 }, new byte[] { 0, 3, 8 }, new byte[] { 0,15, 8 }, new byte[] { 0,15, 3 },
|
||||
new byte[] { 0, 8,15 }, new byte[] { 0, 3,15 }, new byte[] { 0,15, 3 }, new byte[] { 0,15, 8 },
|
||||
new byte[] { 0, 8,15 }, new byte[] { 0, 8,15 }, new byte[] { 0, 6,15 }, new byte[] { 0, 6,15 },
|
||||
new byte[] { 0, 6,15 }, new byte[] { 0, 5,15 }, new byte[] { 0, 3,15 }, new byte[] { 0, 3, 8 },
|
||||
new byte[] { 0, 3,15 }, new byte[] { 0, 3, 8 }, new byte[] { 0, 8,15 }, new byte[] { 0,15, 3 },
|
||||
new byte[] { 0, 3,15 }, new byte[] { 0, 3, 8 }, new byte[] { 0, 6,15 }, new byte[] { 0,10, 8 },
|
||||
new byte[] { 0, 5, 3 }, new byte[] { 0, 8,15 }, new byte[] { 0, 8, 6 }, new byte[] { 0, 6,10 },
|
||||
new byte[] { 0, 8,15 }, new byte[] { 0, 5,15 }, new byte[] { 0,15,10 }, new byte[] { 0,15, 8 },
|
||||
new byte[] { 0, 8,15 }, new byte[] { 0,15, 3 }, new byte[] { 0, 3,15 }, new byte[] { 0, 5,10 },
|
||||
new byte[] { 0, 6,10 }, new byte[] { 0,10, 8 }, new byte[] { 0, 8, 9 }, new byte[] { 0,15,10 },
|
||||
new byte[] { 0,15, 6 }, new byte[] { 0, 3,15 }, new byte[] { 0,15, 8 }, new byte[] { 0, 5,15 },
|
||||
new byte[] { 0,15, 3 }, new byte[] { 0,15, 6 }, new byte[] { 0,15, 6 }, new byte[] { 0,15, 8 },
|
||||
new byte[] { 0, 3,15 }, new byte[] { 0,15, 3 }, new byte[] { 0, 5,15 }, new byte[] { 0, 5,15 },
|
||||
new byte[] { 0, 5,15 }, new byte[] { 0, 8,15 }, new byte[] { 0, 5,15 }, new byte[] { 0,10,15 },
|
||||
new byte[] { 0, 5,15 }, new byte[] { 0,10,15 }, new byte[] { 0, 8,15 }, new byte[] { 0,13,15 },
|
||||
new byte[] { 0,15, 3 }, new byte[] { 0,12,15 }, new byte[] { 0, 3,15 }, new byte[] { 0, 3, 8 }
|
||||
}
|
||||
};
|
||||
|
||||
internal static int[] AWeights2 = { 0, 21, 43, 64 };
|
||||
internal static int[] AWeights3 = { 0, 9, 18, 27, 37, 46, 55, 64 };
|
||||
internal static int[] AWeights4 = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 };
|
||||
#endregion Tables
|
||||
|
||||
|
||||
#region Decompression Helpers
|
||||
internal static int InterpolateA(LDRColour lDRColour1, LDRColour lDRColour2, int wa, int waPrec)
|
||||
{
|
||||
int[] weights;
|
||||
switch (waPrec)
|
||||
{
|
||||
case 2:
|
||||
weights = AWeights2;
|
||||
break;
|
||||
case 3:
|
||||
weights = AWeights3;
|
||||
break;
|
||||
case 4:
|
||||
weights = AWeights4;
|
||||
break;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return (lDRColour1.A * (BC67_WEIGHT_MAX - weights[wa]) + lDRColour2.A * weights[wa] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
}
|
||||
|
||||
internal static LDRColour InterpolateRGB(LDRColour lDRColour1, LDRColour lDRColour2, int wc, int wcPrec)
|
||||
{
|
||||
LDRColour temp = new LDRColour();
|
||||
int[] weights;
|
||||
switch (wcPrec)
|
||||
{
|
||||
case 2:
|
||||
weights = AWeights2;
|
||||
break;
|
||||
case 3:
|
||||
weights = AWeights3;
|
||||
break;
|
||||
case 4:
|
||||
weights = AWeights4;
|
||||
break;
|
||||
default:
|
||||
return temp;
|
||||
}
|
||||
temp.R = (lDRColour1.R * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.R * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
temp.G = (lDRColour1.G * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.G * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
temp.B = (lDRColour1.B * (BC67_WEIGHT_MAX - weights[wc]) + lDRColour2.B * weights[wc] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT;
|
||||
return temp;
|
||||
}
|
||||
|
||||
internal static bool IsFixUpOffset(int partitions, int shape, int offset)
|
||||
{
|
||||
for (int i = 0; i <= partitions; i++)
|
||||
{
|
||||
if (offset == FixUpTable[partitions][shape][i])
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static LDRColour Unquantise(LDRColour colour, LDRColour rGBPrecisionWithP)
|
||||
{
|
||||
LDRColour temp = new LDRColour
|
||||
{
|
||||
R = Unquantise(colour.R, rGBPrecisionWithP.R),
|
||||
G = Unquantise(colour.G, rGBPrecisionWithP.G),
|
||||
B = Unquantise(colour.B, rGBPrecisionWithP.B),
|
||||
A = rGBPrecisionWithP.A > 0 ? Unquantise(colour.A, rGBPrecisionWithP.A) : 255
|
||||
};
|
||||
return temp;
|
||||
}
|
||||
|
||||
internal static int Unquantise(int r1, int r2)
|
||||
{
|
||||
int temp = r1 << (8 - r2);
|
||||
return temp | (temp >> r2);
|
||||
}
|
||||
|
||||
internal static int GetBit(byte[] source, int sourceStart, ref int start)
|
||||
{
|
||||
int uIndex = start >> 3;
|
||||
int ret = (source[sourceStart + uIndex] >> (start - (uIndex << 3))) & 0x01;
|
||||
start++;
|
||||
return ret;
|
||||
}
|
||||
|
||||
internal static int GetBits(byte[] source, int sourceStart, ref int start, int length)
|
||||
{
|
||||
if (length == 0)
|
||||
return 0;
|
||||
|
||||
int uIndex = start >> 3;
|
||||
int uBase = start - (uIndex << 3);
|
||||
int ret;
|
||||
|
||||
if (uBase + length > 8)
|
||||
{
|
||||
int firstIndexBits = 8 - uBase;
|
||||
int nextIndexBits = length - firstIndexBits;
|
||||
ret = (source[sourceStart + uIndex] >> uBase) | ((source[sourceStart + uIndex + 1] & ((1 << nextIndexBits) - 1)) << firstIndexBits);
|
||||
}
|
||||
else
|
||||
ret = (source[sourceStart + uIndex] >> uBase) & ((1 << length) - 1);
|
||||
|
||||
|
||||
start += length;
|
||||
return ret;
|
||||
}
|
||||
#endregion Decompression Helpers
|
||||
}
|
||||
}
|
142
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.Designer.cs
generated
Normal file
142
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.Designer.cs
generated
Normal file
@ -0,0 +1,142 @@
|
||||
namespace Switch_Toolbox.Library.Forms
|
||||
{
|
||||
partial class ArchiveListPreviewForm
|
||||
{
|
||||
/// <summary>
|
||||
/// Required designer variable.
|
||||
/// </summary>
|
||||
private System.ComponentModel.IContainer components = null;
|
||||
|
||||
/// <summary>
|
||||
/// Clean up any resources being used.
|
||||
/// </summary>
|
||||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||
protected override void Dispose(bool disposing)
|
||||
{
|
||||
if (disposing && (components != null))
|
||||
{
|
||||
components.Dispose();
|
||||
}
|
||||
base.Dispose(disposing);
|
||||
}
|
||||
|
||||
#region Windows Form Designer generated code
|
||||
|
||||
/// <summary>
|
||||
/// Required method for Designer support - do not modify
|
||||
/// the contents of this method with the code editor.
|
||||
/// </summary>
|
||||
private void InitializeComponent()
|
||||
{
|
||||
this.components = new System.ComponentModel.Container();
|
||||
this.stPanel1 = new Switch_Toolbox.Library.Forms.STPanel();
|
||||
this.listViewCustom1 = new Switch_Toolbox.Library.Forms.ListViewCustom();
|
||||
this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.stMenuStrip1 = new Switch_Toolbox.Library.Forms.STMenuStrip();
|
||||
this.viewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
|
||||
this.stContextMenuStrip1 = new Switch_Toolbox.Library.Forms.STContextMenuStrip(this.components);
|
||||
this.contentContainer.SuspendLayout();
|
||||
this.stPanel1.SuspendLayout();
|
||||
this.stMenuStrip1.SuspendLayout();
|
||||
this.SuspendLayout();
|
||||
//
|
||||
// contentContainer
|
||||
//
|
||||
this.contentContainer.Controls.Add(this.stPanel1);
|
||||
this.contentContainer.Size = new System.Drawing.Size(842, 497);
|
||||
this.contentContainer.Controls.SetChildIndex(this.stPanel1, 0);
|
||||
//
|
||||
// stPanel1
|
||||
//
|
||||
this.stPanel1.Controls.Add(this.listViewCustom1);
|
||||
this.stPanel1.Controls.Add(this.stMenuStrip1);
|
||||
this.stPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.stPanel1.Location = new System.Drawing.Point(0, 25);
|
||||
this.stPanel1.Name = "stPanel1";
|
||||
this.stPanel1.Size = new System.Drawing.Size(842, 472);
|
||||
this.stPanel1.TabIndex = 11;
|
||||
//
|
||||
// listViewCustom1
|
||||
//
|
||||
this.listViewCustom1.BorderStyle = System.Windows.Forms.BorderStyle.None;
|
||||
this.listViewCustom1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] {
|
||||
this.columnHeader1,
|
||||
this.columnHeader2,
|
||||
this.columnHeader3});
|
||||
this.listViewCustom1.Dock = System.Windows.Forms.DockStyle.Fill;
|
||||
this.listViewCustom1.Location = new System.Drawing.Point(0, 24);
|
||||
this.listViewCustom1.Name = "listViewCustom1";
|
||||
this.listViewCustom1.OwnerDraw = true;
|
||||
this.listViewCustom1.Size = new System.Drawing.Size(842, 448);
|
||||
this.listViewCustom1.TabIndex = 1;
|
||||
this.listViewCustom1.UseCompatibleStateImageBehavior = false;
|
||||
this.listViewCustom1.DoubleClick += new System.EventHandler(this.listViewCustom1_DoubleClick);
|
||||
this.listViewCustom1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.listViewCustom1_MouseClick);
|
||||
//
|
||||
// columnHeader1
|
||||
//
|
||||
this.columnHeader1.Text = "Name";
|
||||
this.columnHeader1.Width = 214;
|
||||
//
|
||||
// columnHeader2
|
||||
//
|
||||
this.columnHeader2.Text = "Type";
|
||||
this.columnHeader2.Width = 126;
|
||||
//
|
||||
// columnHeader3
|
||||
//
|
||||
this.columnHeader3.Text = "Size";
|
||||
//
|
||||
// stMenuStrip1
|
||||
//
|
||||
this.stMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
|
||||
this.viewToolStripMenuItem});
|
||||
this.stMenuStrip1.Location = new System.Drawing.Point(0, 0);
|
||||
this.stMenuStrip1.Name = "stMenuStrip1";
|
||||
this.stMenuStrip1.Size = new System.Drawing.Size(842, 24);
|
||||
this.stMenuStrip1.TabIndex = 0;
|
||||
this.stMenuStrip1.Text = "stMenuStrip1";
|
||||
//
|
||||
// viewToolStripMenuItem
|
||||
//
|
||||
this.viewToolStripMenuItem.Name = "viewToolStripMenuItem";
|
||||
this.viewToolStripMenuItem.Size = new System.Drawing.Size(44, 20);
|
||||
this.viewToolStripMenuItem.Text = "View";
|
||||
//
|
||||
// stContextMenuStrip1
|
||||
//
|
||||
this.stContextMenuStrip1.Name = "stContextMenuStrip1";
|
||||
this.stContextMenuStrip1.Size = new System.Drawing.Size(61, 4);
|
||||
//
|
||||
// ArchiveListPreviewForm
|
||||
//
|
||||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
||||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||
this.ClientSize = new System.Drawing.Size(848, 502);
|
||||
this.MainMenuStrip = this.stMenuStrip1;
|
||||
this.Name = "ArchiveListPreviewForm";
|
||||
this.Text = "Archive Preview";
|
||||
this.Controls.SetChildIndex(this.contentContainer, 0);
|
||||
this.contentContainer.ResumeLayout(false);
|
||||
this.stPanel1.ResumeLayout(false);
|
||||
this.stPanel1.PerformLayout();
|
||||
this.stMenuStrip1.ResumeLayout(false);
|
||||
this.stMenuStrip1.PerformLayout();
|
||||
this.ResumeLayout(false);
|
||||
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private STPanel stPanel1;
|
||||
private ListViewCustom listViewCustom1;
|
||||
private STMenuStrip stMenuStrip1;
|
||||
private System.Windows.Forms.ToolStripMenuItem viewToolStripMenuItem;
|
||||
private System.Windows.Forms.ColumnHeader columnHeader1;
|
||||
private System.Windows.Forms.ColumnHeader columnHeader2;
|
||||
private System.Windows.Forms.ColumnHeader columnHeader3;
|
||||
private STContextMenuStrip stContextMenuStrip1;
|
||||
}
|
||||
}
|
169
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.cs
Normal file
169
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.cs
Normal file
@ -0,0 +1,169 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Data;
|
||||
using System.Drawing;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Switch_Toolbox.Library.Forms
|
||||
{
|
||||
public partial class ArchiveListPreviewForm : STForm
|
||||
{
|
||||
public ArchiveListPreviewForm()
|
||||
{
|
||||
InitializeComponent();
|
||||
}
|
||||
|
||||
ImageList ImageList = new ImageList();
|
||||
public void LoadArchive(IArchiveFile ArchiveFile)
|
||||
{
|
||||
ImageList.ColorDepth = ColorDepth.Depth32Bit;
|
||||
ImageList.ImageSize = new Size(40,40);
|
||||
|
||||
var Files = OpenFileFormats(ArchiveFile);
|
||||
|
||||
List<STGenericTexture> Textures = new List<STGenericTexture>();
|
||||
|
||||
listViewCustom1.LargeImageList = ImageList;
|
||||
listViewCustom1.BeginUpdate();
|
||||
for (int i = 0; i < Files.Count; i++)
|
||||
{
|
||||
if (Files[i].FileFormat.FileType == FileType.Image)
|
||||
{
|
||||
Textures.AddRange(GetTextures(Files[i].FileFormat));
|
||||
}
|
||||
}
|
||||
LoadTexturesThread(Textures);
|
||||
|
||||
listViewCustom1.EndUpdate();
|
||||
}
|
||||
|
||||
private void LoadTexturesThread(List<STGenericTexture> Textures)
|
||||
{
|
||||
ImageList.Images.Clear();
|
||||
|
||||
Thread Thread = new Thread((ThreadStart)(() =>
|
||||
{
|
||||
foreach (var tex in Textures)
|
||||
{
|
||||
Bitmap temp = tex.GetBitmap();
|
||||
if (temp == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (listViewCustom1.InvokeRequired)
|
||||
{
|
||||
listViewCustom1.Invoke((MethodInvoker)delegate {
|
||||
ListViewItem item = new ListViewItem(tex.Text, ImageList.Images.Count);
|
||||
item.Tag = tex;
|
||||
|
||||
listViewCustom1.Items.Add(item);
|
||||
// Running on the UI thread
|
||||
ImageList.Images.Add(temp);
|
||||
var dummy = ImageList.Handle;
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
ListViewItem item = new ListViewItem(tex.Text, ImageList.Images.Count);
|
||||
item.Tag = tex;
|
||||
|
||||
listViewCustom1.Items.Add(item);
|
||||
ImageList.Images.Add(temp);
|
||||
var dummy = ImageList.Handle;
|
||||
}
|
||||
|
||||
temp.Dispose();
|
||||
}
|
||||
}));
|
||||
Thread.Start();
|
||||
}
|
||||
|
||||
private List<STGenericTexture> GetTextures(IFileFormat Format)
|
||||
{
|
||||
var Textures = new List<STGenericTexture>();
|
||||
|
||||
if (Format is STGenericTexture)
|
||||
Textures.Add((STGenericTexture)Format);
|
||||
|
||||
if (Format is TreeNodeFile)
|
||||
{
|
||||
foreach (var node in ((TreeNodeFile)Format).Nodes)
|
||||
if (node is STGenericTexture) Textures.Add((STGenericTexture)node);
|
||||
}
|
||||
|
||||
return Textures;
|
||||
}
|
||||
|
||||
//Create a combination of all the archive files in multiple archives
|
||||
//All files in this list are supported formats
|
||||
public List<ArchiveFileInfo> OpenFileFormats(IArchiveFile ArchiveFile)
|
||||
{
|
||||
var Files = new List<ArchiveFileInfo>();
|
||||
foreach (var file in ArchiveFile.Files)
|
||||
{
|
||||
if (file.FileFormat == null)
|
||||
{
|
||||
file.FileFormat = file.OpenFile();
|
||||
if (file.FileFormat != null)
|
||||
{
|
||||
if (file.FileFormat is IArchiveFile)
|
||||
return OpenFileFormats((IArchiveFile)file.FileFormat);
|
||||
else
|
||||
Files.Add(file);
|
||||
}
|
||||
}
|
||||
else
|
||||
Files.Add(file);
|
||||
}
|
||||
|
||||
return Files;
|
||||
}
|
||||
|
||||
private void listViewCustom1_MouseClick(object sender, MouseEventArgs e)
|
||||
{
|
||||
if (listViewCustom1.SelectedItems.Count > 0 && e.Button == MouseButtons.Right)
|
||||
{
|
||||
var item = listViewCustom1.SelectedItems[0];
|
||||
if (item.Tag is TreeNode)
|
||||
{
|
||||
// stContextMenuStrip1.Items.AddRange(((TreeNode)item.Tag).ContextMenuStrip.Items);
|
||||
|
||||
Point pt = listViewCustom1.PointToScreen(e.Location);
|
||||
stContextMenuStrip1.Show(pt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ImageEditorForm imageEditorForm;
|
||||
|
||||
private void LoadImageEditor(STGenericTexture texture, object Properties)
|
||||
{
|
||||
if (imageEditorForm == null || imageEditorForm.IsDisposed)
|
||||
{
|
||||
imageEditorForm = new ImageEditorForm(false);
|
||||
imageEditorForm.Show(this);
|
||||
}
|
||||
|
||||
imageEditorForm.editorBase.Text = Text;
|
||||
imageEditorForm.editorBase.Dock = DockStyle.Fill;
|
||||
imageEditorForm.editorBase.LoadProperties(Properties);
|
||||
imageEditorForm.editorBase.LoadImage(texture);
|
||||
}
|
||||
|
||||
private void listViewCustom1_DoubleClick(object sender, EventArgs e)
|
||||
{
|
||||
if (listViewCustom1.SelectedItems.Count > 0)
|
||||
{
|
||||
var item = listViewCustom1.SelectedItems[0];
|
||||
if (item.Tag is STGenericTexture)
|
||||
{
|
||||
LoadImageEditor((STGenericTexture)item.Tag, ((STGenericTexture)item.Tag).GenericProperties);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
126
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.resx
Normal file
126
Switch_Toolbox_Library/Forms/ArchiveListPreviewForm.resx
Normal file
@ -0,0 +1,126 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<root>
|
||||
<!--
|
||||
Microsoft ResX Schema
|
||||
|
||||
Version 2.0
|
||||
|
||||
The primary goals of this format is to allow a simple XML format
|
||||
that is mostly human readable. The generation and parsing of the
|
||||
various data types are done through the TypeConverter classes
|
||||
associated with the data types.
|
||||
|
||||
Example:
|
||||
|
||||
... ado.net/XML headers & schema ...
|
||||
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||
<resheader name="version">2.0</resheader>
|
||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||
</data>
|
||||
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||
<comment>This is a comment</comment>
|
||||
</data>
|
||||
|
||||
There are any number of "resheader" rows that contain simple
|
||||
name/value pairs.
|
||||
|
||||
Each data row contains a name, and value. The row also contains a
|
||||
type or mimetype. Type corresponds to a .NET class that support
|
||||
text/value conversion through the TypeConverter architecture.
|
||||
Classes that don't support this are serialized and stored with the
|
||||
mimetype set.
|
||||
|
||||
The mimetype is used for serialized objects, and tells the
|
||||
ResXResourceReader how to depersist the object. This is currently not
|
||||
extensible. For a given mimetype the value must be set accordingly:
|
||||
|
||||
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||
that the ResXResourceWriter will generate, however the reader can
|
||||
read any of the formats listed below.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.binary.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.soap.base64
|
||||
value : The object must be serialized with
|
||||
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||
: and then encoded with base64 encoding.
|
||||
|
||||
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||
value : The object must be serialized into a byte array
|
||||
: using a System.ComponentModel.TypeConverter
|
||||
: and then encoded with base64 encoding.
|
||||
-->
|
||||
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||
<xsd:element name="root" msdata:IsDataSet="true">
|
||||
<xsd:complexType>
|
||||
<xsd:choice maxOccurs="unbounded">
|
||||
<xsd:element name="metadata">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||
<xsd:attribute name="type" type="xsd:string" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="assembly">
|
||||
<xsd:complexType>
|
||||
<xsd:attribute name="alias" type="xsd:string" />
|
||||
<xsd:attribute name="name" type="xsd:string" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="data">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||
<xsd:attribute ref="xml:space" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
<xsd:element name="resheader">
|
||||
<xsd:complexType>
|
||||
<xsd:sequence>
|
||||
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||
</xsd:sequence>
|
||||
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:choice>
|
||||
</xsd:complexType>
|
||||
</xsd:element>
|
||||
</xsd:schema>
|
||||
<resheader name="resmimetype">
|
||||
<value>text/microsoft-resx</value>
|
||||
</resheader>
|
||||
<resheader name="version">
|
||||
<value>2.0</value>
|
||||
</resheader>
|
||||
<resheader name="reader">
|
||||
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<resheader name="writer">
|
||||
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||
</resheader>
|
||||
<metadata name="stMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>17, 17</value>
|
||||
</metadata>
|
||||
<metadata name="stContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
|
||||
<value>141, 17</value>
|
||||
</metadata>
|
||||
</root>
|
@ -139,8 +139,7 @@ namespace Switch_Toolbox.Library.Forms
|
||||
|
||||
if (rootIndex == roots.Length - 1)
|
||||
{
|
||||
ArchiveFileWrapper wrapperFile = new ArchiveFileWrapper(parentName, archiveFile);
|
||||
wrapperFile.ArchiveFileInfo = node;
|
||||
ArchiveFileWrapper wrapperFile = new ArchiveFileWrapper(parentName, node, archiveFile);
|
||||
wrapperFile.Name = nodeName;
|
||||
parentNode.Nodes.Add(wrapperFile);
|
||||
parentNode = wrapperFile;
|
||||
|
@ -38,6 +38,11 @@ namespace Switch_Toolbox.Library
|
||||
|
||||
public FileType FileDataType = FileType.Default;
|
||||
|
||||
public IFileFormat OpenFile()
|
||||
{
|
||||
return STFileLoader.OpenFileFormat(FileName, FileData, true);
|
||||
}
|
||||
|
||||
public virtual void Replace()
|
||||
{
|
||||
string fileName = Path.GetFileName(FileName.RemoveIllegaleFileNameCharacters());
|
||||
@ -124,8 +129,6 @@ namespace Switch_Toolbox.Library
|
||||
if (!archiveFile.CanReplaceFiles) {
|
||||
EnableContextMenu(ContextMenuStrip.Items, "Repack", false);
|
||||
}
|
||||
|
||||
EnableContextMenu(ContextMenuStrip.Items, "Preview Assets", false);
|
||||
}
|
||||
|
||||
public void ReloadMenus(bool IsNewInstance = true)
|
||||
@ -138,7 +141,7 @@ namespace Switch_Toolbox.Library
|
||||
ContextMenuStrip.Items.Add(new STToolStripItem("Repack", RepackAction));
|
||||
ContextMenuStrip.Items.Add(new STToolStripItem("Extract All", ExtractAllAction));
|
||||
ContextMenuStrip.Items.Add(new STToolStripSeparator());
|
||||
ContextMenuStrip.Items.Add(new STToolStripItem("Preview Assets", PreviewAction));
|
||||
ContextMenuStrip.Items.Add(new STToolStripItem("Preview Archive", PreviewAction));
|
||||
}
|
||||
|
||||
private void EnableContextMenu(ToolStripItemCollection Items, string Key, bool Enabled)
|
||||
@ -188,7 +191,9 @@ namespace Switch_Toolbox.Library
|
||||
|
||||
private void PreviewAction(object sender, EventArgs args)
|
||||
{
|
||||
|
||||
ArchiveListPreviewForm previewFormatList = new ArchiveListPreviewForm();
|
||||
previewFormatList.LoadArchive(ArchiveFile);
|
||||
previewFormatList.Show();
|
||||
}
|
||||
|
||||
public override void OnClick(TreeView treeView)
|
||||
@ -342,19 +347,80 @@ namespace Switch_Toolbox.Library
|
||||
//Wrapper for files
|
||||
public class ArchiveFileWrapper : ArchiveBase
|
||||
{
|
||||
public ArchiveFileWrapper(string text, IArchiveFile archiveFile) : base(archiveFile)
|
||||
public virtual ArchiveFileInfo ArchiveFileInfo { get; set; }
|
||||
|
||||
public ArchiveFileWrapper(string text, ArchiveFileInfo archiveFileInfo, IArchiveFile archiveFile) : base(archiveFile)
|
||||
{
|
||||
Text = text;
|
||||
ReloadMenus(archiveFile);
|
||||
|
||||
ArchiveFileInfo = archiveFileInfo;
|
||||
|
||||
if (archiveFileInfo.FileData != null)
|
||||
{
|
||||
string Extension = FindMatch(archiveFileInfo.FileData);
|
||||
switch (Extension)
|
||||
{
|
||||
case ".bntx": SetImageKey("bntx"); break;
|
||||
case ".byaml": SetImageKey("byaml"); break;
|
||||
case ".aamp": SetImageKey("aamp"); break;
|
||||
case ".bfres": SetImageKey("bfres"); break;
|
||||
case ".sbfres": SetImageKey("sbfres"); break;
|
||||
default: SetImageKey("fileBlank"); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SetImageKey(string Key) {
|
||||
ImageKey = Key;
|
||||
SelectedImageKey = Key;
|
||||
}
|
||||
|
||||
private string FindMatch(byte[] f)
|
||||
{
|
||||
if (f.Matches("SARC")) return ".szs";
|
||||
else if (f.Matches("Yaz")) return ".szs";
|
||||
else if (f.Matches("YB") || f.Matches("BY")) return ".byaml";
|
||||
else if (f.Matches("FRES")) return ".bfres";
|
||||
else if (f.Matches("Gfx2")) return ".gtx";
|
||||
else if (f.Matches("FLYT")) return ".bflyt";
|
||||
else if (f.Matches("CLAN")) return ".bclan";
|
||||
else if (f.Matches("CLYT")) return ".bclyt";
|
||||
else if (f.Matches("FLIM")) return ".bclim";
|
||||
else if (f.Matches("FLAN")) return ".bflan";
|
||||
else if (f.Matches("FSEQ")) return ".bfseq";
|
||||
else if (f.Matches("VFXB")) return ".pctl";
|
||||
else if (f.Matches("AAHS")) return ".sharc";
|
||||
else if (f.Matches("BAHS")) return ".sharcb";
|
||||
else if (f.Matches("BNTX")) return ".bntx";
|
||||
else if (f.Matches("BNSH")) return ".bnsh";
|
||||
else if (f.Matches("FSHA")) return ".bfsha";
|
||||
else if (f.Matches("FFNT")) return ".bffnt";
|
||||
else if (f.Matches("CFNT")) return ".bcfnt";
|
||||
else if (f.Matches("CSTM")) return ".bcstm";
|
||||
else if (f.Matches("FSTM")) return ".bfstm";
|
||||
else if (f.Matches("STM")) return ".bfsha";
|
||||
else if (f.Matches("CWAV")) return ".bcwav";
|
||||
else if (f.Matches("FWAV")) return ".bfwav";
|
||||
else if (f.Matches("CTPK")) return ".ctpk";
|
||||
else if (f.Matches("CGFX")) return ".bcres";
|
||||
else if (f.Matches("AAMP")) return ".aamp";
|
||||
else if (f.Matches("MsgStdBn")) return ".msbt";
|
||||
else if (f.Matches("MsgPrjBn")) return ".msbp";
|
||||
else if (f.Matches(0x00000004)) return ".gfbanm";
|
||||
else if (f.Matches(0x00000014)) return ".gfbanm";
|
||||
else if (f.Matches(0x00000018)) return ".gfbanmcfg";
|
||||
else if (f.Matches(0x00000020)) return ".gfbmdl";
|
||||
else if (f.Matches(0x00000044)) return ".gfbpokecfg";
|
||||
else return "";
|
||||
}
|
||||
|
||||
public static ArchiveFileWrapper FromPath(string FilePath, IArchiveFile archiveFile)
|
||||
{
|
||||
var wrapper = new ArchiveFileWrapper(Path.GetFileName(FilePath), archiveFile);
|
||||
wrapper.ArchiveFileInfo = new ArchiveFileInfo();
|
||||
wrapper.ArchiveFileInfo.FileName = FilePath;
|
||||
wrapper.ArchiveFileInfo.FileData = File.ReadAllBytes(FilePath);
|
||||
return wrapper;
|
||||
var ArchiveFileInfo = new ArchiveFileInfo();
|
||||
ArchiveFileInfo.FileName = FilePath;
|
||||
ArchiveFileInfo.FileData = File.ReadAllBytes(FilePath);
|
||||
return new ArchiveFileWrapper(Path.GetFileName(FilePath), ArchiveFileInfo, archiveFile);
|
||||
}
|
||||
|
||||
private void ReloadMenus(IArchiveFile archiveFile)
|
||||
@ -366,8 +432,6 @@ namespace Switch_Toolbox.Library
|
||||
ContextMenuStrip.Items.Add(new STToolStripItem("Delete", DeleteAction) { Enabled = archiveFile.CanDeleteFiles });
|
||||
}
|
||||
|
||||
public virtual ArchiveFileInfo ArchiveFileInfo { get; set; }
|
||||
|
||||
private void ExtractAction(object sender, EventArgs args)
|
||||
{
|
||||
ArchiveFileInfo.Export();
|
||||
@ -384,7 +448,7 @@ namespace Switch_Toolbox.Library
|
||||
|
||||
public override void OnDoubleMouseClick(TreeView treeview)
|
||||
{
|
||||
IFileFormat file = STFileLoader.OpenFileFormat(Text, ArchiveFileInfo.FileData, true);
|
||||
IFileFormat file = ArchiveFileInfo.OpenFile();
|
||||
if (file == null) //Format not supported so return
|
||||
return;
|
||||
|
||||
|
@ -209,11 +209,19 @@
|
||||
<Compile Include="FileFormats\APNG\CRC.cs" />
|
||||
<Compile Include="FileFormats\Assimp\AssimpSaver.cs" />
|
||||
<Compile Include="FileFormats\Animation\SEANIM.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\DDS_BlockHelpers.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\ImageEngine.cs" />
|
||||
<Compile Include="FileFormats\DAE\ColladaHelper.cs" />
|
||||
<Compile Include="FileFormats\DAE\collada_schema_1_4.cs" />
|
||||
<Compile Include="FileFormats\DAE\DAE.cs" />
|
||||
<Compile Include="FileFormats\OBJ.cs" />
|
||||
<Compile Include="FileFormats\R4G4.cs" />
|
||||
<Compile Include="Forms\ArchiveListPreviewForm.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
<Compile Include="Forms\ArchiveListPreviewForm.Designer.cs">
|
||||
<DependentUpon>ArchiveListPreviewForm.cs</DependentUpon>
|
||||
</Compile>
|
||||
<Compile Include="Forms\BatchFormatExport.cs">
|
||||
<SubType>Form</SubType>
|
||||
</Compile>
|
||||
@ -287,10 +295,10 @@
|
||||
<Compile Include="FileFormats\ASTC\IntegerEncoded.cs" />
|
||||
<Compile Include="FileFormats\DDS.cs" />
|
||||
<Compile Include="FileFormats\DDSCompressor.cs" />
|
||||
<Compile Include="FileFormats\DDS\BC6.cs" />
|
||||
<Compile Include="FileFormats\DDS\BC7.cs" />
|
||||
<Compile Include="FileFormats\DDS\DX10_Helpers.cs" />
|
||||
<Compile Include="FileFormats\DDS\Dxt.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\BC6.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\BC7.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\DX10_Helpers.cs" />
|
||||
<Compile Include="FileFormats\CSharpImageLibrary\Dxt.cs" />
|
||||
<Compile Include="FileFormats\TargaImage.cs" />
|
||||
<Compile Include="Forms\Custom\ColorSlider.cs" />
|
||||
<Compile Include="Forms\Custom\ColorSlider.Designer.cs" />
|
||||
@ -657,6 +665,9 @@
|
||||
<Compile Include="XML\XmlDoc.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Forms\ArchiveListPreviewForm.resx">
|
||||
<DependentUpon>ArchiveListPreviewForm.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Forms\BatchFormatExport.resx">
|
||||
<DependentUpon>BatchFormatExport.cs</DependentUpon>
|
||||
</EmbeddedResource>
|
||||
|
Loading…
Reference in New Issue
Block a user