Begin Formatting/Recommenting

This commit is contained in:
Michael 2021-02-06 18:09:13 -06:00
parent b9c57a8ae9
commit 6e865ca4af
11 changed files with 1857 additions and 1681 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
/.vs
/bin
/obj

View file

@ -3,14 +3,14 @@ using System.Resources;
using System.Runtime.InteropServices;
using System.Security.Permissions;
[assembly: AssemblyTitle("libWiiSharp_ModMii")]
[assembly: AssemblyDescription("a wii related .NET library modified for ModMii")]
[assembly: AssemblyTitle("libWiiSharp_Modified")]
[assembly: AssemblyDescription("a wii related .NET library modified to add features for othe programs.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Leathl,SC reproductions")]
[assembly: AssemblyProduct("libWiiSharp_ModMii")]
[assembly: AssemblyCopyright("Copyright © Leathl 2011")]
[assembly: AssemblyProduct("libWiiSharp_Modified")]
[assembly: AssemblyCopyright("Copyright © Leathl 2011, Copyright © Github Contributors 2020")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: ComVisible(true)]
[assembly: Guid("af701263-5875-4866-9c09-d7f62e9f0ff0")]
[assembly: AssemblyFileVersion("0.4.0.0")]
[assembly: NeutralResourcesLanguage("en")]

982
BNS.cs

File diff suppressed because it is too large Load diff

View file

@ -1,51 +1,63 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.BNS_Data
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.IO;
namespace libWiiSharp
{
internal class BNS_Data
{
private byte[] magic = new byte[4]
internal class BNS_Data
{
(byte) 68,
(byte) 65,
(byte) 84,
(byte) 65
};
private uint size = 315392;
private byte[] data;
private byte[] magic = new byte[4]
{
(byte) 68,
(byte) 65,
(byte) 84,
(byte) 65
};
private uint size = 315392;
private byte[] data;
public uint Size
{
get => this.size;
set => this.size = value;
}
public uint Size
{
get => this.size;
set => this.size = value;
}
public byte[] Data
{
get => this.data;
set => this.data = value;
}
public byte[] Data
{
get => this.data;
set => this.data = value;
}
public void Write(Stream outStream)
{
byte[] bytes = BitConverter.GetBytes(Shared.Swap(this.size));
outStream.Write(this.magic, 0, this.magic.Length);
outStream.Write(bytes, 0, bytes.Length);
outStream.Write(this.data, 0, this.data.Length);
}
public void Write(Stream outStream)
{
byte[] bytes = BitConverter.GetBytes(Shared.Swap(this.size));
outStream.Write(this.magic, 0, this.magic.Length);
outStream.Write(bytes, 0, bytes.Length);
outStream.Write(this.data, 0, this.data.Length);
}
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
this.size = Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!");
this.data = binaryReader.ReadBytes((int) this.size - 8);
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
this.size = Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!");
this.data = binaryReader.ReadBytes((int) this.size - 8);
}
}
}
}

View file

@ -1,108 +1,120 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.BNS_Header
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.IO;
namespace libWiiSharp
{
internal class BNS_Header
{
private byte[] magic = new byte[4]
internal class BNS_Header
{
(byte) 66,
(byte) 78,
(byte) 83,
(byte) 32
};
private uint flags = 4278124800;
private uint fileSize = 315584;
private ushort size = 32;
private ushort chunkCount = 2;
private uint infoOffset = 32;
private uint infoLength = 160;
private uint dataOffset = 192;
private uint dataLength = 315392;
private byte[] magic = new byte[4]
{
(byte) 66,
(byte) 78,
(byte) 83,
(byte) 32
};
private uint flags = 4278124800;
private uint fileSize = 315584;
private ushort size = 32;
private ushort chunkCount = 2;
private uint infoOffset = 32;
private uint infoLength = 160;
private uint dataOffset = 192;
private uint dataLength = 315392;
public uint DataOffset
{
get => this.dataOffset;
set => this.dataOffset = value;
}
public uint DataOffset
{
get => this.dataOffset;
set => this.dataOffset = value;
}
public uint InfoLength
{
get => this.infoLength;
set => this.infoLength = value;
}
public uint InfoLength
{
get => this.infoLength;
set => this.infoLength = value;
}
public ushort Size
{
get => this.size;
set => this.size = value;
}
public ushort Size
{
get => this.size;
set => this.size = value;
}
public uint DataLength
{
get => this.dataLength;
set => this.dataLength = value;
}
public uint DataLength
{
get => this.dataLength;
set => this.dataLength = value;
}
public uint FileSize
{
get => this.fileSize;
set => this.fileSize = value;
}
public uint FileSize
{
get => this.fileSize;
set => this.fileSize = value;
}
public void Write(Stream outStream)
{
outStream.Write(this.magic, 0, this.magic.Length);
byte[] bytes1 = BitConverter.GetBytes(this.flags);
Array.Reverse((Array) bytes1);
outStream.Write(bytes1, 0, bytes1.Length);
byte[] bytes2 = BitConverter.GetBytes(this.fileSize);
Array.Reverse((Array) bytes2);
outStream.Write(bytes2, 0, bytes2.Length);
byte[] bytes3 = BitConverter.GetBytes(this.size);
Array.Reverse((Array) bytes3);
outStream.Write(bytes3, 0, bytes3.Length);
byte[] bytes4 = BitConverter.GetBytes(this.chunkCount);
Array.Reverse((Array) bytes4);
outStream.Write(bytes4, 0, bytes4.Length);
byte[] bytes5 = BitConverter.GetBytes(this.infoOffset);
Array.Reverse((Array) bytes5);
outStream.Write(bytes5, 0, bytes5.Length);
byte[] bytes6 = BitConverter.GetBytes(this.infoLength);
Array.Reverse((Array) bytes6);
outStream.Write(bytes6, 0, bytes6.Length);
byte[] bytes7 = BitConverter.GetBytes(this.dataOffset);
Array.Reverse((Array) bytes7);
outStream.Write(bytes7, 0, bytes7.Length);
byte[] bytes8 = BitConverter.GetBytes(this.dataLength);
Array.Reverse((Array) bytes8);
outStream.Write(bytes8, 0, bytes8.Length);
}
public void Write(Stream outStream)
{
outStream.Write(this.magic, 0, this.magic.Length);
byte[] bytes1 = BitConverter.GetBytes(this.flags);
Array.Reverse((Array) bytes1);
outStream.Write(bytes1, 0, bytes1.Length);
byte[] bytes2 = BitConverter.GetBytes(this.fileSize);
Array.Reverse((Array) bytes2);
outStream.Write(bytes2, 0, bytes2.Length);
byte[] bytes3 = BitConverter.GetBytes(this.size);
Array.Reverse((Array) bytes3);
outStream.Write(bytes3, 0, bytes3.Length);
byte[] bytes4 = BitConverter.GetBytes(this.chunkCount);
Array.Reverse((Array) bytes4);
outStream.Write(bytes4, 0, bytes4.Length);
byte[] bytes5 = BitConverter.GetBytes(this.infoOffset);
Array.Reverse((Array) bytes5);
outStream.Write(bytes5, 0, bytes5.Length);
byte[] bytes6 = BitConverter.GetBytes(this.infoLength);
Array.Reverse((Array) bytes6);
outStream.Write(bytes6, 0, bytes6.Length);
byte[] bytes7 = BitConverter.GetBytes(this.dataOffset);
Array.Reverse((Array) bytes7);
outStream.Write(bytes7, 0, bytes7.Length);
byte[] bytes8 = BitConverter.GetBytes(this.dataLength);
Array.Reverse((Array) bytes8);
outStream.Write(bytes8, 0, bytes8.Length);
}
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
if (!Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)))
{
binaryReader.BaseStream.Seek(28L, SeekOrigin.Current);
if (!Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)))
throw new Exception("This is not a valid BNS audfo file!");
}
this.flags = Shared.Swap(binaryReader.ReadUInt32());
this.fileSize = Shared.Swap(binaryReader.ReadUInt32());
this.size = Shared.Swap(binaryReader.ReadUInt16());
this.chunkCount = Shared.Swap(binaryReader.ReadUInt16());
this.infoOffset = Shared.Swap(binaryReader.ReadUInt32());
this.infoLength = Shared.Swap(binaryReader.ReadUInt32());
this.dataOffset = Shared.Swap(binaryReader.ReadUInt32());
this.dataLength = Shared.Swap(binaryReader.ReadUInt32());
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
if (!Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)))
{
binaryReader.BaseStream.Seek(28L, SeekOrigin.Current);
if (!Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)))
throw new Exception("This is not a valid BNS audio file!");
}
this.flags = Shared.Swap(binaryReader.ReadUInt32());
this.fileSize = Shared.Swap(binaryReader.ReadUInt32());
this.size = Shared.Swap(binaryReader.ReadUInt16());
this.chunkCount = Shared.Swap(binaryReader.ReadUInt16());
this.infoOffset = Shared.Swap(binaryReader.ReadUInt32());
this.infoLength = Shared.Swap(binaryReader.ReadUInt32());
this.dataOffset = Shared.Swap(binaryReader.ReadUInt32());
this.dataLength = Shared.Swap(binaryReader.ReadUInt32());
}
}
}
}

View file

@ -1,351 +1,365 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.BNS_Info
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.IO;
namespace libWiiSharp
{
internal class BNS_Info
{
private byte[] magic = new byte[4]
internal class BNS_Info
{
(byte) 73,
(byte) 78,
(byte) 70,
(byte) 79
};
private uint size = 160;
private byte codec;
private byte hasLoop;
private byte channelCount = 2;
private byte zero;
private ushort sampleRate = 44100;
private ushort pad0;
private uint loopStart;
private uint loopEnd;
private uint offsetToChannelStart = 24;
private uint pad1;
private uint channel1StartOffset = 32;
private uint channel2StartOffset = 44;
private uint channel1Start;
private uint coefficients1Offset = 56;
private uint pad2;
private uint channel2Start;
private uint coefficients2Offset = 104;
private uint pad3;
private int[] coefficients1 = new int[16];
private ushort channel1Gain;
private ushort channel1PredictiveScale;
private ushort channel1PreviousValue;
private ushort channel1NextPreviousValue;
private ushort channel1LoopPredictiveScale;
private ushort channel1LoopPreviousValue;
private ushort channel1LoopNextPreviousValue;
private ushort channel1LoopPadding;
private int[] coefficients2 = new int[16];
private ushort channel2Gain;
private ushort channel2PredictiveScale;
private ushort channel2PreviousValue;
private ushort channel2NextPreviousValue;
private ushort channel2LoopPredictiveScale;
private ushort channel2LoopPreviousValue;
private ushort channel2LoopNextPreviousValue;
private ushort channel2LoopPadding;
public byte HasLoop
{
get => this.hasLoop;
set => this.hasLoop = value;
}
public uint Coefficients1Offset
{
get => this.coefficients1Offset;
set => this.coefficients1Offset = value;
}
public uint Channel1StartOffset
{
get => this.channel1StartOffset;
set => this.channel1StartOffset = value;
}
public uint Channel2StartOffset
{
get => this.channel2StartOffset;
set => this.channel2StartOffset = value;
}
public uint Size
{
get => this.size;
set => this.size = value;
}
public ushort SampleRate
{
get => this.sampleRate;
set => this.sampleRate = value;
}
public byte ChannelCount
{
get => this.channelCount;
set => this.channelCount = value;
}
public uint Channel1Start
{
get => this.channel1Start;
set => this.channel1Start = value;
}
public uint Channel2Start
{
get => this.channel2Start;
set => this.channel2Start = value;
}
public uint LoopStart
{
get => this.loopStart;
set => this.loopStart = value;
}
public uint LoopEnd
{
get => this.loopEnd;
set => this.loopEnd = value;
}
public int[] Coefficients1
{
get => this.coefficients1;
set => this.coefficients1 = value;
}
public int[] Coefficients2
{
get => this.coefficients2;
set => this.coefficients2 = value;
}
public void Write(Stream outStream)
{
outStream.Write(this.magic, 0, this.magic.Length);
byte[] bytes1 = BitConverter.GetBytes(this.size);
Array.Reverse((Array) bytes1);
outStream.Write(bytes1, 0, bytes1.Length);
outStream.WriteByte(this.codec);
outStream.WriteByte(this.hasLoop);
outStream.WriteByte(this.channelCount);
outStream.WriteByte(this.zero);
byte[] bytes2 = BitConverter.GetBytes(this.sampleRate);
Array.Reverse((Array) bytes2);
outStream.Write(bytes2, 0, bytes2.Length);
byte[] bytes3 = BitConverter.GetBytes(this.pad0);
Array.Reverse((Array) bytes3);
outStream.Write(bytes3, 0, bytes3.Length);
byte[] bytes4 = BitConverter.GetBytes(this.loopStart);
Array.Reverse((Array) bytes4);
outStream.Write(bytes4, 0, bytes4.Length);
byte[] bytes5 = BitConverter.GetBytes(this.loopEnd);
Array.Reverse((Array) bytes5);
outStream.Write(bytes5, 0, bytes5.Length);
byte[] bytes6 = BitConverter.GetBytes(this.offsetToChannelStart);
Array.Reverse((Array) bytes6);
outStream.Write(bytes6, 0, bytes6.Length);
byte[] bytes7 = BitConverter.GetBytes(this.pad1);
Array.Reverse((Array) bytes7);
outStream.Write(bytes7, 0, bytes7.Length);
byte[] bytes8 = BitConverter.GetBytes(this.channel1StartOffset);
Array.Reverse((Array) bytes8);
outStream.Write(bytes8, 0, bytes8.Length);
byte[] bytes9 = BitConverter.GetBytes(this.channel2StartOffset);
Array.Reverse((Array) bytes9);
outStream.Write(bytes9, 0, bytes9.Length);
byte[] bytes10 = BitConverter.GetBytes(this.channel1Start);
Array.Reverse((Array) bytes10);
outStream.Write(bytes10, 0, bytes10.Length);
byte[] bytes11 = BitConverter.GetBytes(this.coefficients1Offset);
Array.Reverse((Array) bytes11);
outStream.Write(bytes11, 0, bytes11.Length);
if (this.channelCount == (byte) 2)
{
byte[] bytes12 = BitConverter.GetBytes(this.pad2);
Array.Reverse((Array) bytes12);
outStream.Write(bytes12, 0, bytes12.Length);
byte[] bytes13 = BitConverter.GetBytes(this.channel2Start);
Array.Reverse((Array) bytes13);
outStream.Write(bytes13, 0, bytes13.Length);
byte[] bytes14 = BitConverter.GetBytes(this.coefficients2Offset);
Array.Reverse((Array) bytes14);
outStream.Write(bytes14, 0, bytes14.Length);
byte[] bytes15 = BitConverter.GetBytes(this.pad3);
Array.Reverse((Array) bytes15);
outStream.Write(bytes15, 0, bytes15.Length);
foreach (int num in this.coefficients1)
//Private Variables
private byte[] magic = new byte[4]
{
byte[] bytes16 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 2, bytes16.Length - 2);
}
byte[] bytes17 = BitConverter.GetBytes(this.channel1Gain);
Array.Reverse((Array) bytes17);
outStream.Write(bytes17, 0, bytes17.Length);
byte[] bytes18 = BitConverter.GetBytes(this.channel1PredictiveScale);
Array.Reverse((Array) bytes18);
outStream.Write(bytes18, 0, bytes18.Length);
byte[] bytes19 = BitConverter.GetBytes(this.channel1PreviousValue);
Array.Reverse((Array) bytes19);
outStream.Write(bytes19, 0, bytes19.Length);
byte[] bytes20 = BitConverter.GetBytes(this.channel1NextPreviousValue);
Array.Reverse((Array) bytes20);
outStream.Write(bytes20, 0, bytes20.Length);
byte[] bytes21 = BitConverter.GetBytes(this.channel1LoopPredictiveScale);
Array.Reverse((Array) bytes21);
outStream.Write(bytes21, 0, bytes21.Length);
byte[] bytes22 = BitConverter.GetBytes(this.channel1LoopPreviousValue);
Array.Reverse((Array) bytes22);
outStream.Write(bytes22, 0, bytes22.Length);
byte[] bytes23 = BitConverter.GetBytes(this.channel1LoopNextPreviousValue);
Array.Reverse((Array) bytes23);
outStream.Write(bytes23, 0, bytes23.Length);
byte[] bytes24 = BitConverter.GetBytes(this.channel1LoopPadding);
Array.Reverse((Array) bytes24);
outStream.Write(bytes24, 0, bytes24.Length);
foreach (int num in this.coefficients2)
{
byte[] bytes16 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 2, bytes16.Length - 2);
}
byte[] bytes25 = BitConverter.GetBytes(this.channel2Gain);
Array.Reverse((Array) bytes25);
outStream.Write(bytes25, 0, bytes25.Length);
byte[] bytes26 = BitConverter.GetBytes(this.channel2PredictiveScale);
Array.Reverse((Array) bytes26);
outStream.Write(bytes26, 0, bytes26.Length);
byte[] bytes27 = BitConverter.GetBytes(this.channel2PreviousValue);
Array.Reverse((Array) bytes27);
outStream.Write(bytes27, 0, bytes27.Length);
byte[] bytes28 = BitConverter.GetBytes(this.channel2NextPreviousValue);
Array.Reverse((Array) bytes28);
outStream.Write(bytes28, 0, bytes28.Length);
byte[] bytes29 = BitConverter.GetBytes(this.channel2LoopPredictiveScale);
Array.Reverse((Array) bytes29);
outStream.Write(bytes29, 0, bytes29.Length);
byte[] bytes30 = BitConverter.GetBytes(this.channel2LoopPreviousValue);
Array.Reverse((Array) bytes30);
outStream.Write(bytes30, 0, bytes30.Length);
byte[] bytes31 = BitConverter.GetBytes(this.channel2LoopNextPreviousValue);
Array.Reverse((Array) bytes31);
outStream.Write(bytes31, 0, bytes31.Length);
byte[] bytes32 = BitConverter.GetBytes(this.channel2LoopPadding);
Array.Reverse((Array) bytes32);
outStream.Write(bytes32, 0, bytes32.Length);
}
else
{
if (this.channelCount != (byte) 1)
return;
foreach (int num in this.coefficients1)
{
byte[] bytes12 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes12);
outStream.Write(bytes12, 2, bytes12.Length - 2);
}
byte[] bytes13 = BitConverter.GetBytes(this.channel1Gain);
Array.Reverse((Array) bytes13);
outStream.Write(bytes13, 0, bytes13.Length);
byte[] bytes14 = BitConverter.GetBytes(this.channel1PredictiveScale);
Array.Reverse((Array) bytes14);
outStream.Write(bytes14, 0, bytes14.Length);
byte[] bytes15 = BitConverter.GetBytes(this.channel1PreviousValue);
Array.Reverse((Array) bytes15);
outStream.Write(bytes15, 0, bytes15.Length);
byte[] bytes16 = BitConverter.GetBytes(this.channel1NextPreviousValue);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 0, bytes16.Length);
byte[] bytes17 = BitConverter.GetBytes(this.channel1LoopPredictiveScale);
Array.Reverse((Array) bytes17);
outStream.Write(bytes17, 0, bytes17.Length);
byte[] bytes18 = BitConverter.GetBytes(this.channel1LoopPreviousValue);
Array.Reverse((Array) bytes18);
outStream.Write(bytes18, 0, bytes18.Length);
byte[] bytes19 = BitConverter.GetBytes(this.channel1LoopNextPreviousValue);
Array.Reverse((Array) bytes19);
outStream.Write(bytes19, 0, bytes19.Length);
byte[] bytes20 = BitConverter.GetBytes(this.channel1LoopPadding);
Array.Reverse((Array) bytes20);
outStream.Write(bytes20, 0, bytes20.Length);
}
}
(byte) 73,
(byte) 78,
(byte) 70,
(byte) 79
};
private uint size = 160;
private byte codec;
private byte hasLoop;
private byte channelCount = 2;
private byte zero;
private ushort sampleRate = 44100;
private ushort pad0;
private uint loopStart;
private uint loopEnd; //Or total sample count
private uint offsetToChannelStart = 24;
private uint pad1;
private uint channel1StartOffset = 32;
private uint channel2StartOffset = 44;
private uint channel1Start;
private uint coefficients1Offset = 56;
private uint pad2;
private uint channel2Start;
private uint coefficients2Offset = 104;
private uint pad3;
private int[] coefficients1 = new int[16];
private ushort channel1Gain;
private ushort channel1PredictiveScale;
private ushort channel1PreviousValue;
private ushort channel1NextPreviousValue;
private ushort channel1LoopPredictiveScale;
private ushort channel1LoopPreviousValue;
private ushort channel1LoopNextPreviousValue;
private ushort channel1LoopPadding;
private int[] coefficients2 = new int[16];
private ushort channel2Gain;
private ushort channel2PredictiveScale;
private ushort channel2PreviousValue;
private ushort channel2NextPreviousValue;
private ushort channel2LoopPredictiveScale;
private ushort channel2LoopPreviousValue;
private ushort channel2LoopNextPreviousValue;
private ushort channel2LoopPadding;
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
this.size = Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!");
this.codec = binaryReader.ReadByte();
this.hasLoop = binaryReader.ReadByte();
this.channelCount = binaryReader.ReadByte();
this.zero = binaryReader.ReadByte();
this.sampleRate = Shared.Swap(binaryReader.ReadUInt16());
this.pad0 = Shared.Swap(binaryReader.ReadUInt16());
this.loopStart = Shared.Swap(binaryReader.ReadUInt32());
this.loopEnd = Shared.Swap(binaryReader.ReadUInt32());
this.offsetToChannelStart = Shared.Swap(binaryReader.ReadUInt32());
this.pad1 = Shared.Swap(binaryReader.ReadUInt32());
this.channel1StartOffset = Shared.Swap(binaryReader.ReadUInt32());
this.channel2StartOffset = Shared.Swap(binaryReader.ReadUInt32());
this.channel1Start = Shared.Swap(binaryReader.ReadUInt32());
this.coefficients1Offset = Shared.Swap(binaryReader.ReadUInt32());
if (this.channelCount == (byte) 2)
{
this.pad2 = Shared.Swap(binaryReader.ReadUInt32());
this.channel2Start = Shared.Swap(binaryReader.ReadUInt32());
this.coefficients2Offset = Shared.Swap(binaryReader.ReadUInt32());
this.pad3 = Shared.Swap(binaryReader.ReadUInt32());
for (int index = 0; index < 16; ++index)
this.coefficients1[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel1Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
for (int index = 0; index < 16; ++index)
this.coefficients2[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel2Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel2PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel2PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
}
else
{
if (this.channelCount != (byte) 1)
return;
for (int index = 0; index < 16; ++index)
this.coefficients1[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel1Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
}
//Public Variables
public byte HasLoop
{
get => this.hasLoop;
set => this.hasLoop = value;
}
public uint Coefficients1Offset
{
get => this.coefficients1Offset;
set => this.coefficients1Offset = value;
}
public uint Channel1StartOffset
{
get => this.channel1StartOffset;
set => this.channel1StartOffset = value;
}
public uint Channel2StartOffset
{
get => this.channel2StartOffset;
set => this.channel2StartOffset = value;
}
public uint Size
{
get => this.size;
set => this.size = value;
}
public ushort SampleRate
{
get => this.sampleRate;
set => this.sampleRate = value;
}
public byte ChannelCount
{
get => this.channelCount;
set => this.channelCount = value;
}
public uint Channel1Start
{
get => this.channel1Start;
set => this.channel1Start = value;
}
public uint Channel2Start
{
get => this.channel2Start;
set => this.channel2Start = value;
}
public uint LoopStart
{
get => this.loopStart;
set => this.loopStart = value;
}
public uint LoopEnd
{
get => this.loopEnd;
set => this.loopEnd = value;
}
public int[] Coefficients1
{
get => this.coefficients1;
set => this.coefficients1 = value;
}
public int[] Coefficients2
{
get => this.coefficients2;
set => this.coefficients2 = value;
}
public void Write(Stream outStream)
{
outStream.Write(this.magic, 0, this.magic.Length);
byte[] bytes1 = BitConverter.GetBytes(this.size);
Array.Reverse((Array) bytes1);
outStream.Write(bytes1, 0, bytes1.Length);
outStream.WriteByte(this.codec);
outStream.WriteByte(this.hasLoop);
outStream.WriteByte(this.channelCount);
outStream.WriteByte(this.zero);
byte[] bytes2 = BitConverter.GetBytes(this.sampleRate);
Array.Reverse((Array) bytes2);
outStream.Write(bytes2, 0, bytes2.Length);
byte[] bytes3 = BitConverter.GetBytes(this.pad0);
Array.Reverse((Array) bytes3);
outStream.Write(bytes3, 0, bytes3.Length);
byte[] bytes4 = BitConverter.GetBytes(this.loopStart);
Array.Reverse((Array) bytes4);
outStream.Write(bytes4, 0, bytes4.Length);
byte[] bytes5 = BitConverter.GetBytes(this.loopEnd);
Array.Reverse((Array) bytes5);
outStream.Write(bytes5, 0, bytes5.Length);
byte[] bytes6 = BitConverter.GetBytes(this.offsetToChannelStart);
Array.Reverse((Array) bytes6);
outStream.Write(bytes6, 0, bytes6.Length);
byte[] bytes7 = BitConverter.GetBytes(this.pad1);
Array.Reverse((Array) bytes7);
outStream.Write(bytes7, 0, bytes7.Length);
byte[] bytes8 = BitConverter.GetBytes(this.channel1StartOffset);
Array.Reverse((Array) bytes8);
outStream.Write(bytes8, 0, bytes8.Length);
byte[] bytes9 = BitConverter.GetBytes(this.channel2StartOffset);
Array.Reverse((Array) bytes9);
outStream.Write(bytes9, 0, bytes9.Length);
byte[] bytes10 = BitConverter.GetBytes(this.channel1Start);
Array.Reverse((Array) bytes10);
outStream.Write(bytes10, 0, bytes10.Length);
byte[] bytes11 = BitConverter.GetBytes(this.coefficients1Offset);
Array.Reverse((Array) bytes11);
outStream.Write(bytes11, 0, bytes11.Length);
if (this.channelCount == (byte) 2)
{
byte[] bytes12 = BitConverter.GetBytes(this.pad2);
Array.Reverse((Array) bytes12);
outStream.Write(bytes12, 0, bytes12.Length);
byte[] bytes13 = BitConverter.GetBytes(this.channel2Start);
Array.Reverse((Array) bytes13);
outStream.Write(bytes13, 0, bytes13.Length);
byte[] bytes14 = BitConverter.GetBytes(this.coefficients2Offset);
Array.Reverse((Array) bytes14);
outStream.Write(bytes14, 0, bytes14.Length);
byte[] bytes15 = BitConverter.GetBytes(this.pad3);
Array.Reverse((Array) bytes15);
outStream.Write(bytes15, 0, bytes15.Length);
foreach (int num in this.coefficients1)
{
byte[] bytes16 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 2, bytes16.Length - 2);
}
byte[] bytes17 = BitConverter.GetBytes(this.channel1Gain);
Array.Reverse((Array) bytes17);
outStream.Write(bytes17, 0, bytes17.Length);
byte[] bytes18 = BitConverter.GetBytes(this.channel1PredictiveScale);
Array.Reverse((Array) bytes18);
outStream.Write(bytes18, 0, bytes18.Length);
byte[] bytes19 = BitConverter.GetBytes(this.channel1PreviousValue);
Array.Reverse((Array) bytes19);
outStream.Write(bytes19, 0, bytes19.Length);
byte[] bytes20 = BitConverter.GetBytes(this.channel1NextPreviousValue);
Array.Reverse((Array) bytes20);
outStream.Write(bytes20, 0, bytes20.Length);
byte[] bytes21 = BitConverter.GetBytes(this.channel1LoopPredictiveScale);
Array.Reverse((Array) bytes21);
outStream.Write(bytes21, 0, bytes21.Length);
byte[] bytes22 = BitConverter.GetBytes(this.channel1LoopPreviousValue);
Array.Reverse((Array) bytes22);
outStream.Write(bytes22, 0, bytes22.Length);
byte[] bytes23 = BitConverter.GetBytes(this.channel1LoopNextPreviousValue);
Array.Reverse((Array) bytes23);
outStream.Write(bytes23, 0, bytes23.Length);
byte[] bytes24 = BitConverter.GetBytes(this.channel1LoopPadding);
Array.Reverse((Array) bytes24);
outStream.Write(bytes24, 0, bytes24.Length);
foreach (int num in this.coefficients2)
{
byte[] bytes16 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 2, bytes16.Length - 2);
}
byte[] bytes25 = BitConverter.GetBytes(this.channel2Gain);
Array.Reverse((Array) bytes25);
outStream.Write(bytes25, 0, bytes25.Length);
byte[] bytes26 = BitConverter.GetBytes(this.channel2PredictiveScale);
Array.Reverse((Array) bytes26);
outStream.Write(bytes26, 0, bytes26.Length);
byte[] bytes27 = BitConverter.GetBytes(this.channel2PreviousValue);
Array.Reverse((Array) bytes27);
outStream.Write(bytes27, 0, bytes27.Length);
byte[] bytes28 = BitConverter.GetBytes(this.channel2NextPreviousValue);
Array.Reverse((Array) bytes28);
outStream.Write(bytes28, 0, bytes28.Length);
byte[] bytes29 = BitConverter.GetBytes(this.channel2LoopPredictiveScale);
Array.Reverse((Array) bytes29);
outStream.Write(bytes29, 0, bytes29.Length);
byte[] bytes30 = BitConverter.GetBytes(this.channel2LoopPreviousValue);
Array.Reverse((Array) bytes30);
outStream.Write(bytes30, 0, bytes30.Length);
byte[] bytes31 = BitConverter.GetBytes(this.channel2LoopNextPreviousValue);
Array.Reverse((Array) bytes31);
outStream.Write(bytes31, 0, bytes31.Length);
byte[] bytes32 = BitConverter.GetBytes(this.channel2LoopPadding);
Array.Reverse((Array) bytes32);
outStream.Write(bytes32, 0, bytes32.Length);
}
else
{
if (this.channelCount != (byte) 1)
return;
foreach (int num in this.coefficients1)
{
byte[] bytes12 = BitConverter.GetBytes(num);
Array.Reverse((Array) bytes12);
outStream.Write(bytes12, 2, bytes12.Length - 2);
}
byte[] bytes13 = BitConverter.GetBytes(this.channel1Gain);
Array.Reverse((Array) bytes13);
outStream.Write(bytes13, 0, bytes13.Length);
byte[] bytes14 = BitConverter.GetBytes(this.channel1PredictiveScale);
Array.Reverse((Array) bytes14);
outStream.Write(bytes14, 0, bytes14.Length);
byte[] bytes15 = BitConverter.GetBytes(this.channel1PreviousValue);
Array.Reverse((Array) bytes15);
outStream.Write(bytes15, 0, bytes15.Length);
byte[] bytes16 = BitConverter.GetBytes(this.channel1NextPreviousValue);
Array.Reverse((Array) bytes16);
outStream.Write(bytes16, 0, bytes16.Length);
byte[] bytes17 = BitConverter.GetBytes(this.channel1LoopPredictiveScale);
Array.Reverse((Array) bytes17);
outStream.Write(bytes17, 0, bytes17.Length);
byte[] bytes18 = BitConverter.GetBytes(this.channel1LoopPreviousValue);
Array.Reverse((Array) bytes18);
outStream.Write(bytes18, 0, bytes18.Length);
byte[] bytes19 = BitConverter.GetBytes(this.channel1LoopNextPreviousValue);
Array.Reverse((Array) bytes19);
outStream.Write(bytes19, 0, bytes19.Length);
byte[] bytes20 = BitConverter.GetBytes(this.channel1LoopPadding);
Array.Reverse((Array) bytes20);
outStream.Write(bytes20, 0, bytes20.Length);
}
}
public void Read(Stream input)
{
BinaryReader binaryReader = new BinaryReader(input);
this.size = Shared.CompareByteArrays(this.magic, binaryReader.ReadBytes(4)) ? Shared.Swap(binaryReader.ReadUInt32()) : throw new Exception("This is not a valid BNS audfo file!");
this.codec = binaryReader.ReadByte();
this.hasLoop = binaryReader.ReadByte();
this.channelCount = binaryReader.ReadByte();
this.zero = binaryReader.ReadByte();
this.sampleRate = Shared.Swap(binaryReader.ReadUInt16());
this.pad0 = Shared.Swap(binaryReader.ReadUInt16());
this.loopStart = Shared.Swap(binaryReader.ReadUInt32());
this.loopEnd = Shared.Swap(binaryReader.ReadUInt32());
this.offsetToChannelStart = Shared.Swap(binaryReader.ReadUInt32());
this.pad1 = Shared.Swap(binaryReader.ReadUInt32());
this.channel1StartOffset = Shared.Swap(binaryReader.ReadUInt32());
this.channel2StartOffset = Shared.Swap(binaryReader.ReadUInt32());
this.channel1Start = Shared.Swap(binaryReader.ReadUInt32());
this.coefficients1Offset = Shared.Swap(binaryReader.ReadUInt32());
if (this.channelCount == (byte) 2)
{
this.pad2 = Shared.Swap(binaryReader.ReadUInt32());
this.channel2Start = Shared.Swap(binaryReader.ReadUInt32());
this.coefficients2Offset = Shared.Swap(binaryReader.ReadUInt32());
this.pad3 = Shared.Swap(binaryReader.ReadUInt32());
for (int index = 0; index < 16; ++index)
this.coefficients1[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel1Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
for (int index = 0; index < 16; ++index)
this.coefficients2[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel2Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel2PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel2PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel2LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
}
else
{
if (this.channelCount != (byte) 1)
return;
for (int index = 0; index < 16; ++index)
this.coefficients1[index] = (int) (short) Shared.Swap(binaryReader.ReadUInt16());
this.channel1Gain = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1PreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1NextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPredictiveScale = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopNextPreviousValue = Shared.Swap(binaryReader.ReadUInt16());
this.channel1LoopPadding = Shared.Swap(binaryReader.ReadUInt16());
}
}
}
}
}

118
Brlan.cs
View file

@ -1,8 +1,20 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.Brlan
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
@ -10,57 +22,57 @@ using System.IO;
namespace libWiiSharp
{
public class Brlan
{
public static string[] GetBrlanTpls(string pathTobrlan) => Brlan.getBrlanTpls(File.ReadAllBytes(pathTobrlan));
public static string[] GetBrlanTpls(byte[] brlanFile) => Brlan.getBrlanTpls(brlanFile);
public static string[] GetBrlanTpls(WAD wad, bool banner)
public class Brlan
{
if (!wad.HasBanner)
return new string[0];
string str = nameof (banner);
if (!banner)
str = "icon";
for (int index1 = 0; index1 < wad.BannerApp.Nodes.Count; ++index1)
{
if (wad.BannerApp.StringTable[index1].ToLower() == str + ".bin")
public static string[] GetBrlanTpls(string pathTobrlan) => Brlan.getBrlanTpls(File.ReadAllBytes(pathTobrlan));
public static string[] GetBrlanTpls(byte[] brlanFile) => Brlan.getBrlanTpls(brlanFile);
public static string[] GetBrlanTpls(WAD wad, bool banner)
{
U8 u8 = U8.Load(wad.BannerApp.Data[index1]);
string[] a = new string[0];
for (int index2 = 0; index2 < u8.Nodes.Count; ++index2)
{
if (u8.StringTable[index2].ToLower() == str + "_start.brlan" || u8.StringTable[index2].ToLower() == str + "_loop.brlan" || u8.StringTable[index2].ToLower() == str + ".brlan")
a = Shared.MergeStringArrays(a, Brlan.getBrlanTpls(u8.Data[index2]));
}
return a;
if (!wad.HasBanner)
return new string[0];
string str = nameof (banner);
if (!banner)
str = "icon";
for (int index1 = 0; index1 < wad.BannerApp.Nodes.Count; ++index1)
{
if (wad.BannerApp.StringTable[index1].ToLower() == str + ".bin")
{
U8 u8 = U8.Load(wad.BannerApp.Data[index1]);
string[] a = new string[0];
for (int index2 = 0; index2 < u8.Nodes.Count; ++index2)
{
if (u8.StringTable[index2].ToLower() == str + "_start.brlan" || u8.StringTable[index2].ToLower() == str + "_loop.brlan" || u8.StringTable[index2].ToLower() == str + ".brlan")
a = Shared.MergeStringArrays(a, Brlan.getBrlanTpls(u8.Data[index2]));
}
return a;
}
}
return new string[0];
}
}
return new string[0];
}
private static string[] getBrlanTpls(byte[] brlanFile)
{
List<string> stringList = new List<string>();
int numOfTpls = Brlan.getNumOfTpls(brlanFile);
int index1 = 36 + numOfTpls * 4;
for (int index2 = 0; index2 < numOfTpls; ++index2)
{
string empty = string.Empty;
while (brlanFile[index1] != (byte) 0)
empty += Convert.ToChar(brlanFile[index1++]).ToString();
stringList.Add(empty);
++index1;
}
for (int index2 = stringList.Count - 1; index2 >= 0; --index2)
{
if (!stringList[index2].ToLower().EndsWith(".tpl"))
stringList.RemoveAt(index2);
}
return stringList.ToArray();
}
private static string[] getBrlanTpls(byte[] brlanFile)
{
List<string> stringList = new List<string>();
int numOfTpls = Brlan.getNumOfTpls(brlanFile);
int index1 = 36 + numOfTpls * 4;
for (int index2 = 0; index2 < numOfTpls; ++index2)
{
string empty = string.Empty;
while (brlanFile[index1] != (byte) 0)
empty += Convert.ToChar(brlanFile[index1++]).ToString();
stringList.Add(empty);
++index1;
}
for (int index2 = stringList.Count - 1; index2 >= 0; --index2)
{
if (!stringList[index2].ToLower().EndsWith(".tpl"))
stringList.RemoveAt(index2);
}
return stringList.ToArray();
}
private static int getNumOfTpls(byte[] brlanFile) => (int) Shared.Swap(BitConverter.ToUInt16(brlanFile, 28));
}
private static int getNumOfTpls(byte[] brlanFile) => (int) Shared.Swap(BitConverter.ToUInt16(brlanFile, 28));
}
}

118
Brlyt.cs
View file

@ -1,8 +1,20 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.Brlyt
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
@ -10,57 +22,57 @@ using System.IO;
namespace libWiiSharp
{
public class Brlyt
{
public static string[] GetBrlytTpls(string pathToBrlyt) => Brlyt.getBrlytTpls(File.ReadAllBytes(pathToBrlyt));
public static string[] GetBrlytTpls(byte[] brlytFile) => Brlyt.getBrlytTpls(brlytFile);
public static string[] GetBrlytTpls(WAD wad, bool banner)
public class Brlyt
{
if (!wad.HasBanner)
return new string[0];
string str = nameof (banner);
if (!banner)
str = "icon";
for (int index1 = 0; index1 < wad.BannerApp.Nodes.Count; ++index1)
{
if (wad.BannerApp.StringTable[index1].ToLower() == str + ".bin")
public static string[] GetBrlytTpls(string pathToBrlyt) => Brlyt.getBrlytTpls(File.ReadAllBytes(pathToBrlyt));
public static string[] GetBrlytTpls(byte[] brlytFile) => Brlyt.getBrlytTpls(brlytFile);
public static string[] GetBrlytTpls(WAD wad, bool banner)
{
U8 u8 = U8.Load(wad.BannerApp.Data[index1]);
string[] a = new string[0];
for (int index2 = 0; index2 < u8.Nodes.Count; ++index2)
{
if (u8.StringTable[index2].ToLower() == str + ".brlyt")
a = Shared.MergeStringArrays(a, Brlyt.getBrlytTpls(u8.Data[index2]));
}
return a;
if (!wad.HasBanner)
return new string[0];
string str = nameof (banner);
if (!banner)
str = "icon";
for (int index1 = 0; index1 < wad.BannerApp.Nodes.Count; ++index1)
{
if (wad.BannerApp.StringTable[index1].ToLower() == str + ".bin")
{
U8 u8 = U8.Load(wad.BannerApp.Data[index1]);
string[] a = new string[0];
for (int index2 = 0; index2 < u8.Nodes.Count; ++index2)
{
if (u8.StringTable[index2].ToLower() == str + ".brlyt")
a = Shared.MergeStringArrays(a, Brlyt.getBrlytTpls(u8.Data[index2]));
}
return a;
}
}
return new string[0];
}
}
return new string[0];
}
private static string[] getBrlytTpls(byte[] brlytFile)
{
List<string> stringList = new List<string>();
int numOfTpls = Brlyt.getNumOfTpls(brlytFile);
int index1 = 48 + numOfTpls * 8;
for (int index2 = 0; index2 < numOfTpls; ++index2)
{
string empty = string.Empty;
while (brlytFile[index1] != (byte) 0)
empty += Convert.ToChar(brlytFile[index1++]).ToString();
stringList.Add(empty);
++index1;
}
for (int index2 = stringList.Count - 1; index2 >= 0; --index2)
{
if (!stringList[index2].ToLower().EndsWith(".tpl"))
stringList.RemoveAt(index2);
}
return stringList.ToArray();
}
private static string[] getBrlytTpls(byte[] brlytFile)
{
List<string> stringList = new List<string>();
int numOfTpls = Brlyt.getNumOfTpls(brlytFile);
int index1 = 48 + numOfTpls * 8;
for (int index2 = 0; index2 < numOfTpls; ++index2)
{
string empty = string.Empty;
while (brlytFile[index1] != (byte) 0)
empty += Convert.ToChar(brlytFile[index1++]).ToString();
stringList.Add(empty);
++index1;
}
for (int index2 = stringList.Count - 1; index2 >= 0; --index2)
{
if (!stringList[index2].ToLower().EndsWith(".tpl"))
stringList.RemoveAt(index2);
}
return stringList.ToArray();
}
private static int getNumOfTpls(byte[] brlytFile) => (int) Shared.Swap(BitConverter.ToUInt16(brlytFile, 44));
}
private static int getNumOfTpls(byte[] brlytFile) => (int) Shared.Swap(BitConverter.ToUInt16(brlytFile, 44));
}
}

View file

@ -1,8 +1,20 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.CertificateChain
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.IO;
@ -10,429 +22,429 @@ using System.Security.Cryptography;
namespace libWiiSharp
{
public class CertificateChain : IDisposable
{
private const string certCaHash = "5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318";
private const string certCpHash = "6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C";
private const string certXsHash = "09787045037121477824BC6A3E5E076156573F8A";
private SHA1 sha = SHA1.Create();
private bool[] certsComplete = new bool[3];
private byte[] certCa = new byte[1024];
private byte[] certCp = new byte[768];
private byte[] certXs = new byte[768];
private bool isDisposed;
public bool CertsComplete => this.certsComplete[0] && this.certsComplete[1] && this.certsComplete[2];
public event EventHandler<MessageEventArgs> Debug;
~CertificateChain() => this.Dispose(false);
public void Dispose()
public class CertificateChain : IDisposable
{
this.Dispose(true);
GC.SuppressFinalize((object) this);
}
private const string certCaHash = "5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318";
private const string certCpHash = "6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C";
private const string certXsHash = "09787045037121477824BC6A3E5E076156573F8A";
private SHA1 sha = SHA1.Create();
private bool[] certsComplete = new bool[3];
private byte[] certCa = new byte[1024];
private byte[] certCp = new byte[768];
private byte[] certXs = new byte[768];
private bool isDisposed;
protected virtual void Dispose(bool disposing)
{
if (disposing && !this.isDisposed)
{
this.sha.Clear();
this.sha = (SHA1) null;
this.certsComplete = (bool[]) null;
this.certCa = (byte[]) null;
this.certCp = (byte[]) null;
this.certXs = (byte[]) null;
}
this.isDisposed = true;
}
public bool CertsComplete => this.certsComplete[0] && this.certsComplete[1] && this.certsComplete[2];
public static CertificateChain Load(string pathToCert) => CertificateChain.Load(File.ReadAllBytes(pathToCert));
public event EventHandler<MessageEventArgs> Debug;
public static CertificateChain Load(byte[] certFile)
{
CertificateChain certificateChain = new CertificateChain();
MemoryStream memoryStream = new MemoryStream(certFile);
try
{
certificateChain.parseCert((Stream) memoryStream);
}
catch
{
memoryStream.Dispose();
throw;
}
memoryStream.Dispose();
return certificateChain;
}
~CertificateChain() => this.Dispose(false);
public static CertificateChain Load(Stream cert)
{
CertificateChain certificateChain = new CertificateChain();
certificateChain.parseCert(cert);
return certificateChain;
}
public static CertificateChain FromTikTmd(string pathToTik, string pathToTmd) => CertificateChain.FromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd));
public static CertificateChain FromTikTmd(byte[] tikFile, byte[] tmdFile)
{
CertificateChain certificateChain = new CertificateChain();
MemoryStream memoryStream1 = new MemoryStream(tikFile);
try
{
certificateChain.grabFromTik((Stream) memoryStream1);
}
catch
{
memoryStream1.Dispose();
throw;
}
MemoryStream memoryStream2 = new MemoryStream(tmdFile);
try
{
certificateChain.grabFromTmd((Stream) memoryStream2);
}
catch
{
memoryStream2.Dispose();
throw;
}
memoryStream2.Dispose();
return certificateChain.CertsComplete ? certificateChain : throw new Exception("Couldn't locate all certs!");
}
public static CertificateChain FromTikTmd(Stream tik, Stream tmd)
{
CertificateChain certificateChain = new CertificateChain();
certificateChain.grabFromTik(tik);
certificateChain.grabFromTmd(tmd);
return certificateChain;
}
public void LoadFile(string pathToCert) => this.LoadFile(File.ReadAllBytes(pathToCert));
public void LoadFile(byte[] certFile)
{
MemoryStream memoryStream = new MemoryStream(certFile);
try
{
this.parseCert((Stream) memoryStream);
}
catch
{
memoryStream.Dispose();
throw;
}
memoryStream.Dispose();
}
public void LoadFile(Stream cert) => this.parseCert(cert);
public void LoadFromTikTmd(string pathToTik, string pathToTmd) => this.LoadFromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd));
public void LoadFromTikTmd(byte[] tikFile, byte[] tmdFile)
{
MemoryStream memoryStream1 = new MemoryStream(tikFile);
try
{
this.grabFromTik((Stream) memoryStream1);
}
catch
{
memoryStream1.Dispose();
throw;
}
MemoryStream memoryStream2 = new MemoryStream(tmdFile);
try
{
this.grabFromTmd((Stream) memoryStream2);
}
catch
{
memoryStream2.Dispose();
throw;
}
memoryStream2.Dispose();
if (!this.CertsComplete)
throw new Exception("Couldn't locate all certs!");
}
public void LoadFromTikTmd(Stream tik, Stream tmd)
{
this.grabFromTik(tik);
this.grabFromTmd(tmd);
}
public void Save(string savePath)
{
if (File.Exists(savePath))
File.Delete(savePath);
using (FileStream fileStream = new FileStream(savePath, FileMode.Create))
this.writeToStream((Stream) fileStream);
}
public MemoryStream ToMemoryStream()
{
MemoryStream memoryStream = new MemoryStream();
try
{
this.writeToStream((Stream) memoryStream);
return memoryStream;
}
catch
{
memoryStream.Dispose();
throw;
}
}
public byte[] ToByteArray()
{
MemoryStream memoryStream = new MemoryStream();
try
{
this.writeToStream((Stream) memoryStream);
}
catch
{
memoryStream.Dispose();
throw;
}
byte[] array = memoryStream.ToArray();
memoryStream.Dispose();
return array;
}
private void writeToStream(Stream writeStream)
{
this.fireDebug("Writing Certificate Chain...");
if (!this.CertsComplete)
{
this.fireDebug(" Certificate Chain incomplete...");
throw new Exception("At least one certificate is missing!");
}
writeStream.Seek(0L, SeekOrigin.Begin);
object[] objArray1 = new object[1];
long position = writeStream.Position;
objArray1[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate CA... (Offset: 0x{0})", objArray1);
writeStream.Write(this.certCa, 0, this.certCa.Length);
object[] objArray2 = new object[1];
position = writeStream.Position;
objArray2[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate CP... (Offset: 0x{0})", objArray2);
writeStream.Write(this.certCp, 0, this.certCp.Length);
object[] objArray3 = new object[1];
position = writeStream.Position;
objArray3[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate XS... (Offset: 0x{0})", objArray3);
writeStream.Write(this.certXs, 0, this.certXs.Length);
this.fireDebug("Writing Certificate Chain Finished...");
}
private void parseCert(Stream certFile)
{
this.fireDebug("Parsing Certificate Chain...");
int num = 0;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
public void Dispose()
{
certFile.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
certFile.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
this.Dispose(true);
GC.SuppressFinalize((object) this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing && !this.isDisposed)
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
this.sha.Clear();
this.sha = (SHA1) null;
this.certsComplete = (bool[]) null;
this.certCa = (byte[]) null;
this.certCp = (byte[]) null;
this.certXs = (byte[]) null;
}
}
this.isDisposed = true;
}
catch (Exception ex)
{
this.fireDebug("Error: {0}", (object) ex.Message);
}
num += 768;
}
if (!this.CertsComplete)
{
this.fireDebug(" Couldn't locate all Certificates...");
throw new Exception("Couldn't locate all certs!");
}
this.fireDebug("Parsing Certificate Chain Finished...");
}
private void grabFromTik(Stream tik)
{
this.fireDebug("Scanning Ticket for Certificates...");
int num = 676;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
public static CertificateChain Load(string pathToCert) => CertificateChain.Load(File.ReadAllBytes(pathToCert));
public static CertificateChain Load(byte[] certFile)
{
tik.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
tik.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
CertificateChain certificateChain = new CertificateChain();
MemoryStream memoryStream = new MemoryStream(certFile);
try
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
certificateChain.parseCert((Stream) memoryStream);
}
}
}
catch
{
}
num += 768;
}
this.fireDebug("Scanning Ticket for Certificates Finished...");
}
private void grabFromTmd(Stream tmd)
{
this.fireDebug("Scanning TMD for Certificates...");
byte[] buffer = new byte[2];
tmd.Seek(478L, SeekOrigin.Begin);
tmd.Read(buffer, 0, 2);
int num = 484 + (int) Shared.Swap(BitConverter.ToUInt16(buffer, 0)) * 36;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
{
tmd.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
tmd.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
catch
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
memoryStream.Dispose();
throw;
}
}
memoryStream.Dispose();
return certificateChain;
}
catch
public static CertificateChain Load(Stream cert)
{
CertificateChain certificateChain = new CertificateChain();
certificateChain.parseCert(cert);
return certificateChain;
}
num += 768;
}
this.fireDebug("Scanning TMD for Certificates Finished...");
}
private bool isCertXs(byte[] part)
{
if (part.Length < 768)
return false;
if (part.Length > 768)
Array.Resize<byte>(ref part, 768);
return part[388] == (byte) 88 && part[389] == (byte) 83 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("09787045037121477824BC6A3E5E076156573F8A"));
}
public static CertificateChain FromTikTmd(string pathToTik, string pathToTmd) => CertificateChain.FromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd));
private bool isCertCa(byte[] part)
{
if (part.Length < 1024)
return false;
if (part.Length > 1024)
Array.Resize<byte>(ref part, 1024);
return part[644] == (byte) 67 && part[645] == (byte) 65 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318"));
}
public static CertificateChain FromTikTmd(byte[] tikFile, byte[] tmdFile)
{
CertificateChain certificateChain = new CertificateChain();
MemoryStream memoryStream1 = new MemoryStream(tikFile);
try
{
certificateChain.grabFromTik((Stream) memoryStream1);
}
catch
{
memoryStream1.Dispose();
throw;
}
MemoryStream memoryStream2 = new MemoryStream(tmdFile);
try
{
certificateChain.grabFromTmd((Stream) memoryStream2);
}
catch
{
memoryStream2.Dispose();
throw;
}
memoryStream2.Dispose();
return certificateChain.CertsComplete ? certificateChain : throw new Exception("Couldn't locate all certs!");
}
private bool isCertCp(byte[] part)
{
if (part.Length < 768)
return false;
if (part.Length > 768)
Array.Resize<byte>(ref part, 768);
return part[388] == (byte) 67 && part[389] == (byte) 80 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C"));
}
public static CertificateChain FromTikTmd(Stream tik, Stream tmd)
{
CertificateChain certificateChain = new CertificateChain();
certificateChain.grabFromTik(tik);
certificateChain.grabFromTmd(tmd);
return certificateChain;
}
private void fireDebug(string debugMessage, params object[] args)
{
EventHandler<MessageEventArgs> debug = this.Debug;
if (debug == null)
return;
debug(new object(), new MessageEventArgs(string.Format(debugMessage, args)));
public void LoadFile(string pathToCert) => this.LoadFile(File.ReadAllBytes(pathToCert));
public void LoadFile(byte[] certFile)
{
MemoryStream memoryStream = new MemoryStream(certFile);
try
{
this.parseCert((Stream) memoryStream);
}
catch
{
memoryStream.Dispose();
throw;
}
memoryStream.Dispose();
}
public void LoadFile(Stream cert) => this.parseCert(cert);
public void LoadFromTikTmd(string pathToTik, string pathToTmd) => this.LoadFromTikTmd(File.ReadAllBytes(pathToTik), File.ReadAllBytes(pathToTmd));
public void LoadFromTikTmd(byte[] tikFile, byte[] tmdFile)
{
MemoryStream memoryStream1 = new MemoryStream(tikFile);
try
{
this.grabFromTik((Stream) memoryStream1);
}
catch
{
memoryStream1.Dispose();
throw;
}
MemoryStream memoryStream2 = new MemoryStream(tmdFile);
try
{
this.grabFromTmd((Stream) memoryStream2);
}
catch
{
memoryStream2.Dispose();
throw;
}
memoryStream2.Dispose();
if (!this.CertsComplete)
throw new Exception("Couldn't locate all certs!");
}
public void LoadFromTikTmd(Stream tik, Stream tmd)
{
this.grabFromTik(tik);
this.grabFromTmd(tmd);
}
public void Save(string savePath)
{
if (File.Exists(savePath))
File.Delete(savePath);
using (FileStream fileStream = new FileStream(savePath, FileMode.Create))
this.writeToStream((Stream) fileStream);
}
public MemoryStream ToMemoryStream()
{
MemoryStream memoryStream = new MemoryStream();
try
{
this.writeToStream((Stream) memoryStream);
return memoryStream;
}
catch
{
memoryStream.Dispose();
throw;
}
}
public byte[] ToByteArray()
{
MemoryStream memoryStream = new MemoryStream();
try
{
this.writeToStream((Stream) memoryStream);
}
catch
{
memoryStream.Dispose();
throw;
}
byte[] array = memoryStream.ToArray();
memoryStream.Dispose();
return array;
}
private void writeToStream(Stream writeStream)
{
this.fireDebug("Writing Certificate Chain...");
if (!this.CertsComplete)
{
this.fireDebug(" Certificate Chain incomplete...");
throw new Exception("At least one certificate is missing!");
}
writeStream.Seek(0L, SeekOrigin.Begin);
object[] objArray1 = new object[1];
long position = writeStream.Position;
objArray1[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate CA... (Offset: 0x{0})", objArray1);
writeStream.Write(this.certCa, 0, this.certCa.Length);
object[] objArray2 = new object[1];
position = writeStream.Position;
objArray2[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate CP... (Offset: 0x{0})", objArray2);
writeStream.Write(this.certCp, 0, this.certCp.Length);
object[] objArray3 = new object[1];
position = writeStream.Position;
objArray3[0] = (object) position.ToString("x8");
this.fireDebug(" Writing Certificate XS... (Offset: 0x{0})", objArray3);
writeStream.Write(this.certXs, 0, this.certXs.Length);
this.fireDebug("Writing Certificate Chain Finished...");
}
private void parseCert(Stream certFile)
{
this.fireDebug("Parsing Certificate Chain...");
int num = 0;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
{
certFile.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
certFile.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
}
}
}
catch (Exception ex)
{
this.fireDebug("Error: {0}", (object) ex.Message);
}
num += 768;
}
if (!this.CertsComplete)
{
this.fireDebug(" Couldn't locate all Certificates...");
throw new Exception("Couldn't locate all certs!");
}
this.fireDebug("Parsing Certificate Chain Finished...");
}
private void grabFromTik(Stream tik)
{
this.fireDebug("Scanning Ticket for Certificates...");
int num = 676;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
{
tik.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
tik.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
}
}
}
catch
{
}
num += 768;
}
this.fireDebug("Scanning Ticket for Certificates Finished...");
}
private void grabFromTmd(Stream tmd)
{
this.fireDebug("Scanning TMD for Certificates...");
byte[] buffer = new byte[2];
tmd.Seek(478L, SeekOrigin.Begin);
tmd.Read(buffer, 0, 2);
int num = 484 + (int) Shared.Swap(BitConverter.ToUInt16(buffer, 0)) * 36;
for (int index = 0; index < 3; ++index)
{
this.fireDebug(" Scanning at Offset 0x{0}:", (object) num.ToString("x8"));
try
{
tmd.Seek((long) num, SeekOrigin.Begin);
byte[] array = new byte[1024];
tmd.Read(array, 0, array.Length);
this.fireDebug(" Checking for Certificate CA...");
if (this.isCertCa(array) && !this.certsComplete[1])
{
this.fireDebug(" Certificate CA detected...");
this.certCa = array;
this.certsComplete[1] = true;
num += 1024;
continue;
}
this.fireDebug(" Checking for Certificate CP...");
if (this.isCertCp(array) && !this.certsComplete[2])
{
this.fireDebug(" Certificate CP detected...");
Array.Resize<byte>(ref array, 768);
this.certCp = array;
this.certsComplete[2] = true;
num += 768;
continue;
}
this.fireDebug(" Checking for Certificate XS...");
if (this.isCertXs(array))
{
if (!this.certsComplete[0])
{
this.fireDebug(" Certificate XS detected...");
Array.Resize<byte>(ref array, 768);
this.certXs = array;
this.certsComplete[0] = true;
num += 768;
continue;
}
}
}
catch
{
}
num += 768;
}
this.fireDebug("Scanning TMD for Certificates Finished...");
}
private bool isCertXs(byte[] part)
{
if (part.Length < 768)
return false;
if (part.Length > 768)
Array.Resize<byte>(ref part, 768);
return part[388] == (byte) 88 && part[389] == (byte) 83 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("09787045037121477824BC6A3E5E076156573F8A"));
}
private bool isCertCa(byte[] part)
{
if (part.Length < 1024)
return false;
if (part.Length > 1024)
Array.Resize<byte>(ref part, 1024);
return part[644] == (byte) 67 && part[645] == (byte) 65 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("5B7D3EE28706AD8DA2CBD5A6B75C15D0F9B6F318"));
}
private bool isCertCp(byte[] part)
{
if (part.Length < 768)
return false;
if (part.Length > 768)
Array.Resize<byte>(ref part, 768);
return part[388] == (byte) 67 && part[389] == (byte) 80 && Shared.CompareByteArrays(this.sha.ComputeHash(part), Shared.HexStringToByteArray("6824D6DA4C25184F0D6DAF6EDB9C0FC57522A41C"));
}
private void fireDebug(string debugMessage, params object[] args)
{
EventHandler<MessageEventArgs> debug = this.Debug;
if (debug == null)
return;
debug(new object(), new MessageEventArgs(string.Format(debugMessage, args)));
}
}
}
}

View file

@ -1,279 +1,291 @@
// Decompiled with JetBrains decompiler
// Type: libWiiSharp.ColorIndexConverter
// Assembly: libWiiSharp, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: FBF36F3D-B5D6-481F-B5F5-1BD3C19E13B2
// Assembly location: C:\Users\theso\Downloads\NCPatcher\pack\libWiiSharp.dll
/* This file is part of libWiiSharp
* Copyright (C) 2009 Leathl
* Copyright (C) 2020 Github Contributors
*
* libWiiSharp is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* libWiiSharp is distributed in the hope that it will be
* useful, but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using System;
using System.Collections.Generic;
namespace libWiiSharp
{
internal class ColorIndexConverter
{
private uint[] rgbaPalette;
private byte[] tplPalette;
private uint[] rgbaData;
private byte[] tplData;
private TPL_TextureFormat tplFormat;
private TPL_PaletteFormat paletteFormat;
private int width;
private int height;
public byte[] Palette => this.tplPalette;
public byte[] Data => this.tplData;
public ColorIndexConverter(
uint[] rgbaData,
int width,
int height,
TPL_TextureFormat tplFormat,
TPL_PaletteFormat paletteFormat)
internal class ColorIndexConverter
{
if (tplFormat != TPL_TextureFormat.CI4 && tplFormat != TPL_TextureFormat.CI8)
throw new Exception("Texture format must be either CI4 or CI8");
if (paletteFormat != TPL_PaletteFormat.IA8 && paletteFormat != TPL_PaletteFormat.RGB565 && paletteFormat != TPL_PaletteFormat.RGB5A3)
throw new Exception("Palette format must be either IA8, RGB565 or RGB5A3!");
this.rgbaData = rgbaData;
this.width = width;
this.height = height;
this.tplFormat = tplFormat;
this.paletteFormat = paletteFormat;
this.buildPalette();
if (tplFormat != TPL_TextureFormat.CI4)
{
if (tplFormat == TPL_TextureFormat.CI8)
this.toCI8();
else
this.toCI14X2();
}
else
this.toCI4();
}
private uint[] rgbaPalette;
private byte[] tplPalette;
private uint[] rgbaData;
private byte[] tplData;
private TPL_TextureFormat tplFormat;
private TPL_PaletteFormat paletteFormat;
private int width;
private int height;
private void toCI4()
{
byte[] numArray = new byte[Shared.AddPadding(this.width, 8) * Shared.AddPadding(this.height, 8) / 2];
int num = 0;
for (int index1 = 0; index1 < this.height; index1 += 8)
{
for (int index2 = 0; index2 < this.width; index2 += 8)
public byte[] Palette => this.tplPalette;
public byte[] Data => this.tplData;
public ColorIndexConverter(
uint[] rgbaData,
int width,
int height,
TPL_TextureFormat tplFormat,
TPL_PaletteFormat paletteFormat)
{
for (int index3 = index1; index3 < index1 + 8; ++index3)
{
for (int index4 = index2; index4 < index2 + 8; index4 += 2)
if (tplFormat != TPL_TextureFormat.CI4 && tplFormat != TPL_TextureFormat.CI8)
throw new Exception("Texture format must be either CI4 or CI8");
if (paletteFormat != TPL_PaletteFormat.IA8 && paletteFormat != TPL_PaletteFormat.RGB565 && paletteFormat != TPL_PaletteFormat.RGB5A3)
throw new Exception("Palette format must be either IA8, RGB565 or RGB5A3!");
this.rgbaData = rgbaData;
this.width = width;
this.height = height;
this.tplFormat = tplFormat;
this.paletteFormat = paletteFormat;
this.buildPalette();
if (tplFormat != TPL_TextureFormat.CI4)
{
uint colorIndex1 = this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4]);
uint colorIndex2 = this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : (index3 * this.width + index4 + 1 < this.rgbaData.Length ? this.rgbaData[index3 * this.width + index4 + 1] : 0U));
numArray[num++] = (byte) ((uint) (byte) colorIndex1 << 4 | (uint) (byte) colorIndex2);
if (tplFormat == TPL_TextureFormat.CI8)
this.toCI8();
else
this.toCI14X2();
}
}
else
this.toCI4();
}
}
this.tplData = numArray;
}
private void toCI8()
{
byte[] numArray = new byte[Shared.AddPadding(this.width, 8) * Shared.AddPadding(this.height, 4)];
int num1 = 0;
for (int index1 = 0; index1 < this.height; index1 += 4)
{
for (int index2 = 0; index2 < this.width; index2 += 8)
private void toCI4()
{
for (int index3 = index1; index3 < index1 + 4; ++index3)
{
for (int index4 = index2; index4 < index2 + 8; ++index4)
byte[] numArray = new byte[Shared.AddPadding(this.width, 8) * Shared.AddPadding(this.height, 8) / 2];
int num = 0;
for (int index1 = 0; index1 < this.height; index1 += 8)
{
uint num2 = index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4];
numArray[num1++] = (byte) this.getColorIndex(num2);
for (int index2 = 0; index2 < this.width; index2 += 8)
{
for (int index3 = index1; index3 < index1 + 8; ++index3)
{
for (int index4 = index2; index4 < index2 + 8; index4 += 2)
{
uint colorIndex1 = this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4]);
uint colorIndex2 = this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : (index3 * this.width + index4 + 1 < this.rgbaData.Length ? this.rgbaData[index3 * this.width + index4 + 1] : 0U));
numArray[num++] = (byte) ((uint) (byte) colorIndex1 << 4 | (uint) (byte) colorIndex2);
}
}
}
}
}
this.tplData = numArray;
}
}
this.tplData = numArray;
}
private void toCI14X2()
{
byte[] numArray1 = new byte[Shared.AddPadding(this.width, 4) * Shared.AddPadding(this.height, 4) * 2];
int num1 = 0;
for (int index1 = 0; index1 < this.height; index1 += 4)
{
for (int index2 = 0; index2 < this.width; index2 += 4)
private void toCI8()
{
for (int index3 = index1; index3 < index1 + 4; ++index3)
{
for (int index4 = index2; index4 < index2 + 4; ++index4)
byte[] numArray = new byte[Shared.AddPadding(this.width, 8) * Shared.AddPadding(this.height, 4)];
int num1 = 0;
for (int index1 = 0; index1 < this.height; index1 += 4)
{
byte[] bytes = BitConverter.GetBytes((ushort) this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4]));
byte[] numArray2 = numArray1;
int index5 = num1;
int num2 = index5 + 1;
int num3 = (int) bytes[1];
numArray2[index5] = (byte) num3;
byte[] numArray3 = numArray1;
int index6 = num2;
num1 = index6 + 1;
int num4 = (int) bytes[0];
numArray3[index6] = (byte) num4;
for (int index2 = 0; index2 < this.width; index2 += 8)
{
for (int index3 = index1; index3 < index1 + 4; ++index3)
{
for (int index4 = index2; index4 < index2 + 8; ++index4)
{
uint num2 = index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4];
numArray[num1++] = (byte) this.getColorIndex(num2);
}
}
}
}
}
this.tplData = numArray;
}
}
this.tplData = numArray1;
}
private void buildPalette()
{
int num1 = 256;
if (this.tplFormat == TPL_TextureFormat.CI4)
num1 = 16;
else if (this.tplFormat == TPL_TextureFormat.CI14X2)
num1 = 16384;
List<uint> uintList = new List<uint>();
List<ushort> ushortList = new List<ushort>();
uintList.Add(0U);
ushortList.Add((ushort) 0);
for (int index = 1; index < this.rgbaData.Length && uintList.Count != num1; ++index)
{
if ((long) (this.rgbaData[index] >> 24 & (uint) byte.MaxValue) >= (this.tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L))
private void toCI14X2()
{
ushort num2 = Shared.Swap(this.convertToPaletteValue((int) this.rgbaData[index]));
if (!uintList.Contains(this.rgbaData[index]) && !ushortList.Contains(num2))
{
uintList.Add(this.rgbaData[index]);
ushortList.Add(num2);
}
byte[] numArray1 = new byte[Shared.AddPadding(this.width, 4) * Shared.AddPadding(this.height, 4) * 2];
int num1 = 0;
for (int index1 = 0; index1 < this.height; index1 += 4)
{
for (int index2 = 0; index2 < this.width; index2 += 4)
{
for (int index3 = index1; index3 < index1 + 4; ++index3)
{
for (int index4 = index2; index4 < index2 + 4; ++index4)
{
byte[] bytes = BitConverter.GetBytes((ushort) this.getColorIndex(index3 >= this.height || index4 >= this.width ? 0U : this.rgbaData[index3 * this.width + index4]));
byte[] numArray2 = numArray1;
int index5 = num1;
int num2 = index5 + 1;
int num3 = (int) bytes[1];
numArray2[index5] = (byte) num3;
byte[] numArray3 = numArray1;
int index6 = num2;
num1 = index6 + 1;
int num4 = (int) bytes[0];
numArray3[index6] = (byte) num4;
}
}
}
}
this.tplData = numArray1;
}
}
while (uintList.Count % 16 != 0)
{
uintList.Add(uint.MaxValue);
ushortList.Add(ushort.MaxValue);
}
this.tplPalette = Shared.UShortArrayToByteArray(ushortList.ToArray());
this.rgbaPalette = uintList.ToArray();
}
private ushort convertToPaletteValue(int rgba)
{
int num1 = 0;
int num2;
if (this.paletteFormat == TPL_PaletteFormat.IA8)
{
int num3 = ((rgba & (int) byte.MaxValue) + (rgba >> 8 & (int) byte.MaxValue) + (rgba >> 16 & (int) byte.MaxValue)) / 3 & (int) byte.MaxValue;
num2 = (int) (ushort) ((rgba >> 24 & (int) byte.MaxValue) << 8 | num3);
}
else if (this.paletteFormat == TPL_PaletteFormat.RGB565)
{
num2 = (int) (ushort) ((rgba >> 16 & (int) byte.MaxValue) >> 3 << 11 | (rgba >> 8 & (int) byte.MaxValue) >> 2 << 5 | (rgba & (int) byte.MaxValue) >> 3);
}
else
{
int num3 = rgba >> 16 & (int) byte.MaxValue;
int num4 = rgba >> 8 & (int) byte.MaxValue;
int num5 = rgba & (int) byte.MaxValue;
int num6 = rgba >> 24 & (int) byte.MaxValue;
if (num6 <= 218)
private void buildPalette()
{
int num7 = num1 & -32769;
int num8 = num3 * 15 / (int) byte.MaxValue & 15;
int num9 = num4 * 15 / (int) byte.MaxValue & 15;
int num10 = num5 * 15 / (int) byte.MaxValue & 15;
int num11 = num6 * 7 / (int) byte.MaxValue & 7;
num2 = num7 | num11 << 12 | num10 | num9 << 4 | num8 << 8;
int num1 = 256;
if (this.tplFormat == TPL_TextureFormat.CI4)
num1 = 16;
else if (this.tplFormat == TPL_TextureFormat.CI14X2)
num1 = 16384;
List<uint> uintList = new List<uint>();
List<ushort> ushortList = new List<ushort>();
uintList.Add(0U);
ushortList.Add((ushort) 0);
for (int index = 1; index < this.rgbaData.Length && uintList.Count != num1; ++index)
{
if ((long) (this.rgbaData[index] >> 24 & (uint) byte.MaxValue) >= (this.tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L))
{
ushort num2 = Shared.Swap(this.convertToPaletteValue((int) this.rgbaData[index]));
if (!uintList.Contains(this.rgbaData[index]) && !ushortList.Contains(num2))
{
uintList.Add(this.rgbaData[index]);
ushortList.Add(num2);
}
}
}
while (uintList.Count % 16 != 0)
{
uintList.Add(uint.MaxValue);
ushortList.Add(ushort.MaxValue);
}
this.tplPalette = Shared.UShortArrayToByteArray(ushortList.ToArray());
this.rgbaPalette = uintList.ToArray();
}
else
{
int num7 = num1 | 32768;
int num8 = num3 * 31 / (int) byte.MaxValue & 31;
int num9 = num4 * 31 / (int) byte.MaxValue & 31;
int num10 = num5 * 31 / (int) byte.MaxValue & 31;
num2 = num7 | num10 | num9 << 5 | num8 << 10;
}
}
return (ushort) num2;
}
private uint getColorIndex(uint value)
{
uint num1 = (uint) int.MaxValue;
uint num2 = 0;
if ((long) (value >> 24 & (uint) byte.MaxValue) < (this.tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L))
return 0;
ushort paletteValue1 = this.convertToPaletteValue((int) value);
for (int index = 0; index < this.rgbaPalette.Length; ++index)
{
ushort paletteValue2 = this.convertToPaletteValue((int) this.rgbaPalette[index]);
if ((int) paletteValue1 == (int) paletteValue2)
return (uint) index;
uint distance = this.getDistance(paletteValue1, paletteValue2);
if (distance < num1)
private ushort convertToPaletteValue(int rgba)
{
num1 = distance;
num2 = (uint) index;
int num1 = 0;
int num2;
if (this.paletteFormat == TPL_PaletteFormat.IA8)
{
int num3 = ((rgba & (int) byte.MaxValue) + (rgba >> 8 & (int) byte.MaxValue) + (rgba >> 16 & (int) byte.MaxValue)) / 3 & (int) byte.MaxValue;
num2 = (int) (ushort) ((rgba >> 24 & (int) byte.MaxValue) << 8 | num3);
}
else if (this.paletteFormat == TPL_PaletteFormat.RGB565)
{
num2 = (int) (ushort) ((rgba >> 16 & (int) byte.MaxValue) >> 3 << 11 | (rgba >> 8 & (int) byte.MaxValue) >> 2 << 5 | (rgba & (int) byte.MaxValue) >> 3);
}
else
{
int num3 = rgba >> 16 & (int) byte.MaxValue;
int num4 = rgba >> 8 & (int) byte.MaxValue;
int num5 = rgba & (int) byte.MaxValue;
int num6 = rgba >> 24 & (int) byte.MaxValue;
if (num6 <= 218)
{
int num7 = num1 & -32769;
int num8 = num3 * 15 / (int) byte.MaxValue & 15;
int num9 = num4 * 15 / (int) byte.MaxValue & 15;
int num10 = num5 * 15 / (int) byte.MaxValue & 15;
int num11 = num6 * 7 / (int) byte.MaxValue & 7;
num2 = num7 | num11 << 12 | num10 | num9 << 4 | num8 << 8;
}
else
{
int num7 = num1 | 32768;
int num8 = num3 * 31 / (int) byte.MaxValue & 31;
int num9 = num4 * 31 / (int) byte.MaxValue & 31;
int num10 = num5 * 31 / (int) byte.MaxValue & 31;
num2 = num7 | num10 | num9 << 5 | num8 << 10;
}
}
return (ushort) num2;
}
}
private uint getColorIndex(uint value)
{
uint num1 = (uint) int.MaxValue;
uint num2 = 0;
if ((long) (value >> 24 & (uint) byte.MaxValue) < (this.tplFormat == TPL_TextureFormat.CI14X2 ? 1L : 25L))
return 0;
ushort paletteValue1 = this.convertToPaletteValue((int) value);
for (int index = 0; index < this.rgbaPalette.Length; ++index)
{
ushort paletteValue2 = this.convertToPaletteValue((int) this.rgbaPalette[index]);
if ((int) paletteValue1 == (int) paletteValue2)
return (uint) index;
uint distance = this.getDistance(paletteValue1, paletteValue2);
if (distance < num1)
{
num1 = distance;
num2 = (uint) index;
}
}
return num2;
}
}
private uint getDistance(ushort color, ushort paletteColor)
{
int rgbaValue1 = (int) this.convertToRgbaValue(color);
uint rgbaValue2 = this.convertToRgbaValue(paletteColor);
uint val1_1 = (uint) rgbaValue1 >> 24 & (uint) byte.MaxValue;
uint val1_2 = (uint) rgbaValue1 >> 16 & (uint) byte.MaxValue;
uint val1_3 = (uint) rgbaValue1 >> 8 & (uint) byte.MaxValue;
uint val1_4 = (uint) (rgbaValue1 & (int) byte.MaxValue);
uint val2_1 = rgbaValue2 >> 24 & (uint) byte.MaxValue;
uint val2_2 = rgbaValue2 >> 16 & (uint) byte.MaxValue;
uint val2_3 = rgbaValue2 >> 8 & (uint) byte.MaxValue;
uint val2_4 = rgbaValue2 & (uint) byte.MaxValue;
int num1 = (int) Math.Max(val1_1, val2_1) - (int) Math.Min(val1_1, val2_1);
uint num2 = Math.Max(val1_2, val2_2) - Math.Min(val1_2, val2_2);
uint num3 = Math.Max(val1_3, val2_3) - Math.Min(val1_3, val2_3);
uint num4 = Math.Max(val1_4, val2_4) - Math.Min(val1_4, val2_4);
int num5 = (int) num2;
return (uint) (num1 + num5) + num3 + num4;
}
private uint getDistance(ushort color, ushort paletteColor)
{
int rgbaValue1 = (int) this.convertToRgbaValue(color);
uint rgbaValue2 = this.convertToRgbaValue(paletteColor);
uint val1_1 = (uint) rgbaValue1 >> 24 & (uint) byte.MaxValue;
uint val1_2 = (uint) rgbaValue1 >> 16 & (uint) byte.MaxValue;
uint val1_3 = (uint) rgbaValue1 >> 8 & (uint) byte.MaxValue;
uint val1_4 = (uint) (rgbaValue1 & (int) byte.MaxValue);
uint val2_1 = rgbaValue2 >> 24 & (uint) byte.MaxValue;
uint val2_2 = rgbaValue2 >> 16 & (uint) byte.MaxValue;
uint val2_3 = rgbaValue2 >> 8 & (uint) byte.MaxValue;
uint val2_4 = rgbaValue2 & (uint) byte.MaxValue;
int num1 = (int) Math.Max(val1_1, val2_1) - (int) Math.Min(val1_1, val2_1);
uint num2 = Math.Max(val1_2, val2_2) - Math.Min(val1_2, val2_2);
uint num3 = Math.Max(val1_3, val2_3) - Math.Min(val1_3, val2_3);
uint num4 = Math.Max(val1_4, val2_4) - Math.Min(val1_4, val2_4);
int num5 = (int) num2;
return (uint) (num1 + num5) + num3 + num4;
}
private uint convertToRgbaValue(ushort pixel)
{
if (this.paletteFormat == TPL_PaletteFormat.IA8)
{
int num1 = (int) pixel >> 8;
int num2 = (int) pixel & (int) byte.MaxValue;
return (uint) (num1 | num1 << 8 | num1 << 16 | num2 << 24);
}
if (this.paletteFormat == TPL_PaletteFormat.RGB565)
{
int num1 = ((int) pixel >> 11 & 31) << 3 & (int) byte.MaxValue;
int num2 = ((int) pixel >> 5 & 63) << 2 & (int) byte.MaxValue;
int num3 = ((int) pixel & 31) << 3 & (int) byte.MaxValue;
int maxValue = (int) byte.MaxValue;
return (uint) (num3 | num2 << 8 | num1 << 16 | maxValue << 24);
}
int num4;
int num5;
int num6;
int num7;
if (((int) pixel & 32768) != 0)
{
num4 = ((int) pixel >> 10 & 31) * (int) byte.MaxValue / 31;
num5 = ((int) pixel >> 5 & 31) * (int) byte.MaxValue / 31;
num6 = ((int) pixel & 31) * (int) byte.MaxValue / 31;
num7 = (int) byte.MaxValue;
}
else
{
num7 = ((int) pixel >> 12 & 7) * (int) byte.MaxValue / 7;
num4 = ((int) pixel >> 8 & 15) * (int) byte.MaxValue / 15;
num5 = ((int) pixel >> 4 & 15) * (int) byte.MaxValue / 15;
num6 = ((int) pixel & 15) * (int) byte.MaxValue / 15;
}
return (uint) (num6 | num5 << 8 | num4 << 16 | num7 << 24);
private uint convertToRgbaValue(ushort pixel)
{
if (this.paletteFormat == TPL_PaletteFormat.IA8)
{
int num1 = (int) pixel >> 8;
int num2 = (int) pixel & (int) byte.MaxValue;
return (uint) (num1 | num1 << 8 | num1 << 16 | num2 << 24);
}
if (this.paletteFormat == TPL_PaletteFormat.RGB565)
{
int num1 = ((int) pixel >> 11 & 31) << 3 & (int) byte.MaxValue;
int num2 = ((int) pixel >> 5 & 63) << 2 & (int) byte.MaxValue;
int num3 = ((int) pixel & 31) << 3 & (int) byte.MaxValue;
int maxValue = (int) byte.MaxValue;
return (uint) (num3 | num2 << 8 | num1 << 16 | maxValue << 24);
}
int num4;
int num5;
int num6;
int num7;
if (((int) pixel & 32768) != 0)
{
num4 = ((int) pixel >> 10 & 31) * (int) byte.MaxValue / 31;
num5 = ((int) pixel >> 5 & 31) * (int) byte.MaxValue / 31;
num6 = ((int) pixel & 31) * (int) byte.MaxValue / 31;
num7 = (int) byte.MaxValue;
}
else
{
num7 = ((int) pixel >> 12 & 7) * (int) byte.MaxValue / 7;
num4 = ((int) pixel >> 8 & 15) * (int) byte.MaxValue / 15;
num5 = ((int) pixel >> 4 & 15) * (int) byte.MaxValue / 15;
num6 = ((int) pixel & 15) * (int) byte.MaxValue / 15;
}
return (uint) (num6 | num5 << 8 | num4 << 16 | num7 << 24);
}
}
}
}

View file

@ -24,6 +24,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<RegisterForComInterop>true</RegisterForComInterop>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
@ -34,6 +35,7 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<Prefer32Bit>false</Prefer32Bit>
<RegisterForComInterop>false</RegisterForComInterop>
</PropertyGroup>
<PropertyGroup>
<SignAssembly>false</SignAssembly>
@ -93,5 +95,8 @@
<Compile Include="zlibWrapper.cs" />
<Compile Include="AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<Content Include=".gitignore" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>