From bc65416cf772bf123f5641747a0294523a69c8ac Mon Sep 17 00:00:00 2001 From: "mzolob@gmail.com" Date: Wed, 2 Nov 2011 01:02:11 +0000 Subject: [PATCH] Updated to 1.5 - Added the ability to send WADs to the HBC using SendWad - You can now download an IOS with -ios # in NUSD - Downloaded IOS wads are now named like so: IOS##-64-####.wad - Under certain conditions, when downloading a wad with NUS, it will not be saved in a folder, just as the WAD (see ReadMe) - If missing dll's are detected (WadInstaller or libWiiSharp), Sharpii will ask to download them, if they are required. - You can now use a .dol file instead of a .wad with the '-dol' in the WAD editor/packer - Probably a few other little things I have forgotten - Even more code cleanup and bug fixes --- Sharpii.sln | 22 + Sharpii/BNS.cs | 2 +- Sharpii/HBC.cs | 158 +- Sharpii/IOS.cs | 3 +- Sharpii/NUSD.cs | 134 +- Sharpii/Program.cs | 59 +- Sharpii/README.txt | 28 +- Sharpii/Sharpii.csproj | 6 + Sharpii/TPL.cs | 2 +- Sharpii/U8.cs | 2 +- Sharpii/WAD.cs | 18 +- WadInstaller/InstallerHelper.cs | 120 + WadInstaller/Properties/AssemblyInfo.cs | 53 + WadInstaller/Resources/WadInstaller.dol.z | Bin 0 -> 302938 bytes WadInstaller/WadInstaller.csproj | 58 + WadInstaller_Source/LICENSE.txt | 339 ++ WadInstaller_Source/Makefile | 139 + WadInstaller_Source/README.Orig.es.txt | 43 + WadInstaller_Source/README.Orig.txt | 44 + WadInstaller_Source/README.txt | 4 + WadInstaller_Source/data/background | Bin 0 -> 125170 bytes WadInstaller_Source/installer.pnproj | 1 + WadInstaller_Source/installer.pnps | 1 + WadInstaller_Source/source/fat.c | 57 + WadInstaller_Source/source/fat.h | 41 + WadInstaller_Source/source/gui.c | 62 + WadInstaller_Source/source/gui.h | 8 + WadInstaller_Source/source/install.c | 2 + WadInstaller_Source/source/install.h | 14 + WadInstaller_Source/source/libpng/png.h | 3569 +++++++++++++++++ WadInstaller_Source/source/libpng/pngconf.h | 1481 +++++++ WadInstaller_Source/source/libpng/pngu/pngu.c | 1132 ++++++ WadInstaller_Source/source/libpng/pngu/pngu.h | 171 + WadInstaller_Source/source/menu.c | 36 + WadInstaller_Source/source/menu.h | 9 + WadInstaller_Source/source/restart.c | 33 + WadInstaller_Source/source/restart.h | 8 + WadInstaller_Source/source/sha1.c | 172 + WadInstaller_Source/source/sha1.h | 12 + WadInstaller_Source/source/stub.S | 6 + WadInstaller_Source/source/sys.c | 98 + WadInstaller_Source/source/sys.h | 11 + WadInstaller_Source/source/title.c | 256 ++ WadInstaller_Source/source/title.h | 16 + WadInstaller_Source/source/utils.h | 15 + WadInstaller_Source/source/video.c | 141 + WadInstaller_Source/source/video.h | 19 + WadInstaller_Source/source/wad-manager.c | 72 + WadInstaller_Source/source/wad.c | 375 ++ WadInstaller_Source/source/wad.h | 8 + WadInstaller_Source/source/wpad.c | 81 + WadInstaller_Source/source/wpad.h | 12 + 52 files changed, 9108 insertions(+), 45 deletions(-) create mode 100644 WadInstaller/InstallerHelper.cs create mode 100644 WadInstaller/Properties/AssemblyInfo.cs create mode 100644 WadInstaller/Resources/WadInstaller.dol.z create mode 100644 WadInstaller/WadInstaller.csproj create mode 100644 WadInstaller_Source/LICENSE.txt create mode 100644 WadInstaller_Source/Makefile create mode 100644 WadInstaller_Source/README.Orig.es.txt create mode 100644 WadInstaller_Source/README.Orig.txt create mode 100644 WadInstaller_Source/README.txt create mode 100644 WadInstaller_Source/data/background create mode 100644 WadInstaller_Source/installer.pnproj create mode 100644 WadInstaller_Source/installer.pnps create mode 100644 WadInstaller_Source/source/fat.c create mode 100644 WadInstaller_Source/source/fat.h create mode 100644 WadInstaller_Source/source/gui.c create mode 100644 WadInstaller_Source/source/gui.h create mode 100644 WadInstaller_Source/source/install.c create mode 100644 WadInstaller_Source/source/install.h create mode 100644 WadInstaller_Source/source/libpng/png.h create mode 100644 WadInstaller_Source/source/libpng/pngconf.h create mode 100644 WadInstaller_Source/source/libpng/pngu/pngu.c create mode 100644 WadInstaller_Source/source/libpng/pngu/pngu.h create mode 100644 WadInstaller_Source/source/menu.c create mode 100644 WadInstaller_Source/source/menu.h create mode 100644 WadInstaller_Source/source/restart.c create mode 100644 WadInstaller_Source/source/restart.h create mode 100644 WadInstaller_Source/source/sha1.c create mode 100644 WadInstaller_Source/source/sha1.h create mode 100644 WadInstaller_Source/source/stub.S create mode 100644 WadInstaller_Source/source/sys.c create mode 100644 WadInstaller_Source/source/sys.h create mode 100644 WadInstaller_Source/source/title.c create mode 100644 WadInstaller_Source/source/title.h create mode 100644 WadInstaller_Source/source/utils.h create mode 100644 WadInstaller_Source/source/video.c create mode 100644 WadInstaller_Source/source/video.h create mode 100644 WadInstaller_Source/source/wad-manager.c create mode 100644 WadInstaller_Source/source/wad.c create mode 100644 WadInstaller_Source/source/wad.h create mode 100644 WadInstaller_Source/source/wpad.c create mode 100644 WadInstaller_Source/source/wpad.h diff --git a/Sharpii.sln b/Sharpii.sln index 1fb0189..a82527e 100644 --- a/Sharpii.sln +++ b/Sharpii.sln @@ -3,16 +3,38 @@ Microsoft Visual Studio Solution File, Format Version 11.00 # Visual C# Express 2010 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sharpii", "Sharpii\Sharpii.csproj", "{AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WadInstaller", "WadInstaller\WadInstaller.csproj", "{475F3ADF-B529-449F-89DA-BA5E8BE15DD5}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|Any CPU.ActiveCfg = Debug|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|Mixed Platforms.Build.0 = Debug|x86 {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|x86.ActiveCfg = Debug|x86 {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Debug|x86.Build.0 = Debug|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|Any CPU.ActiveCfg = Release|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|Mixed Platforms.Build.0 = Release|x86 {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|x86.ActiveCfg = Release|x86 {AD7EBA1D-DF9F-4F71-AAD4-3963E79CE827}.Release|x86.Build.0 = Release|x86 + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Release|Any CPU.Build.0 = Release|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Sharpii/BNS.cs b/Sharpii/BNS.cs index 829f83f..929d3dc 100644 --- a/Sharpii/BNS.cs +++ b/Sharpii/BNS.cs @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Sharpii. If not, see . + * along with Sharpii. If not, see . */ using System; diff --git a/Sharpii/HBC.cs b/Sharpii/HBC.cs index 1938629..dd99ea7 100644 --- a/Sharpii/HBC.cs +++ b/Sharpii/HBC.cs @@ -12,11 +12,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Sharpii. If not, see . + * along with Sharpii. If not, see . */ using System; using System.IO; +using System.Net; using libWiiSharp; namespace Sharpii @@ -134,7 +135,138 @@ namespace Sharpii } - public static void SendDol_help() + public static bool SendWad_Check(string[] args) + { + if (args.Length < 2) + { + SendWad_help(); + return false; + } + if (args[1].ToUpper() == "-H" || args[1].ToUpper() == "-HELP") + { + SendWad_help(); + return false; + } + + if (!File.Exists("WadInstaller.dll")) + { + System.Console.WriteLine("ERROR: WadInstaller.dll not found"); + System.Console.WriteLine("\n\nAttemp to download? [Y/N]"); + System.Console.Write("\n>>"); + string ans = Console.ReadLine(); + if (ans.ToUpper() == "Y") + { + try + { + Console.Write("\nGrabbing WadInstaller.dll..."); + WebClient DLwadInstaller = new WebClient(); + DLwadInstaller.DownloadFile("http://sharpii.googlecode.com/files/WadInstaller.dll", "WadInstaller.dll"); + Console.Write("Done!\n"); + } + catch (Exception ex) + { System.Console.WriteLine("An error occured: {0}", ex.Message); return false; } + } + else + return false; + } + + return true; + } + + public static void SendWad(string[] args) + { + string input = ""; + string ip = ""; + string ios = ""; + string protocol = "JODI"; + + //Get parameters + for (int i = 1; i < args.Length; i++) + { + switch (args[i].ToUpper()) + { + case "-IOS": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No ip set"); + return; + } + ios = args[i + 1]; + if (!(Convert.ToInt32(ios) >= 3 && Convert.ToInt32(ios) <= 255)) + { + Console.WriteLine("ERROR: Invalid IOS number"); + return; + } + break; + case "-IP": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No ip set"); + return; + } + ip = args[i + 1]; + break; + case "-WAD": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No WAD set"); + return; + } + input = args[i + 1]; + //Check if file exists + if (File.Exists(input) == false) + { + System.Console.WriteLine("ERROR: Unable to open file: {0}", input); + return; + } + break; + case "-OLD": + protocol = "HAXX"; + break; + } + } + + //Run main part, and check for exceptions + try + { + libWiiSharp.Protocol proto = Protocol.JODI; + + if (Quiet.quiet > 2 && protocol == "HAXX") + System.Console.WriteLine("Using old protocol"); + + if (protocol == "HAXX") + proto = Protocol.HAXX; + + if (Quiet.quiet > 2) + System.Console.Write("Loading File..."); + + HbcTransmitter file = new HbcTransmitter(proto, ip); + byte[] Installer = WadInstaller.InstallerHelper.CreateInstaller(input, (byte)Convert.ToInt32(ios)).ToArray(); + + if (Quiet.quiet > 2) + System.Console.Write("Done!\n"); + + if (Quiet.quiet > 1) + System.Console.Write("Sending file..."); + + file.TransmitFile("WadInstaller.dol", Installer); + + if (Quiet.quiet > 1) + System.Console.Write("Done!\n"); + } + catch (Exception ex) + { + System.Console.WriteLine("An unknown error occured, please try again"); + System.Console.WriteLine(""); + System.Console.WriteLine("ERROR DETAILS: {0}", ex.Message); + return; + } + + return; + + } + + private static void SendDol_help() { System.Console.WriteLine(""); System.Console.WriteLine("Sharpii {0} - SendDol - A tool by person66, using libWiiSharp.dll by leathl", Version.version); @@ -156,5 +288,27 @@ namespace Sharpii System.Console.WriteLine(" NOTE: Any arguments after '-dol file' will be sent as dol"); System.Console.WriteLine(" arguments"); } + + public static void SendWad_help() + { + System.Console.WriteLine(""); + System.Console.WriteLine("Sharpii {0} - SendWad - A tool by person66, using libWiiSharp.dll by leathl,", Version.version); + System.Console.WriteLine(" and CRAP's installer by WiiCrazy/I.R.on"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Usage:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" Sharpii.exe SendWad -ip ip_adress -wad file -ios ios [-old] [-nocomp]"); + System.Console.WriteLine(""); + System.Console.WriteLine(""); + System.Console.WriteLine(" Arguments:"); + System.Console.WriteLine(""); + System.Console.WriteLine(" -dol file The dol file to send"); + System.Console.WriteLine(" -ip ip_adress The IP address of your wii"); + System.Console.WriteLine(" -ios ios The ios to use to install the wad"); + System.Console.WriteLine(" -old Use for the old (1.0.4 and below) HBC"); + System.Console.WriteLine(" -nocomp Disable compression"); + System.Console.WriteLine(""); + System.Console.WriteLine(" NOTE: WAD files must be less than 8MB large"); + } } } \ No newline at end of file diff --git a/Sharpii/IOS.cs b/Sharpii/IOS.cs index b597698..c301071 100644 --- a/Sharpii/IOS.cs +++ b/Sharpii/IOS.cs @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Sharpii. If not, see . + * along with Sharpii. If not, see . */ using System; @@ -240,7 +240,6 @@ namespace Sharpii System.Console.WriteLine("Sharpii {0} - IOS - A tool by person66, using libWiiSharp.dll by leathl", Version.version); System.Console.WriteLine(" Code based off PatchIOS by leathl"); System.Console.WriteLine(""); - System.Console.WriteLine(""); System.Console.WriteLine(" Usage:"); System.Console.WriteLine(""); System.Console.WriteLine(" Sharpii.exe IOS input [-o output] [-fs] [-es] [-np] [-vp] [-s slot]"); diff --git a/Sharpii/NUSD.cs b/Sharpii/NUSD.cs index c7713cb..f72d2ba 100644 --- a/Sharpii/NUSD.cs +++ b/Sharpii/NUSD.cs @@ -12,7 +12,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Sharpii. If not, see . + * along with Sharpii. If not, see . */ using System; @@ -40,11 +40,16 @@ namespace Sharpii //Set up variables string id = ""; string content = ""; - int version = -1; + string version = ""; + int intver = -1; string output = ""; bool local = false; List store = new List(); bool entered = false; + bool wad = false; + bool NoOut = false; + string ios = ""; + string temp = Path.GetTempPath() + "Sharpii.tmp"; //Get arguments for (int i = 1; i < args.Length; i++) @@ -84,12 +89,15 @@ namespace Sharpii Console.WriteLine("ERROR: No version set"); return; } - if (!int.TryParse(args[i + 1], out version)) + version = args[i + 1]; + if (version.ToUpper() == "LATEST") + break; + if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); return; } - if (version < 0 || version > 65535) + if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); return; @@ -101,12 +109,15 @@ namespace Sharpii Console.WriteLine("ERROR: No version set"); return; } - if (!int.TryParse(args[i + 1], out version)) + version = args[i + 1]; + if (version.ToUpper() == "LATEST") + break; + if (!int.TryParse(version, out intver)) { Console.WriteLine("Invalid version {0}...", args[i + 1]); return; } - if (version < 0 || version > 65535) + if (intver < 0 || intver > 65535) { Console.WriteLine("Invalid version {0}...", version); return; @@ -128,6 +139,14 @@ namespace Sharpii } id = args[i + 1]; break; + case "-IOS": + if (i + 1 >= args.Length) + { + Console.WriteLine("ERROR: No IOS specified"); + return; + } + id = "00000001000000" + Convert.ToInt32(args[i + 1]).ToString("X2"); + break; case "-SINGLE": if (i + 1 >= args.Length) { @@ -147,24 +166,29 @@ namespace Sharpii } } - //Error checking + //Error checking & stuff if (id == "") { System.Console.WriteLine("ERROR: No ID specified"); return; } - if (version == -1) + if (version == "") { - System.Console.WriteLine("ERROR: No version specified"); - return; + if (Quiet.quiet > 2) + System.Console.WriteLine("No version specified, using latest", version); + version = "LATEST"; } - if (output == "") + if (version.ToUpper() == "LATEST") { - output = id + "v" + version; + //Grab the TMD and get the latest version + NusClient grabtmd = new NusClient(); + TMD tmd = grabtmd.DownloadTMD(id, ""); + version = tmd.TitleVersion.ToString(); + if (Quiet.quiet > 2) - System.Console.WriteLine("No output specified, using {0}", output); + System.Console.WriteLine("Found latest version: v{0}", version); } if (entered == false) //Will only be false if no store type argument was given @@ -174,6 +198,26 @@ namespace Sharpii System.Console.WriteLine("No store type specified, using all"); } + if (id.Length == 16 && Convert.ToInt32(id.Substring(14, 2), 16) >= 3 && Convert.ToInt32(id.Substring(14, 2), 16) <= 255 && id.Substring(0, 14) == "00000001000000") + ios = "IOS" + Convert.ToInt32(id.Substring(14, 2), 16) + "-64-" + version + ".wad"; + + if ((((output.Length >= 4 && output.Substring(output.Length - 4, 4).ToUpper() == ".WAD") || output == "") && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1) || (output == "" && ios != "" && Array.IndexOf(store.ToArray(), StoreType.WAD) != -1 && store.ToArray().Length == 1)) + { + wad = true; + if (Directory.Exists(temp) == true) + DeleteDir.DeleteDirectory(temp); + + Directory.CreateDirectory(temp); + } + + if (output == "") + { + NoOut = true; + output = ios == "" ? id + "v" + version : ios.Substring(0, ios.Length - 4); + if (Quiet.quiet > 2) + System.Console.WriteLine("No output specified, using {0}", output); + } + //Main part, catches random/unexpected exceptions try { @@ -192,7 +236,7 @@ namespace Sharpii if (Quiet.quiet > 1) System.Console.Write("Downloading content..."); - nus.DownloadSingleContent(id, version.ToString(), content, output); + nus.DownloadSingleContent(id, version, content, output); if (Quiet.quiet > 1) System.Console.Write("Done!\n"); @@ -201,8 +245,14 @@ namespace Sharpii { if (Quiet.quiet > 1) System.Console.Write("Downloading title..."); + + string realout = output; + if (wad == true) + output = temp; + + nus.DownloadTitle(id, version, output, store.ToArray()); - nus.DownloadTitle(id, version.ToString(), output, store.ToArray()); + WadIosNamingStuff(wad, temp, id, version, ios, NoOut, output, realout); if (Quiet.quiet > 1) System.Console.Write("Done!\n"); @@ -223,6 +273,49 @@ namespace Sharpii } + private static void WadIosNamingStuff(bool wad, string temp, string id, string version, string ios, bool NoOut, string output, string realout) + { + if (wad == true) + { + if (!File.Exists(temp + "\\" + id + "v" + version + ".wad")) + { + System.Console.WriteLine("ERROR: Can't find WAD"); + return; + } + if (ios != "" && NoOut == true) + { + int index = realout.LastIndexOf("\\") > realout.LastIndexOf("/") ? realout.LastIndexOf("\\") : realout.LastIndexOf("/"); + if (File.Exists(realout.Substring(0, index + 1) + ios)) + File.Delete(realout.Substring(0, index + 1) + ios); + File.Move(temp + "\\" + id + "v" + version + ".wad", realout.Substring(0, index + 1) + ios); + } + else if (ios == "" && NoOut == true) + { + if (File.Exists(realout + ".wad")) + File.Delete(realout + ".wad"); + File.Move(temp + "\\" + id + "v" + version + ".wad", realout + ".wad"); + } + else + { + if (File.Exists(realout)) + File.Delete(realout); + File.Move(temp + "\\" + id + "v" + version + ".wad", realout); + } + DeleteDir.DeleteDirectory(temp); + } + else if (ios != "") + { + if (output.Substring(output.Length - 1, 1) == "\\" || output.Substring(output.Length - 1, 1) == "/") + output = output.Substring(output.Length - 1, 1); + if (File.Exists(output + "\\" + id + "v" + version + ".wad")) + { + if (File.Exists(output + "\\" + ios)) + File.Delete(output + "\\" + ios); + File.Move(output + "\\" + id + "v" + version + ".wad", output + "\\" + ios); + } + } + } + public static void NUS_help() { System.Console.WriteLine(""); @@ -231,14 +324,17 @@ namespace Sharpii System.Console.WriteLine(""); System.Console.WriteLine(" Usage:"); System.Console.WriteLine(""); - System.Console.WriteLine(" Sharpii.exe NUSD [-id titleID] [-v version] [-o otput] [-all] [-wad]"); - System.Console.WriteLine(" [-decrypt] [-encrypt] [-local] [-s content]"); + System.Console.WriteLine(" Sharpii.exe NUSD [-id titleID | -ios IOS] [-v version] [-o otput] [-all]"); + System.Console.WriteLine(" [-wad] [-decrypt] [-encrypt] [-local] [-s content]"); System.Console.WriteLine(""); System.Console.WriteLine(""); System.Console.WriteLine(" Arguments:"); System.Console.WriteLine(""); System.Console.WriteLine(" -id titleID [required] The Title ID of the file you wish to download"); System.Console.WriteLine(" -v version [required] The version of the file you wish to download"); + System.Console.WriteLine(" NOTE: Use 'latest' to get the latest version"); + System.Console.WriteLine(" -ios IOS The IOS you wish to download. This is an alternative to"); + System.Console.WriteLine(" '-id', use one or the other, but not both."); System.Console.WriteLine(" -o output Folder to output the files to"); System.Console.WriteLine(" -local Use local files if present"); System.Console.WriteLine(" -s content Download a single content from the file"); @@ -248,9 +344,9 @@ namespace Sharpii System.Console.WriteLine(" of the file you wish to download"); System.Console.WriteLine(" -wad Keep only the WAD version of the file you wish to"); System.Console.WriteLine(" download"); - System.Console.WriteLine(" -decrypt Keep only the Decrypted contents of the file you wish to"); + System.Console.WriteLine(" -decrypt Keep only the decrypted contents of the file you wish to"); System.Console.WriteLine(" download"); - System.Console.WriteLine(" -encrypt Keep only the Encrypted contents of the file you wish to"); + System.Console.WriteLine(" -encrypt Keep only the encrypted contents of the file you wish to"); System.Console.WriteLine(" download"); } } diff --git a/Sharpii/Program.cs b/Sharpii/Program.cs index 83a6a90..6e8f9da 100644 --- a/Sharpii/Program.cs +++ b/Sharpii/Program.cs @@ -12,11 +12,12 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with Sharpii. If not, see . + * along with Sharpii. If not, see . */ using System; using System.IO; +using System.Net; using libWiiSharp; namespace Sharpii @@ -34,7 +35,23 @@ namespace Sharpii if (!File.Exists("libWiiSharp.dll")) { System.Console.WriteLine("ERROR: libWiiSharp.dll not found"); - Environment.Exit(0); + System.Console.WriteLine("\n\nAttemp to download? [Y/N]"); + System.Console.Write("\n>>"); + string ans = Console.ReadLine(); + if (ans.ToUpper() == "Y") + { + try + { + Console.Write("\nGrabbing libWiiSharp.dll..."); + WebClient DLwadInstaller = new WebClient(); + DLwadInstaller.DownloadFile("http://sharpii.googlecode.com/svn/trunk/Sharpii/libWiiSharp.dll", "libWiiSharp.dll"); + Console.Write("Done!\n"); + } + catch (Exception ex) + { System.Console.WriteLine("An error occured: {0}", ex.Message); Environment.Exit(0); } + } + else + Environment.Exit(0); } for (int i = 1; i < args.Length; i++) @@ -54,59 +71,74 @@ namespace Sharpii } string Function = args[0]; + bool gotSomewhere = false; if (Function.ToUpper() == "-H" || Function.ToUpper() == "-HELP" || Function.ToUpper() == "H" || Function.ToUpper() == "HELP") { help(); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "BNS") { BNS_Stuff.BNS(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "WAD") { WAD_Stuff.WAD(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "TPL") { TPL_Stuff.TPL(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "U8") { U8_Stuff.U8(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "IOS") { IOS_Stuff.IOS(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "NUS" || Function.ToUpper() == "NUSD") { NUS_Stuff.NUS(args); - Environment.Exit(0); + gotSomewhere = true; } if (Function.ToUpper() == "SENDDOL" || Function.ToUpper() == "SENDOL") { HBC_Stuff.SendDol(args); - Environment.Exit(0); + gotSomewhere = true; + } + + if (Function.ToUpper() == "SENDWAD") + { + bool cont = HBC_Stuff.SendWad_Check(args); + if (cont == true) HBC_Stuff.SendWad(args); + gotSomewhere = true; } - //If tuser gets here, they entered something wrong - System.Console.WriteLine("ERROR: The argument {0} is invalid", args[0]); + if (gotSomewhere == false) + { + //If tuser gets here, they entered something wrong + System.Console.WriteLine("ERROR: The argument {0} is invalid", args[0]); + } + + string temp = Path.GetTempPath() + "Sharpii.tmp"; + if (Directory.Exists(temp) == true) + DeleteDir.DeleteDirectory(temp); Environment.Exit(0); } @@ -131,6 +163,7 @@ namespace Sharpii System.Console.WriteLine(" IOS Apply various patches to an IOS"); System.Console.WriteLine(" NUSD Download files from NUS"); System.Console.WriteLine(" SendDol Send a dol to the HBC over wifi"); + System.Console.WriteLine(" SendWad Send a wad to the HBC over wifi"); System.Console.WriteLine(""); System.Console.WriteLine(" NOTE: Too see more detailed descriptions of any of the above,"); System.Console.WriteLine(" use 'Sharpii [function] -h'"); @@ -180,5 +213,5 @@ namespace Sharpii } public class Version { - public static string version = "1.4"; + public static string version = "1.5"; } \ No newline at end of file diff --git a/Sharpii/README.txt b/Sharpii/README.txt index 13297cf..30f0e5f 100644 --- a/Sharpii/README.txt +++ b/Sharpii/README.txt @@ -1,5 +1,5 @@ /------------------------------------------------------------------------------> - Sharpii 1.4 + Sharpii 1.5 <----------------------------------------------------------------> An app by person66 libWiiSharp.dll by leathl (mod by scooby74029) @@ -18,7 +18,7 @@ libWiiSharp.dll to perform tasks such as: - Download files from NUS - Convert a .wav file to .bns, and vice versa - Convert an image file to a .tpl, and vice versa - - Send a .dol to the Homebrew Channel over Wi-Fi + - Send a .dol or .wad to the Homebrew Channel over Wi-Fi /----USAGE @@ -50,6 +50,13 @@ help with. Also note that When Downloading single contents, it will only save the decrypted file. + + If you wish to download the latest content, use '-v latest' instead of the + actual version number. + + If you have the output format set only to WAD, and your your output location + has '.wad' at the end, or you have not specified one, then instead of being + saved inside a folder, just the wad file will be saved. WAD Editing: /------------------> @@ -91,6 +98,11 @@ it borrows some code from some of the examples included with libWiiSharp. libWiiSharp can be found at: libwiisharp.googlecode.com +SendWad uses CRAP's installer by WiiCrazy/I.R.on, with any edits that leathl +may have made when adding it to CustomizeMii (which is where I got the source +from) + + I would also like to thank XFlak and JoostinOnline for doing a bit of beta testing for me. Thanks! @@ -105,6 +117,18 @@ See "LICENSE.txt" for more information. /----CHANGELOG /------------------------------> +1.5 + - Added the ability to send WADs to the HBC using SendWad + - You can now download an IOS with -ios # in NUSD + - Downloaded IOS wads are now namedlike so: IOS##-64-####.wad + - Under certain conditions, when downloading a wad with NUS, + it will not be saved in a folder, just as the WAD (see ReadMe) + - If missing dll's are detected (WadInstaller or libWiiSharp), + Sharpii will ask to download them, if they are required. + - You can now use a .dol file instead of a .wad with the '-dol' + in the WAD editor/packer + - Probably a few other little things I have forgotten + - Even more code cleanup and bug fixes 1.4 - Added the ability to send arguments in the SendDol function - Changed the way the SendDol function works a little diff --git a/Sharpii/Sharpii.csproj b/Sharpii/Sharpii.csproj index 23171e2..efb47ee 100644 --- a/Sharpii/Sharpii.csproj +++ b/Sharpii/Sharpii.csproj @@ -94,6 +94,12 @@ + + + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5} + WadInstaller + + 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 literal 0 HcmV?d00001 diff --git a/WadInstaller/WadInstaller.csproj b/WadInstaller/WadInstaller.csproj new file mode 100644 index 0000000..77b38ee --- /dev/null +++ b/WadInstaller/WadInstaller.csproj @@ -0,0 +1,58 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {475F3ADF-B529-449F-89DA-BA5E8BE15DD5} + Library + Properties + WadInstaller + WadInstaller + v2.0 + 512 + + + 3.5 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + AllRules.ruleset + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + AllRules.ruleset + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WadInstaller_Source/LICENSE.txt b/WadInstaller_Source/LICENSE.txt new file mode 100644 index 0000000..7e14f38 --- /dev/null +++ b/WadInstaller_Source/LICENSE.txt @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program 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 2 of the License, or + (at your option) any later version. + + This program 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, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. \ No newline at end of file diff --git a/WadInstaller_Source/Makefile b/WadInstaller_Source/Makefile new file mode 100644 index 0000000..7c18507 --- /dev/null +++ b/WadInstaller_Source/Makefile @@ -0,0 +1,139 @@ +#--------------------------------------------------------------------------------- +# Clear the implicit built in rules +#--------------------------------------------------------------------------------- +.SUFFIXES: +#--------------------------------------------------------------------------------- +#DEVKITPRO = /opt/devkitPPC +#DEVKITPPC = /opt/devkitPPC + +ifeq ($(strip $(DEVKITPPC)),) +$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=devkitPPC") +endif + +include $(DEVKITPPC)/wii_rules + +#--------------------------------------------------------------------------------- +# TARGET is the name of the output +# BUILD is the directory where object files & intermediate files will be placed +# SOURCES is a list of directories containing source code +# INCLUDES is a list of directories containing extra header files +#--------------------------------------------------------------------------------- +TARGET := WadInstaller +BUILD := build +SOURCES := source source/libpng source/libpng/pngu +DATA := data +INCLUDES := + +#--------------------------------------------------------------------------------- +# options for code generation +#--------------------------------------------------------------------------------- + +CFLAGS = -Os -Wall $(MACHDEP) $(INCLUDE) +CXXFLAGS = $(CFLAGS) + +LDFLAGS = $(MACHDEP) -Wl,-Map,$(notdir $@).map + +#--------------------------------------------------------------------------------- +# any extra libraries we wish to link with the project +#--------------------------------------------------------------------------------- +LIBS := -lpng -lfat -lwiiuse -lbte -logc -lm -lz + +#--------------------------------------------------------------------------------- +# list of directories containing libraries, this must be the top level containing +# include and lib +#--------------------------------------------------------------------------------- +LIBDIRS := $(CURDIR) + +#--------------------------------------------------------------------------------- +# no real need to edit anything past this point unless you need to add additional +# rules for different file extensions +#--------------------------------------------------------------------------------- +ifneq ($(BUILD),$(notdir $(CURDIR))) +#--------------------------------------------------------------------------------- + +export OUTPUT := $(CURDIR)/$(TARGET) + +export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \ + $(foreach dir,$(DATA),$(CURDIR)/$(dir)) + +export DEPSDIR := $(CURDIR)/$(BUILD) + +#--------------------------------------------------------------------------------- +# automatically build a list of object files for our project +#--------------------------------------------------------------------------------- +CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c))) +CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp))) +sFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s))) +SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S))) +BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*))) + +#--------------------------------------------------------------------------------- +# use CXX for linking C++ projects, CC for standard C +#--------------------------------------------------------------------------------- +ifeq ($(strip $(CPPFILES)),) + export LD := $(CC) +else + export LD := $(CXX) +endif + +export OFILES := $(addsuffix .o,$(BINFILES)) \ + $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) \ + $(sFILES:.s=.o) $(SFILES:.S=.o) + +#--------------------------------------------------------------------------------- +# build a list of include paths +#--------------------------------------------------------------------------------- +export INCLUDE := $(foreach dir,$(INCLUDES), -iquote $(CURDIR)/$(dir)) \ + $(foreach dir,$(LIBDIRS),-I$(dir)/include) \ + -I$(CURDIR)/$(BUILD) \ + -I$(LIBOGC_INC) + +#--------------------------------------------------------------------------------- +# build a list of library paths +#--------------------------------------------------------------------------------- +export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib) \ + -L$(LIBOGC_LIB) + +export OUTPUT := $(CURDIR)/$(TARGET) +.PHONY: $(BUILD) clean + +#--------------------------------------------------------------------------------- +$(BUILD): + @[ -d $@ ] || mkdir -p $@ + @make --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile + +#--------------------------------------------------------------------------------- +clean: + @echo clean ... + @rm -fr $(BUILD) $(OUTPUT).elf $(OUTPUT).dol + +#--------------------------------------------------------------------------------- +run: + wiiload $(TARGET).dol + + +#--------------------------------------------------------------------------------- +else + +DEPENDS := $(OFILES:.o=.d) + +#--------------------------------------------------------------------------------- +# main targets +#--------------------------------------------------------------------------------- +$(OUTPUT).dol: $(OUTPUT).elf +$(OUTPUT).elf: $(OFILES) + +#--------------------------------------------------------------------------------- +# This rule links in binary data with the .jpg extension +#--------------------------------------------------------------------------------- +%.jpg.o : %.jpg +#--------------------------------------------------------------------------------- + @echo $(notdir $<) + $(bin2o) + +-include $(DEPENDS) + +#--------------------------------------------------------------------------------- +endif +#--------------------------------------------------------------------------------- + diff --git a/WadInstaller_Source/README.Orig.es.txt b/WadInstaller_Source/README.Orig.es.txt new file mode 100644 index 0000000..d2d0dfe --- /dev/null +++ b/WadInstaller_Source/README.Orig.es.txt @@ -0,0 +1,43 @@ ++----------------------------+ +| WAD Manager v1.4 | +| developed by Waninkoko | ++----------------------------+ +| www.teknoconsolas.es | ++----------------------------+ + + +[ DISCLAIMER ]: + +- ESTA APLICACION VIENE SIN NINGUNA GARANTIA, EXPLICITA NI IMPLICITA. + NO ME HAGO RESPONSABLE POR CUALQUIER DAÑO EN TU CONSOLA WII DEBIDO A + UN USO NO APROPIADO DE ESTE SOFTWARE. + + +[ DESCRIPCION ]: + +- WAD Manager es una aplicacion que te permite (des)instalar paquetes WAD. + + La aplicacion muestra todos los paquetes WAD disponibles en un + dispositivo de almacenamiento para poder elegir cual (des)instalar. + + +[ DISPOSITIVOS SOPORTADOS ]: + +- SDGecko. +- Puerto SD interno (con soporte SDHC). +- Dispositivo USB (1.1 y 2.0). + + +[ COMO USARLO ]: + +1. Crea un directorio llamado "wad" en la raiz del dispositivo de almacenamiento. +2. Copia todos los paquetes WAD en el directorio creado en el paso 1. +3. Ejecuta la aplicacion con cualquier metodo para cargar homebrew. + + +[ KUDOS ]: + +- Team Twiizers/devkitPRO +- svpe +- kwiirk +- Todos mis betatesters. diff --git a/WadInstaller_Source/README.Orig.txt b/WadInstaller_Source/README.Orig.txt new file mode 100644 index 0000000..a01993a --- /dev/null +++ b/WadInstaller_Source/README.Orig.txt @@ -0,0 +1,44 @@ ++----------------------------+ +| WAD Manager v1.4 | +| developed by Waninkoko | ++----------------------------+ +| www.teknoconsolas.es | ++----------------------------+ + + +[ DISCLAIMER ]: + +- THIS APPLICATION COMES WITH NO WARRANTY AT ALL, NEITHER EXPRESS NOR IMPLIED. + I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE IN YOUR WII CONSOLE + BECAUSE OF A IMPROPER USAGE OF THIS SOFTWARE. + + +[ DESCRIPTION ]: + +- WAD Manager is an application that allows you to (un)install + WAD packages. + + It lists all the available WAD packages in a storage device + so you can select which one to (un)install. + + +[ SUPPORTED DEVICES ]: + +- SDGecko. +- Internal SD slot (with SDHC support). +- USB device (1.1 and 2.0). + + +[ HOW TO USE ]: + +1. Create a folder called "wad" in the root of the storage device. +2. Copy all the WAD packages in the folder created in the step 1. +3. Run the application with any method to load homebrew. + + +[ KUDOS ]: + +- Team Twiizers/devkitPRO +- svpe +- kwiirk +- All my betatesters. diff --git a/WadInstaller_Source/README.txt b/WadInstaller_Source/README.txt new file mode 100644 index 0000000..95b296e --- /dev/null +++ b/WadInstaller_Source/README.txt @@ -0,0 +1,4 @@ +Modified wad manager used to install wads. + +After compiling, search for text string AAAAAAAAAAAAAAAA in a hex editor +to find where to inject the wad (it should overwrite the A's, not go after them) \ No newline at end of file diff --git a/WadInstaller_Source/data/background b/WadInstaller_Source/data/background new file mode 100644 index 0000000000000000000000000000000000000000..22cb7b5f3b47bae646d29dcfb4d29e677be98044 GIT binary patch literal 125170 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 \ No newline at end of file diff --git a/WadInstaller_Source/installer.pnps b/WadInstaller_Source/installer.pnps new file mode 100644 index 0000000..c90d2ed --- /dev/null +++ b/WadInstaller_Source/installer.pnps @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/WadInstaller_Source/source/fat.c b/WadInstaller_Source/source/fat.c new file mode 100644 index 0000000..dfafa13 --- /dev/null +++ b/WadInstaller_Source/source/fat.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "fat.h" + + +s32 Fat_Mount(fatDevice *dev) +{ + s32 ret; + + /* Initialize interface */ + ret = dev->interface->startup(); + if (!ret) + return -1; + + /* Mount device */ + ret = fatMountSimple(dev->mount, dev->interface); + if (!ret) + return -1; + + return 0; +} + +void Fat_Unmount(fatDevice *dev) +{ + /* Unmount device */ + fatUnmount(dev->mount); + + /* Shutdown interface */ + dev->interface->shutdown(); +} + +char *Fat_ToFilename(const char *filename) +{ + static char buffer[128]; + + u32 cnt, idx, len; + + /* Clear buffer */ + memset(buffer, 0, sizeof(buffer)); + + /* Get filename length */ + len = strlen(filename); + + for (cnt = idx = 0; idx < len; idx++) { + char c = filename[idx]; + + /* Valid characters */ + if ( (c >= '#' && c <= ')') || (c >= '-' && c <= '.') || + (c >= '0' && c <= '9') || (c >= 'A' && c <= 'z') || + (c >= 'a' && c <= 'z') || (c == '!') ) + buffer[cnt++] = c; + } + + return buffer; +} diff --git a/WadInstaller_Source/source/fat.h b/WadInstaller_Source/source/fat.h new file mode 100644 index 0000000..1e5675e --- /dev/null +++ b/WadInstaller_Source/source/fat.h @@ -0,0 +1,41 @@ +#ifndef _FAT_H_ +#define _FAT_H_ + +/* libfat header */ +#include +#include + +/* SD headers */ +#include +#include + + +/* 'FAT Device' structure */ +typedef struct { + /* Device mount point */ + char *mount; + + /* Device name */ + char *name; + + /* Device interface */ + const DISC_INTERFACE *interface; +} fatDevice; + +/* 'FAT File' structure */ +typedef struct { + /* Filename */ + char filename[128]; + + /* Filestat */ + struct stat filestat; +} fatFile; + + +/* Prototypes */ +s32 Fat_Mount(fatDevice *); +void Fat_Unmount(fatDevice *); +char *Fat_ToFilename(const char *); + +#endif + diff --git a/WadInstaller_Source/source/gui.c b/WadInstaller_Source/source/gui.c new file mode 100644 index 0000000..f2e0631 --- /dev/null +++ b/WadInstaller_Source/source/gui.c @@ -0,0 +1,62 @@ +#include +#include +#include + +#include "video.h" + +/* Constants */ +#define CONSOLE_XCOORD 96 +#define CONSOLE_YCOORD 118 +#define CONSOLE_WIDTH 496 +#define CONSOLE_HEIGHT 236 + + +s32 __Gui_DrawPng(void *img, u32 x, u32 y) +{ + IMGCTX ctx = NULL; + PNGUPROP imgProp; + + s32 ret; + + /* Select PNG data */ + ctx = PNGU_SelectImageFromBuffer(img); + if (!ctx) { + ret = -1; + goto out; + } + + /* Get image properties */ + ret = PNGU_GetImageProperties(ctx, &imgProp); + if (ret != PNGU_OK) { + ret = -1; + goto out; + } + + /* Draw image */ + Video_DrawPng(ctx, imgProp, x, y); + + /* Success */ + ret = 0; + +out: + /* Free memory */ + if (ctx) + PNGU_ReleaseImageContext(ctx); + + return ret; +} + + +void Gui_InitConsole(void) +{ + /* Initialize console */ + Con_Init(CONSOLE_XCOORD, CONSOLE_YCOORD, CONSOLE_WIDTH, CONSOLE_HEIGHT); +} + +void Gui_DrawBackground(void) +{ + extern char bgData[]; + + /* Draw background */ + __Gui_DrawPng(bgData, 0, 0); +} diff --git a/WadInstaller_Source/source/gui.h b/WadInstaller_Source/source/gui.h new file mode 100644 index 0000000..80f174c --- /dev/null +++ b/WadInstaller_Source/source/gui.h @@ -0,0 +1,8 @@ +#ifndef _GUI_H_ +#define _GUI_H_ + +/* Prototypes */ +void Gui_InitConsole(void); +void Gui_DrawBackground(void); + +#endif diff --git a/WadInstaller_Source/source/install.c b/WadInstaller_Source/source/install.c new file mode 100644 index 0000000..bcd1d72 --- /dev/null +++ b/WadInstaller_Source/source/install.c @@ -0,0 +1,2 @@ +const unsigned char install[8<<20] = {0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0}; +const int install_size = sizeof(install); \ No newline at end of file diff --git a/WadInstaller_Source/source/install.h b/WadInstaller_Source/source/install.h new file mode 100644 index 0000000..3c1be35 --- /dev/null +++ b/WadInstaller_Source/source/install.h @@ -0,0 +1,14 @@ +/* + This file was autogenerated by raw2c. +Visit http://www.devkitpro.org +*/ + +//--------------------------------------------------------------------------------- +#ifndef _install_h_ +#define _install_h_ +//--------------------------------------------------------------------------------- +extern const unsigned char install[]; +extern const int install_size; +//--------------------------------------------------------------------------------- +#endif //_install_h_ +//--------------------------------------------------------------------------------- diff --git a/WadInstaller_Source/source/libpng/png.h b/WadInstaller_Source/source/libpng/png.h new file mode 100644 index 0000000..e0cec0c --- /dev/null +++ b/WadInstaller_Source/source/libpng/png.h @@ -0,0 +1,3569 @@ +/* png.h - header file for PNG reference library + * + * libpng version 1.2.29 - May 8, 2008 + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + * + * Authors and maintainers: + * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat + * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger + * libpng versions 0.97, January 1998, through 1.2.29 - May 8, 2008: Glenn + * See also "Contributing Authors", below. + * + * Note about libpng version numbers: + * + * Due to various miscommunications, unforeseen code incompatibilities + * and occasional factors outside the authors' control, version numbering + * on the library has not always been consistent and straightforward. + * The following table summarizes matters since version 0.89c, which was + * the first widely used release: + * + * source png.h png.h shared-lib + * version string int version + * ------- ------ ----- ---------- + * 0.89c "1.0 beta 3" 0.89 89 1.0.89 + * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] + * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] + * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] + * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] + * 0.97c 0.97 97 2.0.97 + * 0.98 0.98 98 2.0.98 + * 0.99 0.99 98 2.0.99 + * 0.99a-m 0.99 99 2.0.99 + * 1.00 1.00 100 2.1.0 [100 should be 10000] + * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] + * 1.0.1 png.h string is 10001 2.1.0 + * 1.0.1a-e identical to the 10002 from here on, the shared library + * 1.0.2 source version) 10002 is 2.V where V is the source code + * 1.0.2a-b 10003 version, except as noted. + * 1.0.3 10003 + * 1.0.3a-d 10004 + * 1.0.4 10004 + * 1.0.4a-f 10005 + * 1.0.5 (+ 2 patches) 10005 + * 1.0.5a-d 10006 + * 1.0.5e-r 10100 (not source compatible) + * 1.0.5s-v 10006 (not binary compatible) + * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) + * 1.0.6d-f 10007 (still binary incompatible) + * 1.0.6g 10007 + * 1.0.6h 10007 10.6h (testing xy.z so-numbering) + * 1.0.6i 10007 10.6i + * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) + * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) + * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) + * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) + * 1.0.7 1 10007 (still compatible) + * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 + * 1.0.8rc1 1 10008 2.1.0.8rc1 + * 1.0.8 1 10008 2.1.0.8 + * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 + * 1.0.9rc1 1 10009 2.1.0.9rc1 + * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 + * 1.0.9rc2 1 10009 2.1.0.9rc2 + * 1.0.9 1 10009 2.1.0.9 + * 1.0.10beta1 1 10010 2.1.0.10beta1 + * 1.0.10rc1 1 10010 2.1.0.10rc1 + * 1.0.10 1 10010 2.1.0.10 + * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 + * 1.0.11rc1 1 10011 2.1.0.11rc1 + * 1.0.11 1 10011 2.1.0.11 + * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 + * 1.0.12rc1 2 10012 2.1.0.12rc1 + * 1.0.12 2 10012 2.1.0.12 + * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) + * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 + * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 + * 1.2.0rc1 3 10200 3.1.2.0rc1 + * 1.2.0 3 10200 3.1.2.0 + * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 + * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 + * 1.2.1 3 10201 3.1.2.1 + * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 + * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 + * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 + * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 + * 1.0.13 10 10013 10.so.0.1.0.13 + * 1.2.2 12 10202 12.so.0.1.2.2 + * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 + * 1.2.3 12 10203 12.so.0.1.2.3 + * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 + * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 + * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 + * 1.0.14 10 10014 10.so.0.1.0.14 + * 1.2.4 13 10204 12.so.0.1.2.4 + * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 + * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 + * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 + * 1.0.15 10 10015 10.so.0.1.0.15 + * 1.2.5 13 10205 12.so.0.1.2.5 + * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 + * 1.0.16 10 10016 10.so.0.1.0.16 + * 1.2.6 13 10206 12.so.0.1.2.6 + * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 + * 1.0.17rc1 10 10017 10.so.0.1.0.17rc1 + * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 + * 1.0.17 10 10017 10.so.0.1.0.17 + * 1.2.7 13 10207 12.so.0.1.2.7 + * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 + * 1.0.18rc1-5 10 10018 10.so.0.1.0.18rc1-5 + * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 + * 1.0.18 10 10018 10.so.0.1.0.18 + * 1.2.8 13 10208 12.so.0.1.2.8 + * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 + * 1.2.9beta4-11 13 10209 12.so.0.9[.0] + * 1.2.9rc1 13 10209 12.so.0.9[.0] + * 1.2.9 13 10209 12.so.0.9[.0] + * 1.2.10beta1-8 13 10210 12.so.0.10[.0] + * 1.2.10rc1-3 13 10210 12.so.0.10[.0] + * 1.2.10 13 10210 12.so.0.10[.0] + * 1.2.11beta1-4 13 10211 12.so.0.11[.0] + * 1.0.19rc1-5 10 10019 10.so.0.19[.0] + * 1.2.11rc1-5 13 10211 12.so.0.11[.0] + * 1.0.19 10 10019 10.so.0.19[.0] + * 1.2.11 13 10211 12.so.0.11[.0] + * 1.0.20 10 10020 10.so.0.20[.0] + * 1.2.12 13 10212 12.so.0.12[.0] + * 1.2.13beta1 13 10213 12.so.0.13[.0] + * 1.0.21 10 10021 10.so.0.21[.0] + * 1.2.13 13 10213 12.so.0.13[.0] + * 1.2.14beta1-2 13 10214 12.so.0.14[.0] + * 1.0.22rc1 10 10022 10.so.0.22[.0] + * 1.2.14rc1 13 10214 12.so.0.14[.0] + * 1.0.22 10 10022 10.so.0.22[.0] + * 1.2.14 13 10214 12.so.0.14[.0] + * 1.2.15beta1-6 13 10215 12.so.0.15[.0] + * 1.0.23rc1-5 10 10023 10.so.0.23[.0] + * 1.2.15rc1-5 13 10215 12.so.0.15[.0] + * 1.0.23 10 10023 10.so.0.23[.0] + * 1.2.15 13 10215 12.so.0.15[.0] + * 1.2.16beta1-2 13 10216 12.so.0.16[.0] + * 1.2.16rc1 13 10216 12.so.0.16[.0] + * 1.0.24 10 10024 10.so.0.24[.0] + * 1.2.16 13 10216 12.so.0.16[.0] + * 1.2.17beta1-2 13 10217 12.so.0.17[.0] + * 1.0.25rc1 10 10025 10.so.0.25[.0] + * 1.2.17rc1-3 13 10217 12.so.0.17[.0] + * 1.0.25 10 10025 10.so.0.25[.0] + * 1.2.17 13 10217 12.so.0.17[.0] + * 1.0.26 10 10026 10.so.0.26[.0] + * 1.2.18 13 10218 12.so.0.18[.0] + * 1.2.19beta1-31 13 10219 12.so.0.19[.0] + * 1.0.27rc1-6 10 10027 10.so.0.27[.0] + * 1.2.19rc1-6 13 10219 12.so.0.19[.0] + * 1.0.27 10 10027 10.so.0.27[.0] + * 1.2.19 13 10219 12.so.0.19[.0] + * 1.2.20beta01-04 13 10220 12.so.0.20[.0] + * 1.0.28rc1-6 10 10028 10.so.0.28[.0] + * 1.2.20rc1-6 13 10220 12.so.0.20[.0] + * 1.0.28 10 10028 10.so.0.28[.0] + * 1.2.20 13 10220 12.so.0.20[.0] + * 1.2.21beta1-2 13 10221 12.so.0.21[.0] + * 1.2.21rc1-3 13 10221 12.so.0.21[.0] + * 1.0.29 10 10029 10.so.0.29[.0] + * 1.2.21 13 10221 12.so.0.21[.0] + * 1.2.22beta1-4 13 10222 12.so.0.22[.0] + * 1.0.30rc1 10 10030 10.so.0.30[.0] + * 1.2.22rc1 13 10222 12.so.0.22[.0] + * 1.0.30 10 10030 10.so.0.30[.0] + * 1.2.22 13 10222 12.so.0.22[.0] + * 1.2.23beta01-05 13 10223 12.so.0.23[.0] + * 1.2.23rc01 13 10223 12.so.0.23[.0] + * 1.2.23 13 10223 12.so.0.23[.0] + * 1.2.24beta01-02 13 10224 12.so.0.24[.0] + * 1.2.24rc01 13 10224 12.so.0.24[.0] + * 1.2.24 13 10224 12.so.0.24[.0] + * 1.2.25beta01-06 13 10225 12.so.0.25[.0] + * 1.2.25rc01-02 13 10225 12.so.0.25[.0] + * 1.0.31 10 10031 10.so.0.31[.0] + * 1.2.25 13 10225 12.so.0.25[.0] + * 1.2.26beta01-06 13 10226 12.so.0.26[.0] + * 1.2.26rc01 13 10226 12.so.0.26[.0] + * 1.2.26 13 10226 12.so.0.26[.0] + * 1.0.32 10 10032 10.so.0.32[.0] + * 1.2.27beta01-06 13 10227 12.so.0.27[.0] + * 1.2.27rc01 13 10227 12.so.0.27[.0] + * 1.0.33 10 10033 10.so.0.33[.0] + * 1.2.27 13 10227 12.so.0.27[.0] + * 1.0.34 10 10034 10.so.0.34[.0] + * 1.2.28 13 10228 12.so.0.28[.0] + * 1.2.29beta01-03 13 10229 12.so.0.29[.0] + * 1.2.29rc01 13 10229 12.so.0.29[.0] + * 1.0.35 10 10035 10.so.0.35[.0] + * 1.2.29 13 10229 12.so.0.29[.0] + * + * Henceforth the source version will match the shared-library major + * and minor numbers; the shared-library major version number will be + * used for changes in backward compatibility, as it is intended. The + * PNG_LIBPNG_VER macro, which is not used within libpng but is available + * for applications, is an unsigned integer of the form xyyzz corresponding + * to the source version x.y.z (leading zeros in y and z). Beta versions + * were given the previous public release number plus a letter, until + * version 1.0.6j; from then on they were given the upcoming public + * release number plus "betaNN" or "rcNN". + * + * Binary incompatibility exists only when applications make direct access + * to the info_ptr or png_ptr members through png.h, and the compiled + * application is loaded with a different version of the library. + * + * DLLNUM will change each time there are forward or backward changes + * in binary compatibility (e.g., when a new feature is added). + * + * See libpng.txt or libpng.3 for more information. The PNG specification + * is available as a W3C Recommendation and as an ISO Specification, + * defines should NOT be changed. + */ +#define PNG_INFO_gAMA 0x0001 +#define PNG_INFO_sBIT 0x0002 +#define PNG_INFO_cHRM 0x0004 +#define PNG_INFO_PLTE 0x0008 +#define PNG_INFO_tRNS 0x0010 +#define PNG_INFO_bKGD 0x0020 +#define PNG_INFO_hIST 0x0040 +#define PNG_INFO_pHYs 0x0080 +#define PNG_INFO_oFFs 0x0100 +#define PNG_INFO_tIME 0x0200 +#define PNG_INFO_pCAL 0x0400 +#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ +#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ +#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ +#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ +#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */ + +/* This is used for the transformation routines, as some of them + * change these values for the row. It also should enable using + * the routines for other purposes. + */ +typedef struct png_row_info_struct +{ + png_uint_32 width; /* width of row */ + png_uint_32 rowbytes; /* number of bytes in row */ + png_byte color_type; /* color type of row */ + png_byte bit_depth; /* bit depth of row */ + png_byte channels; /* number of channels (1, 2, 3, or 4) */ + png_byte pixel_depth; /* bits per pixel (depth * channels) */ +} png_row_info; + +typedef png_row_info FAR * png_row_infop; +typedef png_row_info FAR * FAR * png_row_infopp; + +/* These are the function types for the I/O functions and for the functions + * that allow the user to override the default I/O functions with his or her + * own. The png_error_ptr type should match that of user-supplied warning + * and error functions, while the png_rw_ptr type should match that of the + * user read/write data functions. + */ +typedef struct png_struct_def png_struct; +typedef png_struct FAR * png_structp; + +typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp)); +typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t)); +typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp)); +typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32, + int)); +typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32, + int)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop)); +typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep, + png_uint_32, int)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp, + png_row_infop, png_bytep)); +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) +typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp)); +#endif +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp)); +#endif + +/* Transform masks for the high-level interface */ +#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ +#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ +#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ +#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ +#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ +#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ +#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ +#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ +#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ +#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ +#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ +#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ +#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */ + +/* Flags for MNG supported features */ +#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 +#define PNG_FLAG_MNG_FILTER_64 0x04 +#define PNG_ALL_MNG_FEATURES 0x05 + +typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t)); +typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp)); + +/* The structure that holds the information to read and write PNG files. + * The only people who need to care about what is inside of this are the + * people who will be modifying the library for their own special needs. + * It should NOT be accessed directly by an application, except to store + * the jmp_buf. + */ + +struct png_struct_def +{ +#ifdef PNG_SETJMP_SUPPORTED + jmp_buf jmpbuf; /* used in png_error */ +#endif + png_error_ptr error_fn; /* function for printing errors and aborting */ + png_error_ptr warning_fn; /* function for printing warnings */ + png_voidp error_ptr; /* user supplied struct for error functions */ + png_rw_ptr write_data_fn; /* function for writing output data */ + png_rw_ptr read_data_fn; /* function for reading input data */ + png_voidp io_ptr; /* ptr to application struct for I/O functions */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr read_user_transform_fn; /* user read transform */ +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_user_transform_ptr write_user_transform_fn; /* user write transform */ +#endif + +/* These were added in libpng-1.0.2 */ +#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) + png_voidp user_transform_ptr; /* user supplied struct for user transform */ + png_byte user_transform_depth; /* bit depth of user transformed pixels */ + png_byte user_transform_channels; /* channels in user transformed pixels */ +#endif +#endif + + png_uint_32 mode; /* tells us where we are in the PNG file */ + png_uint_32 flags; /* flags indicating various things to libpng */ + png_uint_32 transformations; /* which transformations to perform */ + + z_stream zstream; /* pointer to decompression structure (below) */ + png_bytep zbuf; /* buffer for zlib */ + png_size_t zbuf_size; /* size of zbuf */ + int zlib_level; /* holds zlib compression level */ + int zlib_method; /* holds zlib compression method */ + int zlib_window_bits; /* holds zlib compression window bits */ + int zlib_mem_level; /* holds zlib compression memory level */ + int zlib_strategy; /* holds zlib compression strategy */ + + png_uint_32 width; /* width of image in pixels */ + png_uint_32 height; /* height of image in pixels */ + png_uint_32 num_rows; /* number of rows in current pass */ + png_uint_32 usr_width; /* width of row at start of write */ + png_uint_32 rowbytes; /* size of row in bytes */ + png_uint_32 irowbytes; /* size of current interlaced row in bytes */ + png_uint_32 iwidth; /* width of current interlaced row in pixels */ + png_uint_32 row_number; /* current row in interlace pass */ + png_bytep prev_row; /* buffer to save previous (unfiltered) row */ + png_bytep row_buf; /* buffer to save current (unfiltered) row */ +#ifndef PNG_NO_WRITE_FILTERING + png_bytep sub_row; /* buffer to save "sub" row when filtering */ + png_bytep up_row; /* buffer to save "up" row when filtering */ + png_bytep avg_row; /* buffer to save "avg" row when filtering */ + png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */ +#endif + png_row_info row_info; /* used for transformation routines */ + + png_uint_32 idat_size; /* current IDAT size for read */ + png_uint_32 crc; /* current chunk CRC value */ + png_colorp palette; /* palette from the input file */ + png_uint_16 num_palette; /* number of color entries in palette */ + png_uint_16 num_trans; /* number of transparency values */ + png_byte chunk_name[5]; /* null-terminated name of current chunk */ + png_byte compression; /* file compression type (always 0) */ + png_byte filter; /* file filter type (always 0) */ + png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */ + png_byte pass; /* current interlace pass (0 - 6) */ + png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */ + png_byte color_type; /* color type of file */ + png_byte bit_depth; /* bit depth of file */ + png_byte usr_bit_depth; /* bit depth of users row */ + png_byte pixel_depth; /* number of bits per pixel */ + png_byte channels; /* number of channels in file */ + png_byte usr_channels; /* channels at start of write */ + png_byte sig_bytes; /* magic bytes read/written from start of file */ + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +#ifdef PNG_LEGACY_SUPPORTED + png_byte filler; /* filler byte for pixel expansion */ +#else + png_uint_16 filler; /* filler bytes for pixel expansion */ +#endif +#endif + +#if defined(PNG_bKGD_SUPPORTED) + png_byte background_gamma_type; +# ifdef PNG_FLOATING_POINT_SUPPORTED + float background_gamma; +# endif + png_color_16 background; /* background color in screen gamma space */ +#if defined(PNG_READ_GAMMA_SUPPORTED) + png_color_16 background_1; /* background normalized to gamma 1.0 */ +#endif +#endif /* PNG_bKGD_SUPPORTED */ + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) + png_flush_ptr output_flush_fn;/* Function for flushing output */ + png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */ + png_uint_32 flush_rows; /* number of rows written since last flush */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + int gamma_shift; /* number of "insignificant" bits 16-bit gamma */ +#ifdef PNG_FLOATING_POINT_SUPPORTED + float gamma; /* file gamma value */ + float screen_gamma; /* screen gamma value (display_exponent) */ +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep gamma_table; /* gamma table for 8-bit depth files */ + png_bytep gamma_from_1; /* converts from 1.0 to screen */ + png_bytep gamma_to_1; /* converts from file to 1.0 */ + png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */ + png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */ + png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */ +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED) + png_color_8 sig_bit; /* significant bits in each available channel */ +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) + png_color_8 shift; /* shift for significant bit tranformation */ +#endif + +#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \ + || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_bytep trans; /* transparency values for paletted files */ + png_color_16 trans_values; /* transparency values for non-paletted files */ +#endif + + png_read_status_ptr read_row_fn; /* called after each row is decoded */ + png_write_status_ptr write_row_fn; /* called after each row is encoded */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED + png_progressive_info_ptr info_fn; /* called after header data fully read */ + png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */ + png_progressive_end_ptr end_fn; /* called after image is complete */ + png_bytep save_buffer_ptr; /* current location in save_buffer */ + png_bytep save_buffer; /* buffer for previously read data */ + png_bytep current_buffer_ptr; /* current location in current_buffer */ + png_bytep current_buffer; /* buffer for recently used data */ + png_uint_32 push_length; /* size of current input chunk */ + png_uint_32 skip_length; /* bytes to skip in input data */ + png_size_t save_buffer_size; /* amount of data now in save_buffer */ + png_size_t save_buffer_max; /* total size of save_buffer */ + png_size_t buffer_size; /* total amount of available input data */ + png_size_t current_buffer_size; /* amount of data now in current_buffer */ + int process_mode; /* what push library is currently doing */ + int cur_palette; /* current push library palette index */ + +# if defined(PNG_TEXT_SUPPORTED) + png_size_t current_text_size; /* current size of text input data */ + png_size_t current_text_left; /* how much text left to read in input */ + png_charp current_text; /* current text chunk buffer */ + png_charp current_text_ptr; /* current location in current_text */ +# endif /* PNG_TEXT_SUPPORTED */ +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__) +/* for the Borland special 64K segment handler */ + png_bytepp offset_table_ptr; + png_bytep offset_table; + png_uint_16 offset_table_number; + png_uint_16 offset_table_count; + png_uint_16 offset_table_count_free; +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) + png_bytep palette_lookup; /* lookup table for dithering */ + png_bytep dither_index; /* index translation for palette files */ +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED) + png_uint_16p hist; /* histogram */ +#endif + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) + png_byte heuristic_method; /* heuristic for row filter selection */ + png_byte num_prev_filters; /* number of weights for previous rows */ + png_bytep prev_filters; /* filter type(s) of previous row(s) */ + png_uint_16p filter_weights; /* weight(s) for previous line(s) */ + png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */ + png_uint_16p filter_costs; /* relative filter calculation cost */ + png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */ +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) + png_charp time_buffer; /* String to hold RFC 1123 time text */ +#endif + +/* New members added in libpng-1.0.6 */ + +#ifdef PNG_FREE_ME_SUPPORTED + png_uint_32 free_me; /* flags items libpng is responsible for freeing */ +#endif + +#if defined(PNG_USER_CHUNKS_SUPPORTED) + png_voidp user_chunk_ptr; + png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */ +#endif + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + int num_chunk_list; + png_bytep chunk_list; +#endif + +/* New members added in libpng-1.0.3 */ +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) + png_byte rgb_to_gray_status; + /* These were changed from png_byte in libpng-1.0.6 */ + png_uint_16 rgb_to_gray_red_coeff; + png_uint_16 rgb_to_gray_green_coeff; + png_uint_16 rgb_to_gray_blue_coeff; +#endif + +/* New member added in libpng-1.0.4 (renamed in 1.0.9) */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) || \ + defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* changed from png_byte to png_uint_32 at version 1.2.0 */ +#ifdef PNG_1_0_X + png_byte mng_features_permitted; +#else + png_uint_32 mng_features_permitted; +#endif /* PNG_1_0_X */ +#endif + +/* New member added in libpng-1.0.7 */ +#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) + png_fixed_point int_gamma; +#endif + +/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */ +#if defined(PNG_MNG_FEATURES_SUPPORTED) + png_byte filter_type; +#endif + +#if defined(PNG_1_0_X) +/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */ + png_uint_32 row_buf_size; +#endif + +/* New members added in libpng-1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +# if !defined(PNG_1_0_X) +# if defined(PNG_MMX_CODE_SUPPORTED) + png_byte mmx_bitdepth_threshold; + png_uint_32 mmx_rowbytes_threshold; +# endif + png_uint_32 asm_flags; +# endif +#endif + +/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */ +#ifdef PNG_USER_MEM_SUPPORTED + png_voidp mem_ptr; /* user supplied struct for mem functions */ + png_malloc_ptr malloc_fn; /* function for allocating memory */ + png_free_ptr free_fn; /* function for freeing memory */ +#endif + +/* New member added in libpng-1.0.13 and 1.2.0 */ + png_bytep big_row_buf; /* buffer to save current (unfiltered) row */ + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* The following three members were added at version 1.0.14 and 1.2.4 */ + png_bytep dither_sort; /* working sort array */ + png_bytep index_to_palette; /* where the original index currently is */ + /* in the palette */ + png_bytep palette_to_index; /* which original index points to this */ + /* palette color */ +#endif + +/* New members added in libpng-1.0.16 and 1.2.6 */ + png_byte compression_type; + +#ifdef PNG_SET_USER_LIMITS_SUPPORTED + png_uint_32 user_width_max; + png_uint_32 user_height_max; +#endif + +/* New member added in libpng-1.0.25 and 1.2.17 */ +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) + /* storage for unknown chunk that the library doesn't recognize. */ + png_unknown_chunk unknown_chunk; +#endif + +/* New members added in libpng-1.2.26 */ + png_uint_32 old_big_row_buf_size, old_prev_row_size; +}; + + +/* This triggers a compiler error in png.c, if png.c and png.h + * do not agree upon the version number. + */ +typedef png_structp version_1_2_29; + +typedef png_struct FAR * FAR * png_structpp; + +/* Here are the function definitions most commonly used. This is not + * the place to find out how to use libpng. See libpng.txt for the + * full explanation, see example.c for the summary. This just provides + * a simple one line description of the use of each function. + */ + +/* Returns the version number of the library */ +extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void)); + +/* Tell lib we have already handled the first magic bytes. + * Handling more than 8 bytes from the beginning of the file is an error. + */ +extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr, + int num_bytes)); + +/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a + * PNG file. Returns zero if the supplied bytes match the 8-byte PNG + * signature, and non-zero otherwise. Having num_to_check == 0 or + * start > 7 will always fail (ie return non-zero). + */ +extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start, + png_size_t num_to_check)); + +/* Simple signature checking function. This is the same as calling + * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). + */ +extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num)); + +/* Allocate and initialize png_ptr struct for reading, and any other memory. */ +extern PNG_EXPORT(png_structp,png_create_read_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +/* Allocate and initialize png_ptr struct for writing, and any other memory */ +extern PNG_EXPORT(png_structp,png_create_write_struct) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn)); + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_WRITE_SUPPORTED +extern PNG_EXPORT(void,png_set_compression_buffer_size) + PNGARG((png_structp png_ptr, png_uint_32 size)); +#endif + +/* Reset the compression stream */ +extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr)); + +/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_structp,png_create_read_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +extern PNG_EXPORT(png_structp,png_create_write_struct_2) + PNGARG((png_const_charp user_png_ver, png_voidp error_ptr, + png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr, + png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +#endif + +/* Write a PNG chunk - size, type, (optional) data, CRC. */ +extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_bytep data, png_size_t length)); + +/* Write the start of a PNG chunk - length and chunk name. */ +extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr, + png_bytep chunk_name, png_uint_32 length)); + +/* Write the data of a PNG chunk started with png_write_chunk_start(). */ +extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ +extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr)); + +/* Allocate and initialize the info structure */ +extern PNG_EXPORT(png_infop,png_create_info_struct) + PNGARG((png_structp png_ptr)); + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize the info structure (old interface - DEPRECATED) */ +extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr)); +#undef png_info_init +#define png_info_init(info_ptr) png_info_init_3(&info_ptr,\ + png_sizeof(png_info)); +#endif + +extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr, + png_size_t png_info_struct_size)); + +/* Writes all the PNG information before the image. */ +extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the information before the actual image data. */ +extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#if defined(PNG_TIME_RFC1123_SUPPORTED) +extern PNG_EXPORT(png_charp,png_convert_to_rfc1123) + PNGARG((png_structp png_ptr, png_timep ptime)); +#endif + +#if !defined(_WIN32_WCE) +/* "time.h" functions are not supported on WindowsCE */ +#if defined(PNG_WRITE_tIME_SUPPORTED) +/* convert from a struct tm to png_time */ +extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime, + struct tm FAR * ttime)); + +/* convert from time_t to png_time. Uses gmtime() */ +extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime, + time_t ttime)); +#endif /* PNG_WRITE_tIME_SUPPORTED */ +#endif /* _WIN32_WCE */ + +#if defined(PNG_READ_EXPAND_SUPPORTED) +/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ +extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr)); +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_expand_gray_1_2_4_to_8) PNGARG((png_structp + png_ptr)); +#endif +extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated */ +extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +/* Use blue, green, red order for pixels. */ +extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +/* Expand the grayscale to 24-bit RGB if necessary. */ +extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +/* Reduce RGB to grayscale. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr, + int error_action, double red, double green )); +#endif +extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr, + int error_action, png_fixed_point red, png_fixed_point green )); +extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp + png_ptr)); +#endif + +extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth, + png_colorp palette)); + +#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ + defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) +/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ +extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +/* The values of the PNG_FILLER_ defines should NOT be changed */ +#define PNG_FILLER_BEFORE 0 +#define PNG_FILLER_AFTER 1 +/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ +#if !defined(PNG_1_0_X) +extern PNG_EXPORT(void,png_set_add_alpha) PNGARG((png_structp png_ptr, + png_uint_32 filler, int flags)); +#endif +#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */ + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +/* Swap bytes in 16-bit depth files. */ +extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) +/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ +extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +/* Swap packing order of pixels in bytes. */ +extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) +/* Converts files to legal bit depths. */ +extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr, + png_color_8p true_bits)); +#endif + +#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ + defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* Have the code handle the interlacing. Returns the number of passes. */ +extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +/* Invert monochrome files */ +extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +/* Handle alpha and tRNS by replacing with a background color. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr, + png_color_16p background_color, int background_gamma_code, + int need_expand, double background_gamma)); +#endif +#define PNG_BACKGROUND_GAMMA_UNKNOWN 0 +#define PNG_BACKGROUND_GAMMA_SCREEN 1 +#define PNG_BACKGROUND_GAMMA_FILE 2 +#define PNG_BACKGROUND_GAMMA_UNIQUE 3 +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +/* strip the second byte of information from a 16-bit depth file. */ +extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +/* Turn on dithering, and reduce the palette to the number of colors available. */ +extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette, int maximum_colors, + png_uint_16p histogram, int full_dither)); +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +/* Handle gamma correction. Screen_gamma=(display_exponent) */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr, + double screen_gamma, double default_file_gamma)); +#endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \ + defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) +/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */ +/* Deprecated and will be removed. Use png_permit_mng_features() instead. */ +extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr, + int empty_plte_permitted)); +#endif +#endif + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +/* Set how many lines between output flushes - 0 for no flushing */ +extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows)); +/* Flush the current PNG output buffer */ +extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr)); +#endif + +/* optional update palette with requested transformations */ +extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr)); + +/* optional call to update the users info structure */ +extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read one or more rows of image data. */ +extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_bytepp display_row, png_uint_32 num_rows)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read a row of data. */ +extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr, + png_bytep row, + png_bytep display_row)); +#endif + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the whole image into memory at once. */ +extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr, + png_bytepp image)); +#endif + +/* write a row of image data */ +extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr, + png_bytep row)); + +/* write a few rows of image data */ +extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr, + png_bytepp row, png_uint_32 num_rows)); + +/* write the image data */ +extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr, + png_bytepp image)); + +/* writes the end of the PNG file. */ +extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_NO_SEQUENTIAL_READ_SUPPORTED +/* read the end of the PNG file. */ +extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +/* free any memory associated with the png_info_struct */ +extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr, + png_infopp info_ptr_ptr)); + +/* free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp + png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); + +/* free all memory used by the read (old method - NOT DLL EXPORTED) */ +extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr, + png_infop end_info_ptr)); + +/* free any memory associated with the png_struct and the png_info_structs */ +extern PNG_EXPORT(void,png_destroy_write_struct) + PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)); + +/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */ +extern void png_write_destroy PNGARG((png_structp png_ptr)); + +/* set the libpng method of handling chunk CRC errors */ +extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr, + int crit_action, int ancil_action)); + +/* Values for png_set_crc_action() to say how to handle CRC errors in + * ancillary and critical chunks, and whether to use the data contained + * therein. Note that it is impossible to "discard" data in a critical + * chunk. For versions prior to 0.90, the action was always error/quit, + * whereas in version 0.90 and later, the action for CRC errors in ancillary + * chunks is warn/discard. These values should NOT be changed. + * + * value action:critical action:ancillary + */ +#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ +#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ +#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ +#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ +#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ +#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ + +/* These functions give the user control over the scan-line filtering in + * libpng and the compression methods used by zlib. These functions are + * mainly useful for testing, as the defaults should work with most users. + * Those users who are tight on memory or want faster performance at the + * expense of compression can modify them. See the compression library + * header file (zlib.h) for an explination of the compression functions. + */ + +/* set the filtering method(s) used by libpng. Currently, the only valid + * value for "method" is 0. + */ +extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method, + int filters)); + +/* Flags for png_set_filter() to say which filters to use. The flags + * are chosen so that they don't conflict with real filter types + * below, in case they are supplied instead of the #defined constants. + * These values should NOT be changed. + */ +#define PNG_NO_FILTERS 0x00 +#define PNG_FILTER_NONE 0x08 +#define PNG_FILTER_SUB 0x10 +#define PNG_FILTER_UP 0x20 +#define PNG_FILTER_AVG 0x40 +#define PNG_FILTER_PAETH 0x80 +#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ + PNG_FILTER_AVG | PNG_FILTER_PAETH) + +/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. + * These defines should NOT be changed. + */ +#define PNG_FILTER_VALUE_NONE 0 +#define PNG_FILTER_VALUE_SUB 1 +#define PNG_FILTER_VALUE_UP 2 +#define PNG_FILTER_VALUE_AVG 3 +#define PNG_FILTER_VALUE_PAETH 4 +#define PNG_FILTER_VALUE_LAST 5 + +#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */ +/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_ + * defines, either the default (minimum-sum-of-absolute-differences), or + * the experimental method (weighted-minimum-sum-of-absolute-differences). + * + * Weights are factors >= 1.0, indicating how important it is to keep the + * filter type consistent between rows. Larger numbers mean the current + * filter is that many times as likely to be the same as the "num_weights" + * previous filters. This is cumulative for each previous row with a weight. + * There needs to be "num_weights" values in "filter_weights", or it can be + * NULL if the weights aren't being specified. Weights have no influence on + * the selection of the first row filter. Well chosen weights can (in theory) + * improve the compression for a given image. + * + * Costs are factors >= 1.0 indicating the relative decoding costs of a + * filter type. Higher costs indicate more decoding expense, and are + * therefore less likely to be selected over a filter with lower computational + * costs. There needs to be a value in "filter_costs" for each valid filter + * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't + * setting the costs. Costs try to improve the speed of decompression without + * unduly increasing the compressed image size. + * + * A negative weight or cost indicates the default value is to be used, and + * values in the range [0.0, 1.0) indicate the value is to remain unchanged. + * The default values for both weights and costs are currently 1.0, but may + * change if good general weighting/cost heuristics can be found. If both + * the weights and costs are set to 1.0, this degenerates the WEIGHTED method + * to the UNWEIGHTED method, but with added encoding time/computation. + */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr, + int heuristic_method, int num_weights, png_doublep filter_weights, + png_doublep filter_costs)); +#endif +#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */ + +/* Heuristic used for row filter selection. These defines should NOT be + * changed. + */ +#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ +#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ +#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ +#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ + +/* Set the library compression level. Currently, valid values range from + * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 + * (0 - no compression, 9 - "maximal" compression). Note that tests have + * shown that zlib compression levels 3-6 usually perform as well as level 9 + * for PNG images, and do considerably fewer caclulations. In the future, + * these values may not correspond directly to the zlib compression levels. + */ +extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr, + int level)); + +extern PNG_EXPORT(void,png_set_compression_mem_level) + PNGARG((png_structp png_ptr, int mem_level)); + +extern PNG_EXPORT(void,png_set_compression_strategy) + PNGARG((png_structp png_ptr, int strategy)); + +extern PNG_EXPORT(void,png_set_compression_window_bits) + PNGARG((png_structp png_ptr, int window_bits)); + +extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr, + int method)); + +/* These next functions are called for input/output, memory, and error + * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, + * and call standard C I/O routines such as fread(), fwrite(), and + * fprintf(). These functions can be made to use other I/O routines + * at run time for those applications that need to handle I/O in a + * different manner by calling png_set_???_fn(). See libpng.txt for + * more information. + */ + +#if !defined(PNG_NO_STDIO) +/* Initialize the input/output for the PNG file to the default functions. */ +extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp)); +#endif + +/* Replace the (error and abort), and warning functions with user + * supplied functions. If no messages are to be printed you must still + * write and use replacement functions. The replacement error_fn should + * still do a longjmp to the last setjmp location if you are using this + * method of error handling. If error_fn or warning_fn is NULL, the + * default function will be used. + */ + +extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr, + png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); + +/* Return the user pointer associated with the error functions */ +extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr)); + +/* Replace the default data output functions with a user supplied one(s). + * If buffered output is not used, then output_flush_fn can be set to NULL. + * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time + * output_flush_fn will be ignored (and thus can be NULL). + */ +extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); + +/* Replace the default data input function with a user supplied one. */ +extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr, + png_voidp io_ptr, png_rw_ptr read_data_fn)); + +/* Return the user pointer associated with the I/O functions */ +extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr)); + +extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr, + png_read_status_ptr read_row_fn)); + +extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr, + png_write_status_ptr write_row_fn)); + +#ifdef PNG_USER_MEM_SUPPORTED +/* Replace the default memory allocation functions with user supplied one(s). */ +extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr, + png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn)); +/* Return the user pointer associated with the memory functions */ +extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr read_user_transform_fn)); +#endif + +#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp + png_ptr, png_user_transform_ptr write_user_transform_fn)); +#endif + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_LEGACY_SUPPORTED) +extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp + png_ptr, png_voidp user_transform_ptr, int user_transform_depth, + int user_transform_channels)); +/* Return the user pointer associated with the user transform functions */ +extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr) + PNGARG((png_structp png_ptr)); +#endif + +#ifdef PNG_USER_CHUNKS_SUPPORTED +extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr, + png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); +extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp + png_ptr)); +#endif + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +/* Sets the function callbacks for the push reader, and a pointer to a + * user-defined structure available to the callback functions. + */ +extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr, + png_voidp progressive_ptr, + png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn, + png_progressive_end_ptr end_fn)); + +/* returns the user pointer associated with the push read functions */ +extern PNG_EXPORT(png_voidp,png_get_progressive_ptr) + PNGARG((png_structp png_ptr)); + +/* function to be called when data becomes available */ +extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep buffer, png_size_t buffer_size)); + +/* function that combines rows. Not very much different than the + * png_combine_row() call. Is this even used????? + */ +extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr, + png_bytep old_row, png_bytep new_row)); +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr, + png_uint_32 size)); + +#if defined(PNG_1_0_X) +# define png_malloc_warn png_malloc +#else +/* Added at libpng version 1.2.4 */ +extern PNG_EXPORT(png_voidp,png_malloc_warn) PNGARG((png_structp png_ptr, + png_uint_32 size)); +#endif + +/* frees a pointer allocated by png_malloc() */ +extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr)); + +#if defined(PNG_1_0_X) +/* Function to allocate memory for zlib. */ +extern PNG_EXPORT(voidpf,png_zalloc) PNGARG((voidpf png_ptr, uInt items, + uInt size)); + +/* Function to free memory for zlib */ +extern PNG_EXPORT(void,png_zfree) PNGARG((voidpf png_ptr, voidpf ptr)); +#endif + +/* Free data that was allocated internally */ +extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 free_me, int num)); +#ifdef PNG_FREE_ME_SUPPORTED +/* Reassign responsibility for freeing existing data, whether allocated + * by libpng or by the application */ +extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr, + png_infop info_ptr, int freer, png_uint_32 mask)); +#endif +/* assignments for png_data_freer */ +#define PNG_DESTROY_WILL_FREE_DATA 1 +#define PNG_SET_WILL_FREE_DATA 1 +#define PNG_USER_WILL_FREE_DATA 2 +/* Flags for png_ptr->free_me and info_ptr->free_me */ +#define PNG_FREE_HIST 0x0008 +#define PNG_FREE_ICCP 0x0010 +#define PNG_FREE_SPLT 0x0020 +#define PNG_FREE_ROWS 0x0040 +#define PNG_FREE_PCAL 0x0080 +#define PNG_FREE_SCAL 0x0100 +#define PNG_FREE_UNKN 0x0200 +#define PNG_FREE_LIST 0x0400 +#define PNG_FREE_PLTE 0x1000 +#define PNG_FREE_TRNS 0x2000 +#define PNG_FREE_TEXT 0x4000 +#define PNG_FREE_ALL 0x7fff +#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ + +#ifdef PNG_USER_MEM_SUPPORTED +extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr, + png_uint_32 size)); +extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr, + png_voidp ptr)); +#endif + +extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr, + png_voidp s1, png_voidp s2, png_uint_32 size)); + +extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr, + png_voidp s1, int value, png_uint_32 size)); + +#if defined(USE_FAR_KEYWORD) /* memory model conversion function */ +extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr, + int check)); +#endif /* USE_FAR_KEYWORD */ + +#ifndef PNG_NO_ERROR_TEXT +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); + +/* The same, but the chunk name is prepended to the error string. */ +extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr, + png_const_charp error_message)); +#else +/* Fatal error in PNG image of libpng - can't continue */ +extern PNG_EXPORT(void,png_err) PNGARG((png_structp png_ptr)); +#endif + +#ifndef PNG_NO_WARNINGS +/* Non-fatal error in libpng. Can continue, but may have a problem. */ +extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); + +#ifdef PNG_READ_SUPPORTED +/* Non-fatal error in libpng, chunk name is prepended to message. */ +extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr, + png_const_charp warning_message)); +#endif /* PNG_READ_SUPPORTED */ +#endif /* PNG_NO_WARNINGS */ + +/* The png_set_ functions are for storing values in the png_info_struct. + * Similarly, the png_get_ calls are used to read values from the + * png_info_struct, either storing the parameters in the passed variables, or + * setting pointers into the png_info_struct where the data is stored. The + * png_get_ functions return a non-zero value if the data was available + * in info_ptr, or return zero and do not change any of the parameters if the + * data was not available. + * + * These functions should be used instead of directly accessing png_info + * to avoid problems with future changes in the size and internal layout of + * png_info_struct. + */ +/* Returns "flag" if chunk data is valid in info_ptr. */ +extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 flag)); + +/* Returns number of bytes needed to hold a transformed row. */ +extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* Returns row_pointers, which is an array of pointers to scanlines that was +returned from png_read_png(). */ +extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr, +png_infop info_ptr)); +/* Set row_pointers, which is an array of pointers to scanlines for use +by png_write_png(). */ +extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytepp row_pointers)); +#endif + +/* Returns number of color channels in image. */ +extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#ifdef PNG_EASY_ACCESS_SUPPORTED +/* Returns image width in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image height in pixels. */ +extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image bit_depth. */ +extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image color_type. */ +extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image filter_type. */ +extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image interlace_type. */ +extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image compression_type. */ +extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns image resolution in pixels per meter, from pHYs chunk data. */ +extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +/* Returns pixel aspect ratio, computed from pHYs chunk data. */ +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +#endif + +/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ +extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); +extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp +png_ptr, png_infop info_ptr)); + +#endif /* PNG_EASY_ACCESS_SUPPORTED */ + +/* Returns pointer to signature string read from PNG header */ +extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p *background)); +#endif + +#if defined(PNG_bKGD_SUPPORTED) +extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_16p background)); +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *white_x, double *white_y, double *red_x, + double *red_y, double *green_x, double *green_y, double *blue_x, + double *blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point + *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y, + png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point + *int_blue_x, png_fixed_point *int_blue_y)); +#endif +#endif + +#if defined(PNG_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, double white_x, double white_y, double red_x, + double red_y, double green_x, double green_y, double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double *file_gamma)); +#endif +extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point *int_file_gamma)); +#endif + +#if defined(PNG_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr, + png_infop info_ptr, double file_gamma)); +#endif +extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_fixed_point int_file_gamma)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p *hist)); +#endif + +#if defined(PNG_hIST_SUPPORTED) +extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_16p hist)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *width, png_uint_32 *height, + int *bit_depth, int *color_type, int *interlace_method, + int *compression_method, int *filter_method)); + +extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, + int color_type, int interlace_method, int compression_method, + int filter_method)); + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, + int *unit_type)); +#endif + +#if defined(PNG_oFFs_SUPPORTED) +extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y, + int unit_type)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1, + int *type, int *nparams, png_charp *units, png_charpp *params)); +#endif + +#if defined(PNG_pCAL_SUPPORTED) +extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1, + int type, int nparams, png_charp units, png_charpp params)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif + +#if defined(PNG_pHYs_SUPPORTED) +extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); +#endif + +extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp *palette, int *num_palette)); + +extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_colorp palette, int num_palette)); + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p *sig_bit)); +#endif + +#if defined(PNG_sBIT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_color_8p sig_bit)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *intent)); +#endif + +#if defined(PNG_sRGB_SUPPORTED) +extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr, + png_infop info_ptr, int intent)); +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charpp name, int *compression_type, + png_charpp profile, png_uint_32 *proflen)); + /* Note to maintainer: profile should be png_bytepp */ +#endif + +#if defined(PNG_iCCP_SUPPORTED) +extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_charp name, int compression_type, + png_charp profile, png_uint_32 proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tpp entries)); +#endif + +#if defined(PNG_sPLT_SUPPORTED) +extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_sPLT_tp entries, int nentries)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) +/* png_get_text also returns the number of text chunks in *num_text */ +extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp *text_ptr, int *num_text)); +#endif + +/* + * Note while png_set_text() will accept a structure whose text, + * language, and translated keywords are NULL pointers, the structure + * returned by png_get_text will always contain regular + * zero-terminated C strings. They might be empty strings but + * they will never be NULL pointers. + */ + +#if defined(PNG_TEXT_SUPPORTED) +extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep *mod_time)); +#endif + +#if defined(PNG_tIME_SUPPORTED) +extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_timep mod_time)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep *trans, int *num_trans, + png_color_16p *trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_bytep trans, int num_trans, + png_color_16p trans_values)); +#endif + +#if defined(PNG_tRNS_SUPPORTED) +#endif + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, double *width, double *height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED */ + +#if defined(PNG_sCAL_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr, + png_infop info_ptr, int unit, png_charp swidth, png_charp sheight)); +#endif +#endif +#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */ + +#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) +/* provide a list of chunks and how they are to be handled, if the built-in + handling or default unknown chunk handling is not desired. Any chunks not + listed will be handled in the default manner. The IHDR and IEND chunks + must not be listed. + keep = 0: follow default behaviour + = 1: do not keep + = 2: keep only if safe-to-copy + = 3: keep even if unsafe-to-copy +*/ +extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp + png_ptr, int keep, png_bytep chunk_list, int num_chunks)); +extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr, + png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)); +extern PNG_EXPORT(void, png_set_unknown_chunk_location) + PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location)); +extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp + png_ptr, png_infop info_ptr, png_unknown_chunkpp entries)); +#endif +#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +PNG_EXPORT(int,png_handle_as_unknown) PNGARG((png_structp png_ptr, png_bytep + chunk_name)); +#endif + +/* Png_free_data() will turn off the "valid" flag for anything it frees. + If you need to turn it off for a chunk that your application has freed, + you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */ +extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr, + png_infop info_ptr, int mask)); + +#if defined(PNG_INFO_IMAGE_SUPPORTED) +/* The "params" pointer is currently not used and is for future expansion. */ +extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr, + png_infop info_ptr, + int transforms, + png_voidp params)); +#endif + +/* Define PNG_DEBUG at compile time for debugging information. Higher + * numbers for PNG_DEBUG mean more debugging information. This has + * only been added since version 0.95 so it is not implemented throughout + * libpng yet, but more support will be added as needed. + */ +#ifdef PNG_DEBUG +#if (PNG_DEBUG > 0) +#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER) +#include +#if (PNG_DEBUG > 1) +#define png_debug(l,m) _RPT0(_CRT_WARN,m) +#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1) +#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2) +#endif +#else /* PNG_DEBUG_FILE || !_MSC_VER */ +#ifndef PNG_DEBUG_FILE +#define PNG_DEBUG_FILE stderr +#endif /* PNG_DEBUG_FILE */ +#if (PNG_DEBUG > 1) +#define png_debug(l,m) \ +{ \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \ +} +#define png_debug1(l,m,p1) \ +{ \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \ +} +#define png_debug2(l,m,p1,p2) \ +{ \ + int num_tabs=l; \ + fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \ + (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \ +} +#endif /* (PNG_DEBUG > 1) */ +#endif /* _MSC_VER */ +#endif /* (PNG_DEBUG > 0) */ +#endif /* PNG_DEBUG */ +#ifndef png_debug +#define png_debug(l, m) +#endif +#ifndef png_debug1 +#define png_debug1(l, m, p1) +#endif +#ifndef png_debug2 +#define png_debug2(l, m, p1, p2) +#endif + +extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr)); +extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr)); + +#ifdef PNG_MNG_FEATURES_SUPPORTED +extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp + png_ptr, png_uint_32 mng_features_permitted)); +#endif + +/* For use in png_set_keep_unknown, added to version 1.2.6 */ +#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 +#define PNG_HANDLE_CHUNK_NEVER 1 +#define PNG_HANDLE_CHUNK_IF_SAFE 2 +#define PNG_HANDLE_CHUNK_ALWAYS 3 + +/* Added to version 1.2.0 */ +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */ +#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04 +#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08 +#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10 +#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20 +#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40 +#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80 +#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */ + +#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ + | PNG_ASM_FLAG_MMX_READ_INTERLACE \ + | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ + | PNG_ASM_FLAG_MMX_READ_FILTER_UP \ + | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ + | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ) +#define PNG_MMX_WRITE_FLAGS ( 0 ) + +#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \ + | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \ + | PNG_MMX_READ_FLAGS \ + | PNG_MMX_WRITE_FLAGS ) + +#define PNG_SELECT_READ 1 +#define PNG_SELECT_WRITE 2 +#endif /* PNG_MMX_CODE_SUPPORTED */ + +#if !defined(PNG_1_0_X) +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask) + PNGARG((int flag_select, int *compilerID)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask) + PNGARG((int flag_select)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_asm_flags) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold) + PNGARG((png_structp png_ptr)); + +/* pngget.c */ +extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold) + PNGARG((png_structp png_ptr)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_asm_flags) + PNGARG((png_structp png_ptr, png_uint_32 asm_flags)); + +/* pngset.c */ +extern PNG_EXPORT(void,png_set_mmx_thresholds) + PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold, + png_uint_32 mmx_rowbytes_threshold)); + +#endif /* PNG_1_0_X */ + +#if !defined(PNG_1_0_X) +/* png.c, pnggccrd.c, or pngvcrd.c */ +extern PNG_EXPORT(int,png_mmx_support) PNGARG((void)); +#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */ + +/* Strip the prepended error numbers ("#nnn ") from error and warning + * messages before passing them to the error or warning handler. */ +#ifdef PNG_ERROR_NUMBERS_SUPPORTED +extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp + png_ptr, png_uint_32 strip_mode)); +#endif + +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.2.6 */ +#ifdef PNG_SET_USER_LIMITS_SUPPORTED +extern PNG_EXPORT(void,png_set_user_limits) PNGARG((png_structp + png_ptr, png_uint_32 user_width_max, png_uint_32 user_height_max)); +extern PNG_EXPORT(png_uint_32,png_get_user_width_max) PNGARG((png_structp + png_ptr)); +extern PNG_EXPORT(png_uint_32,png_get_user_height_max) PNGARG((png_structp + png_ptr)); +#endif + +/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */ + +#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED +/* With these routines we avoid an integer divide, which will be slower on + * most machines. However, it does take more operations than the corresponding + * divide method, so it may be slower on a few RISC systems. There are two + * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. + * + * Note that the rounding factors are NOT supposed to be the same! 128 and + * 32768 are correct for the NODIV code; 127 and 32767 are correct for the + * standard method. + * + * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] + */ + + /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ + +# define png_composite(composite, fg, alpha, bg) \ + { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \ + + (png_uint_16)(bg)*(png_uint_16)(255 - \ + (png_uint_16)(alpha)) + (png_uint_16)128); \ + (composite) = (png_byte)((temp + (temp >> 8)) >> 8); } + +# define png_composite_16(composite, fg, alpha, bg) \ + { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \ + + (png_uint_32)(bg)*(png_uint_32)(65535L - \ + (png_uint_32)(alpha)) + (png_uint_32)32768L); \ + (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); } + +#else /* standard method using integer division */ + +# define png_composite(composite, fg, alpha, bg) \ + (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \ + (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ + (png_uint_16)127) / 255) + +# define png_composite_16(composite, fg, alpha, bg) \ + (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \ + (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \ + (png_uint_32)32767) / (png_uint_32)65535L) + +#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */ + +/* Inline macros to do direct reads of bytes from the input buffer. These + * require that you are using an architecture that uses PNG byte ordering + * (MSB first) and supports unaligned data storage. I think that PowerPC + * in big-endian mode and 680x0 are the only ones that will support this. + * The x86 line of processors definitely do not. The png_get_int_32() + * routine also assumes we are using two's complement format for negative + * values, which is almost certainly true. + */ +#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED) +# define png_get_uint_32(buf) ( *((png_uint_32p) (buf))) +# define png_get_uint_16(buf) ( *((png_uint_16p) (buf))) +# define png_get_int_32(buf) ( *((png_int_32p) (buf))) +#else +extern PNG_EXPORT(png_uint_32,png_get_uint_32) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_uint_16,png_get_uint_16) PNGARG((png_bytep buf)); +extern PNG_EXPORT(png_int_32,png_get_int_32) PNGARG((png_bytep buf)); +#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */ +extern PNG_EXPORT(png_uint_32,png_get_uint_31) + PNGARG((png_structp png_ptr, png_bytep buf)); +/* No png_get_int_16 -- may be added if there's a real need for it. */ + +/* Place a 32-bit number into a buffer in PNG byte order (big-endian). + */ +extern PNG_EXPORT(void,png_save_uint_32) + PNGARG((png_bytep buf, png_uint_32 i)); +extern PNG_EXPORT(void,png_save_int_32) + PNGARG((png_bytep buf, png_int_32 i)); + +/* Place a 16-bit number into a buffer in PNG byte order. + * The parameter is declared unsigned int, not png_uint_16, + * just to avoid potential problems on pre-ANSI C compilers. + */ +extern PNG_EXPORT(void,png_save_uint_16) + PNGARG((png_bytep buf, unsigned int i)); +/* No png_save_int_16 -- may be added if there's a real need for it. */ + +/* ************************************************************************* */ + +/* These next functions are used internally in the code. They generally + * shouldn't be used unless you are writing code to add or replace some + * functionality in libpng. More information about most functions can + * be found in the files where the functions are located. + */ + + +/* Various modes of operation, that are visible to applications because + * they are used for unknown chunk location. + */ +#define PNG_HAVE_IHDR 0x01 +#define PNG_HAVE_PLTE 0x02 +#define PNG_HAVE_IDAT 0x04 +#define PNG_AFTER_IDAT 0x08 /* Have complete zlib datastream */ +#define PNG_HAVE_IEND 0x10 + +#if defined(PNG_INTERNAL) + +/* More modes of operation. Note that after an init, mode is set to + * zero automatically when the structure is created. + */ +#define PNG_HAVE_gAMA 0x20 +#define PNG_HAVE_cHRM 0x40 +#define PNG_HAVE_sRGB 0x80 +#define PNG_HAVE_CHUNK_HEADER 0x100 +#define PNG_WROTE_tIME 0x200 +#define PNG_WROTE_INFO_BEFORE_PLTE 0x400 +#define PNG_BACKGROUND_IS_GRAY 0x800 +#define PNG_HAVE_PNG_SIGNATURE 0x1000 +#define PNG_HAVE_CHUNK_AFTER_IDAT 0x2000 /* Have another chunk after IDAT */ + +/* flags for the transformations the PNG library does on the image data */ +#define PNG_BGR 0x0001 +#define PNG_INTERLACE 0x0002 +#define PNG_PACK 0x0004 +#define PNG_SHIFT 0x0008 +#define PNG_SWAP_BYTES 0x0010 +#define PNG_INVERT_MONO 0x0020 +#define PNG_DITHER 0x0040 +#define PNG_BACKGROUND 0x0080 +#define PNG_BACKGROUND_EXPAND 0x0100 + /* 0x0200 unused */ +#define PNG_16_TO_8 0x0400 +#define PNG_RGBA 0x0800 +#define PNG_EXPAND 0x1000 +#define PNG_GAMMA 0x2000 +#define PNG_GRAY_TO_RGB 0x4000 +#define PNG_FILLER 0x8000L +#define PNG_PACKSWAP 0x10000L +#define PNG_SWAP_ALPHA 0x20000L +#define PNG_STRIP_ALPHA 0x40000L +#define PNG_INVERT_ALPHA 0x80000L +#define PNG_USER_TRANSFORM 0x100000L +#define PNG_RGB_TO_GRAY_ERR 0x200000L +#define PNG_RGB_TO_GRAY_WARN 0x400000L +#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */ + /* 0x800000L Unused */ +#define PNG_ADD_ALPHA 0x1000000L /* Added to libpng-1.2.7 */ +#define PNG_EXPAND_tRNS 0x2000000L /* Added to libpng-1.2.9 */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +/* flags for png_create_struct */ +#define PNG_STRUCT_PNG 0x0001 +#define PNG_STRUCT_INFO 0x0002 + +/* Scaling factor for filter heuristic weighting calculations */ +#define PNG_WEIGHT_SHIFT 8 +#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT)) +#define PNG_COST_SHIFT 3 +#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT)) + +/* flags for the png_ptr->flags rather than declaring a byte for each one */ +#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001 +#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002 +#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004 +#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008 +#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010 +#define PNG_FLAG_ZLIB_FINISHED 0x0020 +#define PNG_FLAG_ROW_INIT 0x0040 +#define PNG_FLAG_FILLER_AFTER 0x0080 +#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100 +#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200 +#define PNG_FLAG_CRC_CRITICAL_USE 0x0400 +#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800 +#define PNG_FLAG_FREE_PLTE 0x1000 +#define PNG_FLAG_FREE_TRNS 0x2000 +#define PNG_FLAG_FREE_HIST 0x4000 +#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L +#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L +#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L +#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L +#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L +#define PNG_FLAG_MALLOC_NULL_MEM_OK 0x100000L +#define PNG_FLAG_ADD_ALPHA 0x200000L /* Added to libpng-1.2.8 */ +#define PNG_FLAG_STRIP_ALPHA 0x400000L /* Added to libpng-1.2.8 */ + /* 0x800000L unused */ + /* 0x1000000L unused */ + /* 0x2000000L unused */ + /* 0x4000000L unused */ + /* 0x8000000L unused */ + /* 0x10000000L unused */ + /* 0x20000000L unused */ + /* 0x40000000L unused */ + +#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \ + PNG_FLAG_CRC_ANCILLARY_NOWARN) + +#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \ + PNG_FLAG_CRC_CRITICAL_IGNORE) + +#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \ + PNG_FLAG_CRC_CRITICAL_MASK) + +/* save typing and make code easier to understand */ + +#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \ + abs((int)((c1).green) - (int)((c2).green)) + \ + abs((int)((c1).blue) - (int)((c2).blue))) + +/* Added to libpng-1.2.6 JB */ +#define PNG_ROWBYTES(pixel_bits, width) \ + ((pixel_bits) >= 8 ? \ + ((width) * (((png_uint_32)(pixel_bits)) >> 3)) : \ + (( ((width) * ((png_uint_32)(pixel_bits))) + 7) >> 3) ) + +/* PNG_OUT_OF_RANGE returns true if value is outside the range + ideal-delta..ideal+delta. Each argument is evaluated twice. + "ideal" and "delta" should be constants, normally simple + integers, "value" a variable. Added to libpng-1.2.6 JB */ +#define PNG_OUT_OF_RANGE(value, ideal, delta) \ + ( (value) < (ideal)-(delta) || (value) > (ideal)+(delta) ) + +/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */ +#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN) +/* place to hold the signature string for a PNG file. */ +#ifdef PNG_USE_GLOBAL_ARRAYS + PNG_EXPORT_VAR (PNG_CONST png_byte FARDATA) png_sig[8]; +#else +#endif +#endif /* PNG_NO_EXTERN */ + +/* Constant strings for known chunk types. If you need to add a chunk, + * define the name here, and add an invocation of the macro in png.c and + * wherever it's needed. + */ +#define PNG_IHDR png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'} +#define PNG_IDAT png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'} +#define PNG_IEND png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'} +#define PNG_PLTE png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'} +#define PNG_bKGD png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'} +#define PNG_cHRM png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'} +#define PNG_gAMA png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'} +#define PNG_hIST png_byte png_hIST[5] = {104, 73, 83, 84, '\0'} +#define PNG_iCCP png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'} +#define PNG_iTXt png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'} +#define PNG_oFFs png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'} +#define PNG_pCAL png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'} +#define PNG_sCAL png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'} +#define PNG_pHYs png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'} +#define PNG_sBIT png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'} +#define PNG_sPLT png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'} +#define PNG_sRGB png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'} +#define PNG_tEXt png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'} +#define PNG_tIME png_byte png_tIME[5] = {116, 73, 77, 69, '\0'} +#define PNG_tRNS png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'} +#define PNG_zTXt png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'} + +#ifdef PNG_USE_GLOBAL_ARRAYS +PNG_EXPORT_VAR (png_byte FARDATA) png_IHDR[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IDAT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_IEND[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_PLTE[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_bKGD[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_cHRM[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_gAMA[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_hIST[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iCCP[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_iTXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_oFFs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sCAL[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_pHYs[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sBIT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sPLT[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_sRGB[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tEXt[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tIME[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_tRNS[5]; +PNG_EXPORT_VAR (png_byte FARDATA) png_zTXt[5]; +#endif /* PNG_USE_GLOBAL_ARRAYS */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for reading, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_read_struct instead). + */ +extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr)); +#undef png_read_init +#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Initialize png_ptr struct for writing, and allocate any other memory. + * (old interface - DEPRECATED - use png_create_write_struct instead). + */ +extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr)); +#undef png_write_init +#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \ + PNG_LIBPNG_VER_STRING, png_sizeof(png_struct)); +#endif + +extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size)); +extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr, + png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t + png_info_size)); + +/* Allocate memory for an internal libpng struct */ +PNG_EXTERN png_voidp png_create_struct PNGARG((int type)); + +/* Free memory from internal libpng struct */ +PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr)); + +PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr + malloc_fn, png_voidp mem_ptr)); +PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr, + png_free_ptr free_fn, png_voidp mem_ptr)); + +/* Free any memory that info_ptr points to and reset struct. */ +PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +#ifndef PNG_1_0_X +/* Function to allocate memory for zlib. */ +PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size)); + +/* Function to free memory for zlib */ +PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr)); + +#ifdef PNG_SIZE_T +/* Function to convert a sizeof an item to png_sizeof item */ + PNG_EXTERN png_size_t PNGAPI png_convert_size PNGARG((size_t size)); +#endif + +/* Next four functions are used internally as callbacks. PNGAPI is required + * but not PNG_EXPORT. PNGAPI added at libpng version 1.2.3. */ + +PNG_EXTERN void PNGAPI png_default_read_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void PNGAPI png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif + +PNG_EXTERN void PNGAPI png_default_write_data PNGARG((png_structp png_ptr, + png_bytep data, png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +#if !defined(PNG_NO_STDIO) +PNG_EXTERN void PNGAPI png_default_flush PNGARG((png_structp png_ptr)); +#endif +#endif +#else /* PNG_1_0_X */ +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t length)); +#endif +#endif /* PNG_1_0_X */ + +/* Reset the CRC variable */ +PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr)); + +/* Write the "data" buffer to whatever output you are using. */ +PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read data from whatever input you are using into the "data" buffer */ +PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +/* Read bytes into buf, and update png_ptr->crc */ +PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf, + png_size_t length)); + +/* Decompress data in a chunk that uses compression */ +#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \ + defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED) +PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr, + int comp_type, png_charp chunkdata, png_size_t chunklength, + png_size_t prefix_length, png_size_t *data_length)); +#endif + +/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */ +PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip)); + +/* Read the CRC from the file and compare it to the libpng calculated CRC */ +PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr)); + +/* Calculate the CRC over a section of data. Note that we are only + * passing a maximum of 64K on systems that have this as a memory limit, + * since this is the maximum buffer size we can specify. + */ +PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr, + png_size_t length)); + +#if defined(PNG_WRITE_FLUSH_SUPPORTED) +PNG_EXTERN void png_flush PNGARG((png_structp png_ptr)); +#endif + +/* simple function to write the signature */ +PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr)); + +/* write various chunks */ + +/* Write the IHDR chunk, and update the png_struct with the necessary + * information. + */ +PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width, + png_uint_32 height, + int bit_depth, int color_type, int compression_method, int filter_method, + int interlace_method)); + +PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette, + png_uint_32 num_pal)); + +PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data, + png_size_t length)); + +PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr)); + +#if defined(PNG_WRITE_gAMA_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point + file_gamma)); +#endif +#endif + +#if defined(PNG_WRITE_sBIT_SUPPORTED) +PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit, + int color_type)); +#endif + +#if defined(PNG_WRITE_cHRM_SUPPORTED) +#ifdef PNG_FLOATING_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr, + double white_x, double white_y, + double red_x, double red_y, double green_x, double green_y, + double blue_x, double blue_y)); +#endif +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr, + png_fixed_point int_white_x, png_fixed_point int_white_y, + png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point + int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x, + png_fixed_point int_blue_y)); +#endif +#endif + +#if defined(PNG_WRITE_sRGB_SUPPORTED) +PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr, + int intent)); +#endif + +#if defined(PNG_WRITE_iCCP_SUPPORTED) +PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr, + png_charp name, int compression_type, + png_charp profile, int proflen)); + /* Note to maintainer: profile should be png_bytep */ +#endif + +#if defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr, + png_sPLT_tp palette)); +#endif + +#if defined(PNG_WRITE_tRNS_SUPPORTED) +PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans, + png_color_16p values, int number, int color_type)); +#endif + +#if defined(PNG_WRITE_bKGD_SUPPORTED) +PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr, + png_color_16p values, int color_type)); +#endif + +#if defined(PNG_WRITE_hIST_SUPPORTED) +PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist, + int num_hist)); +#endif + +#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \ + defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED) +PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr, + png_charp key, png_charpp new_key)); +#endif + +#if defined(PNG_WRITE_tEXt_SUPPORTED) +PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len)); +#endif + +#if defined(PNG_WRITE_zTXt_SUPPORTED) +PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key, + png_charp text, png_size_t text_len, int compression)); +#endif + +#if defined(PNG_WRITE_iTXt_SUPPORTED) +PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr, + int compression, png_charp key, png_charp lang, png_charp lang_key, + png_charp text)); +#endif + +#if defined(PNG_TEXT_SUPPORTED) /* Added at version 1.0.14 and 1.2.4 */ +PNG_EXTERN int png_set_text_2 PNGARG((png_structp png_ptr, + png_infop info_ptr, png_textp text_ptr, int num_text)); +#endif + +#if defined(PNG_WRITE_oFFs_SUPPORTED) +PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr, + png_int_32 x_offset, png_int_32 y_offset, int unit_type)); +#endif + +#if defined(PNG_WRITE_pCAL_SUPPORTED) +PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose, + png_int_32 X0, png_int_32 X1, int type, int nparams, + png_charp units, png_charpp params)); +#endif + +#if defined(PNG_WRITE_pHYs_SUPPORTED) +PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr, + png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit, + int unit_type)); +#endif + +#if defined(PNG_WRITE_tIME_SUPPORTED) +PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr, + png_timep mod_time)); +#endif + +#if defined(PNG_WRITE_sCAL_SUPPORTED) +#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO) +PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr, + int unit, double width, double height)); +#else +#ifdef PNG_FIXED_POINT_SUPPORTED +PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr, + int unit, png_charp width, png_charp height)); +#endif +#endif +#endif + +/* Called when finished processing a row of data */ +PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr)); + +/* Internal use only. Called before first row of data */ +PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr)); + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr)); +#endif + +/* combine a row of data, dealing with alpha, etc. if requested */ +PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row, + int mask)); + +#if defined(PNG_READ_INTERLACING_SUPPORTED) +/* expand an interlaced row */ +/* OLD pre-1.0.9 interface: +PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass, png_uint_32 transformations)); + */ +PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr)); +#endif + +/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */ + +#if defined(PNG_WRITE_INTERLACING_SUPPORTED) +/* grab pixels out of a row for an interlaced pass */ +PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info, + png_bytep row, int pass)); +#endif + +/* unfilter a row */ +PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr, + png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter)); + +/* Choose the best filter to use and filter the row data */ +PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr, + png_row_infop row_info)); + +/* Write out the filtered row. */ +PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr, + png_bytep filtered_row)); +/* finish a row while reading, dealing with interlacing passes, etc. */ +PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr)); + +/* initialize the row buffers, etc. */ +PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr)); +/* optional call to update the users info structure */ +PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); + +/* these are the functions that do the transformations */ +#if defined(PNG_READ_FILLER_SUPPORTED) +PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 filler, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_WRITE_FILLER_SUPPORTED) || \ + defined(PNG_READ_STRIP_ALPHA_SUPPORTED) +PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 flags)); +#endif + +#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) +PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED) +PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED) +PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop + row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED) +PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_READ_PACK_SUPPORTED) +PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p sig_bits)); +#endif + +#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) +PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_16_TO_8_SUPPORTED) +PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_READ_DITHER_SUPPORTED) +PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info, + png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup)); + +# if defined(PNG_CORRECT_PALETTE_SUPPORTED) +PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr, + png_colorp palette, int num_palette)); +# endif +#endif + +#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) +PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row)); +#endif + +#if defined(PNG_WRITE_PACK_SUPPORTED) +PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info, + png_bytep row, png_uint_32 bit_depth)); +#endif + +#if defined(PNG_WRITE_SHIFT_SUPPORTED) +PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row, + png_color_8p bit_depth)); +#endif + +#if defined(PNG_READ_BACKGROUND_SUPPORTED) +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background, + png_color_16p background_1, + png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1, + png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1, + png_uint_16pp gamma_16_to_1, int gamma_shift)); +#else +PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row, + png_color_16p trans_values, png_color_16p background)); +#endif +#endif + +#if defined(PNG_READ_GAMMA_SUPPORTED) +PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row, + png_bytep gamma_table, png_uint_16pp gamma_16_table, + int gamma_shift)); +#endif + +#if defined(PNG_READ_EXPAND_SUPPORTED) +PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info, + png_bytep row, png_colorp palette, png_bytep trans, int num_trans)); +PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info, + png_bytep row, png_color_16p trans_value)); +#endif + +/* The following decodes the appropriate chunks, and does error correction, + * then calls the appropriate callback for the chunk if it is valid. + */ + +/* decode the IHDR chunk */ +PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); + +#if defined(PNG_READ_bKGD_SUPPORTED) +PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_cHRM_SUPPORTED) +PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_gAMA_SUPPORTED) +PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_hIST_SUPPORTED) +PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_iCCP_SUPPORTED) +extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_iCCP_SUPPORTED */ + +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_oFFs_SUPPORTED) +PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pCAL_SUPPORTED) +PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_pHYs_SUPPORTED) +PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sBIT_SUPPORTED) +PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sCAL_SUPPORTED) +PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_sPLT_SUPPORTED) +extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif /* PNG_READ_sPLT_SUPPORTED */ + +#if defined(PNG_READ_sRGB_SUPPORTED) +PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tIME_SUPPORTED) +PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_tRNS_SUPPORTED) +PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr, + png_uint_32 length)); +#endif + +PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); + +PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr, + png_bytep chunk_name)); + +/* handle the transformations for reading and writing */ +PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr)); + +PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr)); + +#ifdef PNG_PROGRESSIVE_READ_SUPPORTED +PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr, + png_uint_32 length)); +PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr, + png_bytep buffer, png_size_t buffer_length)); +PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr)); +PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row)); +PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr, + png_infop info_ptr)); +PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr)); +#if defined(PNG_READ_tEXt_SUPPORTED) +PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_zTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif +#if defined(PNG_READ_iTXt_SUPPORTED) +PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr, png_uint_32 length)); +PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr, + png_infop info_ptr)); +#endif + +#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */ + +#ifdef PNG_MNG_FEATURES_SUPPORTED +PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info, + png_bytep row)); +#endif + +#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) +#if defined(PNG_MMX_CODE_SUPPORTED) +/* png.c */ /* PRIVATE */ +PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr)); +#endif +#endif + +#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_x_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN png_uint_32 png_get_y_pixels_per_inch PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_x_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +PNG_EXTERN float png_get_y_offset_inches PNGARG((png_structp png_ptr, +png_infop info_ptr)); + +#if defined(PNG_pHYs_SUPPORTED) +PNG_EXTERN png_uint_32 png_get_pHYs_dpi PNGARG((png_structp png_ptr, +png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)); +#endif /* PNG_pHYs_SUPPORTED */ +#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */ + +/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */ + +#endif /* PNG_INTERNAL */ + +#ifdef __cplusplus +} +#endif + +#endif /* PNG_VERSION_INFO_ONLY */ +/* do not put anything past this line */ +#endif /* PNG_H */ diff --git a/WadInstaller_Source/source/libpng/pngconf.h b/WadInstaller_Source/source/libpng/pngconf.h new file mode 100644 index 0000000..06a182f --- /dev/null +++ b/WadInstaller_Source/source/libpng/pngconf.h @@ -0,0 +1,1481 @@ + +/* pngconf.h - machine configurable file for libpng + * + * libpng version 1.2.29 - May 8, 2008 + * For conditions of distribution and use, see copyright notice in png.h + * Copyright (c) 1998-2008 Glenn Randers-Pehrson + * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) + * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) + */ + +/* Any machine specific code is near the front of this file, so if you + * are configuring libpng for a machine, you may want to read the section + * starting here down to where it starts to typedef png_color, png_text, + * and png_info. + */ + +#ifndef PNGCONF_H +#define PNGCONF_H + +#define PNG_1_2_X + +/* + * PNG_USER_CONFIG has to be defined on the compiler command line. This + * includes the resource compiler for Windows DLL configurations. + */ +#ifdef PNG_USER_CONFIG +# ifndef PNG_USER_PRIVATEBUILD +# define PNG_USER_PRIVATEBUILD +# endif +#include "pngusr.h" +#endif + +/* PNG_CONFIGURE_LIBPNG is set by the "configure" script. */ +#ifdef PNG_CONFIGURE_LIBPNG +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#endif + +/* + * Added at libpng-1.2.8 + * + * If you create a private DLL you need to define in "pngusr.h" the followings: + * #define PNG_USER_PRIVATEBUILD + * e.g. #define PNG_USER_PRIVATEBUILD "Build by MyCompany for xyz reasons." + * #define PNG_USER_DLLFNAME_POSTFIX + * e.g. // private DLL "libpng13gx.dll" + * #define PNG_USER_DLLFNAME_POSTFIX "gx" + * + * The following macros are also at your disposal if you want to complete the + * DLL VERSIONINFO structure. + * - PNG_USER_VERSIONINFO_COMMENTS + * - PNG_USER_VERSIONINFO_COMPANYNAME + * - PNG_USER_VERSIONINFO_LEGALTRADEMARKS + */ + +#ifdef __STDC__ +#ifdef SPECIALBUILD +# pragma message("PNG_LIBPNG_SPECIALBUILD (and deprecated SPECIALBUILD)\ + are now LIBPNG reserved macros. Use PNG_USER_PRIVATEBUILD instead.") +#endif + +#ifdef PRIVATEBUILD +# pragma message("PRIVATEBUILD is deprecated.\ + Use PNG_USER_PRIVATEBUILD instead.") +# define PNG_USER_PRIVATEBUILD PRIVATEBUILD +#endif +#endif /* __STDC__ */ + +#ifndef PNG_VERSION_INFO_ONLY + +/* End of material added to libpng-1.2.8 */ + +/* Added at libpng-1.2.19, removed at libpng-1.2.20 because it caused trouble + Restored at libpng-1.2.21 */ +#if !defined(PNG_NO_WARN_UNINITIALIZED_ROW) && \ + !defined(PNG_WARN_UNINITIALIZED_ROW) +# define PNG_WARN_UNINITIALIZED_ROW 1 +#endif +/* End of material added at libpng-1.2.19/1.2.21 */ + +/* This is the size of the compression buffer, and thus the size of + * an IDAT chunk. Make this whatever size you feel is best for your + * machine. One of these will be allocated per png_struct. When this + * is full, it writes the data to the disk, and does some other + * calculations. Making this an extremely small size will slow + * the library down, but you may want to experiment to determine + * where it becomes significant, if you are concerned with memory + * usage. Note that zlib allocates at least 32Kb also. For readers, + * this describes the size of the buffer available to read the data in. + * Unless this gets smaller than the size of a row (compressed), + * it should not make much difference how big this is. + */ + +#ifndef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 8192 +#endif + +/* Enable if you want a write-only libpng */ + +#ifndef PNG_NO_READ_SUPPORTED +# define PNG_READ_SUPPORTED +#endif + +/* Enable if you want a read-only libpng */ + +#ifndef PNG_NO_WRITE_SUPPORTED +# define PNG_WRITE_SUPPORTED +#endif + +/* Enabled by default in 1.2.0. You can disable this if you don't need to + support PNGs that are embedded in MNG datastreams */ +#if !defined(PNG_1_0_X) && !defined(PNG_NO_MNG_FEATURES) +# ifndef PNG_MNG_FEATURES_SUPPORTED +# define PNG_MNG_FEATURES_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_FLOATING_POINT_SUPPORTED +# ifndef PNG_FLOATING_POINT_SUPPORTED +# define PNG_FLOATING_POINT_SUPPORTED +# endif +#endif + +/* If you are running on a machine where you cannot allocate more + * than 64K of memory at once, uncomment this. While libpng will not + * normally need that much memory in a chunk (unless you load up a very + * large file), zlib needs to know how big of a chunk it can use, and + * libpng thus makes sure to check any memory allocation to verify it + * will fit into memory. +#define PNG_MAX_MALLOC_64K + */ +#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K) +# define PNG_MAX_MALLOC_64K +#endif + +/* Special munging to support doing things the 'cygwin' way: + * 'Normal' png-on-win32 defines/defaults: + * PNG_BUILD_DLL -- building dll + * PNG_USE_DLL -- building an application, linking to dll + * (no define) -- building static library, or building an + * application and linking to the static lib + * 'Cygwin' defines/defaults: + * PNG_BUILD_DLL -- (ignored) building the dll + * (no define) -- (ignored) building an application, linking to the dll + * PNG_STATIC -- (ignored) building the static lib, or building an + * application that links to the static lib. + * ALL_STATIC -- (ignored) building various static libs, or building an + * application that links to the static libs. + * Thus, + * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and + * this bit of #ifdefs will define the 'correct' config variables based on + * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but + * unnecessary. + * + * Also, the precedence order is: + * ALL_STATIC (since we can't #undef something outside our namespace) + * PNG_BUILD_DLL + * PNG_STATIC + * (nothing) == PNG_USE_DLL + * + * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent + * of auto-import in binutils, we no longer need to worry about + * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, + * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes + * to __declspec() stuff. However, we DO need to worry about + * PNG_BUILD_DLL and PNG_STATIC because those change some defaults + * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. + */ +#if defined(__CYGWIN__) +# if defined(ALL_STATIC) +# if defined(PNG_BUILD_DLL) +# undef PNG_BUILD_DLL +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# if !defined(PNG_STATIC) +# define PNG_STATIC +# endif +# else +# if defined (PNG_BUILD_DLL) +# if defined(PNG_STATIC) +# undef PNG_STATIC +# endif +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# else +# if defined(PNG_STATIC) +# if defined(PNG_USE_DLL) +# undef PNG_USE_DLL +# endif +# if defined(PNG_DLL) +# undef PNG_DLL +# endif +# else +# if !defined(PNG_USE_DLL) +# define PNG_USE_DLL +# endif +# if !defined(PNG_DLL) +# define PNG_DLL +# endif +# endif +# endif +# endif +#endif + +/* This protects us against compilers that run on a windowing system + * and thus don't have or would rather us not use the stdio types: + * stdin, stdout, and stderr. The only one currently used is stderr + * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will + * prevent these from being compiled and used. #defining PNG_NO_STDIO + * will also prevent these, plus will prevent the entire set of stdio + * macros and functions (FILE *, printf, etc.) from being compiled and used, + * unless (PNG_DEBUG > 0) has been #defined. + * + * #define PNG_NO_CONSOLE_IO + * #define PNG_NO_STDIO + */ + +#if defined(_WIN32_WCE) +# include + /* Console I/O functions are not supported on WindowsCE */ +# define PNG_NO_CONSOLE_IO +# ifdef PNG_DEBUG +# undef PNG_DEBUG +# endif +#endif + +#ifdef PNG_BUILD_DLL +# ifndef PNG_CONSOLE_IO_SUPPORTED +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# endif +#endif + +# ifdef PNG_NO_STDIO +# ifndef PNG_NO_CONSOLE_IO +# define PNG_NO_CONSOLE_IO +# endif +# ifdef PNG_DEBUG +# if (PNG_DEBUG > 0) +# include +# endif +# endif +# else +# if !defined(_WIN32_WCE) +/* "stdio.h" functions are not supported on WindowsCE */ +# include +# endif +# endif + +/* This macro protects us against machines that don't have function + * prototypes (ie K&R style headers). If your compiler does not handle + * function prototypes, define this macro and use the included ansi2knr. + * I've always been able to use _NO_PROTO as the indicator, but you may + * need to drag the empty declaration out in front of here, or change the + * ifdef to suit your own needs. + */ +#ifndef PNGARG + +#ifdef OF /* zlib prototype munger */ +# define PNGARG(arglist) OF(arglist) +#else + +#ifdef _NO_PROTO +# define PNGARG(arglist) () +# ifndef PNG_TYPECAST_NULL +# define PNG_TYPECAST_NULL +# endif +#else +# define PNGARG(arglist) arglist +#endif /* _NO_PROTO */ + + +#endif /* OF */ + +#endif /* PNGARG */ + +/* Try to determine if we are compiling on a Mac. Note that testing for + * just __MWERKS__ is not good enough, because the Codewarrior is now used + * on non-Mac platforms. + */ +#ifndef MACOS +# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \ + defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC) +# define MACOS +# endif +#endif + +/* enough people need this for various reasons to include it here */ +#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE) +# include +#endif + +#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED) +# define PNG_SETJMP_SUPPORTED +#endif + +#ifdef PNG_SETJMP_SUPPORTED +/* This is an attempt to force a single setjmp behaviour on Linux. If + * the X config stuff didn't define _BSD_SOURCE we wouldn't need this. + */ + +# ifdef __linux__ +# ifdef _BSD_SOURCE +# define PNG_SAVE_BSD_SOURCE +# undef _BSD_SOURCE +# endif +# ifdef _SETJMP_H + /* If you encounter a compiler error here, see the explanation + * near the end of INSTALL. + */ + __pngconf.h__ already includes setjmp.h; + __dont__ include it again.; +# endif +# endif /* __linux__ */ + + /* include setjmp.h for error handling */ +# include + +# ifdef __linux__ +# ifdef PNG_SAVE_BSD_SOURCE +# ifndef _BSD_SOURCE +# define _BSD_SOURCE +# endif +# undef PNG_SAVE_BSD_SOURCE +# endif +# endif /* __linux__ */ +#endif /* PNG_SETJMP_SUPPORTED */ + +#ifdef BSD +# include +#else +# include +#endif + +/* Other defines for things like memory and the like can go here. */ +#ifdef PNG_INTERNAL + +#include + +/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which + * aren't usually used outside the library (as far as I know), so it is + * debatable if they should be exported at all. In the future, when it is + * possible to have run-time registry of chunk-handling functions, some of + * these will be made available again. +#define PNG_EXTERN extern + */ +#define PNG_EXTERN + +/* Other defines specific to compilers can go here. Try to keep + * them inside an appropriate ifdef/endif pair for portability. + */ + +#if defined(PNG_FLOATING_POINT_SUPPORTED) +# if defined(MACOS) + /* We need to check that hasn't already been included earlier + * as it seems it doesn't agree with , yet we should really use + * if possible. + */ +# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__) +# include +# endif +# else +# include +# endif +# if defined(_AMIGA) && defined(__SASC) && defined(_M68881) + /* Amiga SAS/C: We must include builtin FPU functions when compiling using + * MATH=68881 + */ +# include +# endif +#endif + +/* Codewarrior on NT has linking problems without this. */ +#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__) +# define PNG_ALWAYS_EXTERN +#endif + +/* This provides the non-ANSI (far) memory allocation routines. */ +#if defined(__TURBOC__) && defined(__MSDOS__) +# include +# include +#endif + +/* I have no idea why is this necessary... */ +#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \ + defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__)) +# include +#endif + +/* This controls how fine the dithering gets. As this allocates + * a largish chunk of memory (32K), those who are not as concerned + * with dithering quality can decrease some or all of these. + */ +#ifndef PNG_DITHER_RED_BITS +# define PNG_DITHER_RED_BITS 5 +#endif +#ifndef PNG_DITHER_GREEN_BITS +# define PNG_DITHER_GREEN_BITS 5 +#endif +#ifndef PNG_DITHER_BLUE_BITS +# define PNG_DITHER_BLUE_BITS 5 +#endif + +/* This controls how fine the gamma correction becomes when you + * are only interested in 8 bits anyway. Increasing this value + * results in more memory being used, and more pow() functions + * being called to fill in the gamma tables. Don't set this value + * less then 8, and even that may not work (I haven't tested it). + */ + +#ifndef PNG_MAX_GAMMA_8 +# define PNG_MAX_GAMMA_8 11 +#endif + +/* This controls how much a difference in gamma we can tolerate before + * we actually start doing gamma conversion. + */ +#ifndef PNG_GAMMA_THRESHOLD +# define PNG_GAMMA_THRESHOLD 0.05 +#endif + +#endif /* PNG_INTERNAL */ + +/* The following uses const char * instead of char * for error + * and warning message functions, so some compilers won't complain. + * If you do not want to use const, define PNG_NO_CONST here. + */ + +#ifndef PNG_NO_CONST +# define PNG_CONST const +#else +# define PNG_CONST +#endif + +/* The following defines give you the ability to remove code from the + * library that you will not be using. I wish I could figure out how to + * automate this, but I can't do that without making it seriously hard + * on the users. So if you are not using an ability, change the #define + * to and #undef, and that part of the library will not be compiled. If + * your linker can't find a function, you may want to make sure the + * ability is defined here. Some of these depend upon some others being + * defined. I haven't figured out all the interactions here, so you may + * have to experiment awhile to get everything to compile. If you are + * creating or using a shared library, you probably shouldn't touch this, + * as it will affect the size of the structures, and this will cause bad + * things to happen if the library and/or application ever change. + */ + +/* Any features you will not be using can be undef'ed here */ + +/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user + * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS + * on the compile line, then pick and choose which ones to define without + * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED + * if you only want to have a png-compliant reader/writer but don't need + * any of the extra transformations. This saves about 80 kbytes in a + * typical installation of the library. (PNG_NO_* form added in version + * 1.0.1c, for consistency) + */ + +/* The size of the png_text structure changed in libpng-1.0.6 when + * iTXt support was added. iTXt support was turned off by default through + * libpng-1.2.x, to support old apps that malloc the png_text structure + * instead of calling png_set_text() and letting libpng malloc it. It + * was turned on by default in libpng-1.3.0. + */ + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +# ifndef PNG_NO_iTXt_SUPPORTED +# define PNG_NO_iTXt_SUPPORTED +# endif +# ifndef PNG_NO_READ_iTXt +# define PNG_NO_READ_iTXt +# endif +# ifndef PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_iTXt +# endif +#endif + +#if !defined(PNG_NO_iTXt_SUPPORTED) +# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt) +# define PNG_READ_iTXt +# endif +# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt) +# define PNG_WRITE_iTXt +# endif +#endif + +/* The following support, added after version 1.0.0, can be turned off here en + * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility + * with old applications that require the length of png_struct and png_info + * to remain unchanged. + */ + +#ifdef PNG_LEGACY_SUPPORTED +# define PNG_NO_FREE_ME +# define PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_NO_READ_USER_CHUNKS +# define PNG_NO_READ_iCCP +# define PNG_NO_WRITE_iCCP +# define PNG_NO_READ_iTXt +# define PNG_NO_WRITE_iTXt +# define PNG_NO_READ_sCAL +# define PNG_NO_WRITE_sCAL +# define PNG_NO_READ_sPLT +# define PNG_NO_WRITE_sPLT +# define PNG_NO_INFO_IMAGE +# define PNG_NO_READ_RGB_TO_GRAY +# define PNG_NO_READ_USER_TRANSFORM +# define PNG_NO_WRITE_USER_TRANSFORM +# define PNG_NO_USER_MEM +# define PNG_NO_READ_EMPTY_PLTE +# define PNG_NO_MNG_FEATURES +# define PNG_NO_FIXED_POINT_SUPPORTED +#endif + +/* Ignore attempt to turn off both floating and fixed point support */ +#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \ + !defined(PNG_NO_FIXED_POINT_SUPPORTED) +# define PNG_FIXED_POINT_SUPPORTED +#endif + +#ifndef PNG_NO_FREE_ME +# define PNG_FREE_ME_SUPPORTED +#endif + +#if defined(PNG_READ_SUPPORTED) + +#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_TRANSFORMS) +# define PNG_READ_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_READ_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_READ_EXPAND +# define PNG_READ_EXPAND_SUPPORTED +# endif +# ifndef PNG_NO_READ_SHIFT +# define PNG_READ_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACK +# define PNG_READ_PACK_SUPPORTED +# endif +# ifndef PNG_NO_READ_BGR +# define PNG_READ_BGR_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP +# define PNG_READ_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_PACKSWAP +# define PNG_READ_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT +# define PNG_READ_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_READ_DITHER +# define PNG_READ_DITHER_SUPPORTED +# endif +# ifndef PNG_NO_READ_BACKGROUND +# define PNG_READ_BACKGROUND_SUPPORTED +# endif +# ifndef PNG_NO_READ_16_TO_8 +# define PNG_READ_16_TO_8_SUPPORTED +# endif +# ifndef PNG_NO_READ_FILLER +# define PNG_READ_FILLER_SUPPORTED +# endif +# ifndef PNG_NO_READ_GAMMA +# define PNG_READ_GAMMA_SUPPORTED +# endif +# ifndef PNG_NO_READ_GRAY_TO_RGB +# define PNG_READ_GRAY_TO_RGB_SUPPORTED +# endif +# ifndef PNG_NO_READ_SWAP_ALPHA +# define PNG_READ_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_INVERT_ALPHA +# define PNG_READ_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_STRIP_ALPHA +# define PNG_READ_STRIP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_READ_USER_TRANSFORM +# define PNG_READ_USER_TRANSFORM_SUPPORTED +# endif +# ifndef PNG_NO_READ_RGB_TO_GRAY +# define PNG_READ_RGB_TO_GRAY_SUPPORTED +# endif +#endif /* PNG_READ_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_PROGRESSIVE_READ) && \ + !defined(PNG_PROGRESSIVE_READ_SUPPORTED) /* if you don't do progressive */ +# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */ +#endif /* about interlacing capability! You'll */ + /* still have interlacing unless you change the following line: */ + +#define PNG_READ_INTERLACING_SUPPORTED /* required in PNG-compliant decoders */ + +#ifndef PNG_NO_READ_COMPOSITE_NODIV +# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */ +# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */ +# endif +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, will be removed from version 2.0.0. + Use PNG_MNG_FEATURES_SUPPORTED instead. */ +#ifndef PNG_NO_READ_EMPTY_PLTE +# define PNG_READ_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_READ_SUPPORTED */ + +#if defined(PNG_WRITE_SUPPORTED) + +# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_TRANSFORMS) +# define PNG_WRITE_TRANSFORMS_SUPPORTED +#endif + +#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED +# ifndef PNG_NO_WRITE_SHIFT +# define PNG_WRITE_SHIFT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACK +# define PNG_WRITE_PACK_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_BGR +# define PNG_WRITE_BGR_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_SWAP +# define PNG_WRITE_SWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_PACKSWAP +# define PNG_WRITE_PACKSWAP_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT +# define PNG_WRITE_INVERT_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_FILLER +# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */ +# endif +# ifndef PNG_NO_WRITE_SWAP_ALPHA +# define PNG_WRITE_SWAP_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_INVERT_ALPHA +# define PNG_WRITE_INVERT_ALPHA_SUPPORTED +# endif +# ifndef PNG_NO_WRITE_USER_TRANSFORM +# define PNG_WRITE_USER_TRANSFORM_SUPPORTED +# endif +#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */ + +#if !defined(PNG_NO_WRITE_INTERLACING_SUPPORTED) && \ + !defined(PNG_WRITE_INTERLACING_SUPPORTED) +#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant + encoders, but can cause trouble + if left undefined */ +#endif + +#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \ + !defined(PNG_WRITE_WEIGHTED_FILTER) && \ + defined(PNG_FLOATING_POINT_SUPPORTED) +# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED +#endif + +#ifndef PNG_NO_WRITE_FLUSH +# define PNG_WRITE_FLUSH_SUPPORTED +#endif + +#if defined(PNG_1_0_X) || defined (PNG_1_2_X) +/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */ +#ifndef PNG_NO_WRITE_EMPTY_PLTE +# define PNG_WRITE_EMPTY_PLTE_SUPPORTED +#endif +#endif + +#endif /* PNG_WRITE_SUPPORTED */ + +#ifndef PNG_1_0_X +# ifndef PNG_NO_ERROR_NUMBERS +# define PNG_ERROR_NUMBERS_SUPPORTED +# endif +#endif /* PNG_1_0_X */ + +#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ + defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) +# ifndef PNG_NO_USER_TRANSFORM_PTR +# define PNG_USER_TRANSFORM_PTR_SUPPORTED +# endif +#endif + +#ifndef PNG_NO_STDIO +# define PNG_TIME_RFC1123_SUPPORTED +#endif + +/* This adds extra functions in pngget.c for accessing data from the + * info pointer (added in version 0.99) + * png_get_image_width() + * png_get_image_height() + * png_get_bit_depth() + * png_get_color_type() + * png_get_compression_type() + * png_get_filter_type() + * png_get_interlace_type() + * png_get_pixel_aspect_ratio() + * png_get_pixels_per_meter() + * png_get_x_offset_pixels() + * png_get_y_offset_pixels() + * png_get_x_offset_microns() + * png_get_y_offset_microns() + */ +#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED) +# define PNG_EASY_ACCESS_SUPPORTED +#endif + +/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 + * and removed from version 1.2.20. The following will be removed + * from libpng-1.4.0 +*/ + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_OPTIMIZED_CODE) +# ifndef PNG_OPTIMIZED_CODE_SUPPORTED +# define PNG_OPTIMIZED_CODE_SUPPORTED +# endif +#endif + +#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE) +# ifndef PNG_ASSEMBLER_CODE_SUPPORTED +# define PNG_ASSEMBLER_CODE_SUPPORTED +# endif + +# if defined(__GNUC__) && defined(__x86_64__) && (__GNUC__ < 4) + /* work around 64-bit gcc compiler bugs in gcc-3.x */ +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if defined(__APPLE__) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if (defined(__MWERKS__) && ((__MWERKS__ < 0x0900) || macintosh)) +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_NO_MMX_CODE +# endif +# endif + +# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE) +# define PNG_MMX_CODE_SUPPORTED +# endif + +#endif +/* end of obsolete code to be removed from libpng-1.4.0 */ + +#if !defined(PNG_1_0_X) +#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED) +# define PNG_USER_MEM_SUPPORTED +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.2.6 */ +#if !defined(PNG_1_0_X) +#ifndef PNG_SET_USER_LIMITS_SUPPORTED +#if !defined(PNG_NO_SET_USER_LIMITS) && !defined(PNG_SET_USER_LIMITS_SUPPORTED) +# define PNG_SET_USER_LIMITS_SUPPORTED +#endif +#endif +#endif /* PNG_1_0_X */ + +/* Added at libpng-1.0.16 and 1.2.6. To accept all valid PNGS no matter + * how large, set these limits to 0x7fffffffL + */ +#ifndef PNG_USER_WIDTH_MAX +# define PNG_USER_WIDTH_MAX 1000000L +#endif +#ifndef PNG_USER_HEIGHT_MAX +# define PNG_USER_HEIGHT_MAX 1000000L +#endif + +/* These are currently experimental features, define them if you want */ + +/* very little testing */ +/* +#ifdef PNG_READ_SUPPORTED +# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED +# endif +#endif +*/ + +/* This is only for PowerPC big-endian and 680x0 systems */ +/* some testing */ +/* +#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED +# define PNG_READ_BIG_ENDIAN_SUPPORTED +#endif +*/ + +/* Buggy compilers (e.g., gcc 2.7.2.2) need this */ +/* +#define PNG_NO_POINTER_INDEXING +*/ + +/* These functions are turned off by default, as they will be phased out. */ +/* +#define PNG_USELESS_TESTS_SUPPORTED +#define PNG_CORRECT_PALETTE_SUPPORTED +*/ + +/* Any chunks you are not interested in, you can undef here. The + * ones that allocate memory may be expecially important (hIST, + * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info + * a bit smaller. + */ + +#if defined(PNG_READ_SUPPORTED) && \ + !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_READ_ANCILLARY_CHUNKS) +# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#if defined(PNG_WRITE_SUPPORTED) && \ + !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \ + !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS) +# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED +#endif + +#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_READ_TEXT +# define PNG_NO_READ_iTXt +# define PNG_NO_READ_tEXt +# define PNG_NO_READ_zTXt +#endif +#ifndef PNG_NO_READ_bKGD +# define PNG_READ_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +#endif +#ifndef PNG_NO_READ_cHRM +# define PNG_READ_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +#endif +#ifndef PNG_NO_READ_gAMA +# define PNG_READ_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +#endif +#ifndef PNG_NO_READ_hIST +# define PNG_READ_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +#endif +#ifndef PNG_NO_READ_iCCP +# define PNG_READ_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +#endif +#ifndef PNG_NO_READ_iTXt +# ifndef PNG_READ_iTXt_SUPPORTED +# define PNG_READ_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_READ_oFFs +# define PNG_READ_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +#endif +#ifndef PNG_NO_READ_pCAL +# define PNG_READ_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_sCAL +# define PNG_READ_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +#endif +#ifndef PNG_NO_READ_pHYs +# define PNG_READ_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +#endif +#ifndef PNG_NO_READ_sBIT +# define PNG_READ_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sPLT +# define PNG_READ_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +#endif +#ifndef PNG_NO_READ_sRGB +# define PNG_READ_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +#endif +#ifndef PNG_NO_READ_tEXt +# define PNG_READ_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_tIME +# define PNG_READ_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +#endif +#ifndef PNG_NO_READ_tRNS +# define PNG_READ_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +#endif +#ifndef PNG_NO_READ_zTXt +# define PNG_READ_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +#endif +#ifndef PNG_NO_READ_UNKNOWN_CHUNKS +# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +# ifndef PNG_NO_HANDLE_AS_UNKNOWN +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +#endif +#if !defined(PNG_NO_READ_USER_CHUNKS) && \ + defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED) +# define PNG_READ_USER_CHUNKS_SUPPORTED +# define PNG_USER_CHUNKS_SUPPORTED +# ifdef PNG_NO_READ_UNKNOWN_CHUNKS +# undef PNG_NO_READ_UNKNOWN_CHUNKS +# endif +# ifdef PNG_NO_HANDLE_AS_UNKNOWN +# undef PNG_NO_HANDLE_AS_UNKNOWN +# endif +#endif +#ifndef PNG_NO_READ_OPT_PLTE +# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */ +#endif /* optional PLTE chunk in RGB and RGBA images */ +#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \ + defined(PNG_READ_zTXt_SUPPORTED) +# define PNG_READ_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +#endif + +#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */ + +#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED + +#ifdef PNG_NO_WRITE_TEXT +# define PNG_NO_WRITE_iTXt +# define PNG_NO_WRITE_tEXt +# define PNG_NO_WRITE_zTXt +#endif +#ifndef PNG_NO_WRITE_bKGD +# define PNG_WRITE_bKGD_SUPPORTED +# ifndef PNG_bKGD_SUPPORTED +# define PNG_bKGD_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_cHRM +# define PNG_WRITE_cHRM_SUPPORTED +# ifndef PNG_cHRM_SUPPORTED +# define PNG_cHRM_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_gAMA +# define PNG_WRITE_gAMA_SUPPORTED +# ifndef PNG_gAMA_SUPPORTED +# define PNG_gAMA_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_hIST +# define PNG_WRITE_hIST_SUPPORTED +# ifndef PNG_hIST_SUPPORTED +# define PNG_hIST_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iCCP +# define PNG_WRITE_iCCP_SUPPORTED +# ifndef PNG_iCCP_SUPPORTED +# define PNG_iCCP_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_iTXt +# ifndef PNG_WRITE_iTXt_SUPPORTED +# define PNG_WRITE_iTXt_SUPPORTED +# endif +# ifndef PNG_iTXt_SUPPORTED +# define PNG_iTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_oFFs +# define PNG_WRITE_oFFs_SUPPORTED +# ifndef PNG_oFFs_SUPPORTED +# define PNG_oFFs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pCAL +# define PNG_WRITE_pCAL_SUPPORTED +# ifndef PNG_pCAL_SUPPORTED +# define PNG_pCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sCAL +# define PNG_WRITE_sCAL_SUPPORTED +# ifndef PNG_sCAL_SUPPORTED +# define PNG_sCAL_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_pHYs +# define PNG_WRITE_pHYs_SUPPORTED +# ifndef PNG_pHYs_SUPPORTED +# define PNG_pHYs_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sBIT +# define PNG_WRITE_sBIT_SUPPORTED +# ifndef PNG_sBIT_SUPPORTED +# define PNG_sBIT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sPLT +# define PNG_WRITE_sPLT_SUPPORTED +# ifndef PNG_sPLT_SUPPORTED +# define PNG_sPLT_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_sRGB +# define PNG_WRITE_sRGB_SUPPORTED +# ifndef PNG_sRGB_SUPPORTED +# define PNG_sRGB_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tEXt +# define PNG_WRITE_tEXt_SUPPORTED +# ifndef PNG_tEXt_SUPPORTED +# define PNG_tEXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tIME +# define PNG_WRITE_tIME_SUPPORTED +# ifndef PNG_tIME_SUPPORTED +# define PNG_tIME_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_tRNS +# define PNG_WRITE_tRNS_SUPPORTED +# ifndef PNG_tRNS_SUPPORTED +# define PNG_tRNS_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_zTXt +# define PNG_WRITE_zTXt_SUPPORTED +# ifndef PNG_zTXt_SUPPORTED +# define PNG_zTXt_SUPPORTED +# endif +#endif +#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS +# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED +# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED +# define PNG_UNKNOWN_CHUNKS_SUPPORTED +# endif +# ifndef PNG_NO_HANDLE_AS_UNKNOWN +# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED +# endif +# endif +#endif +#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \ + defined(PNG_WRITE_zTXt_SUPPORTED) +# define PNG_WRITE_TEXT_SUPPORTED +# ifndef PNG_TEXT_SUPPORTED +# define PNG_TEXT_SUPPORTED +# endif +#endif + +#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */ + +/* Turn this off to disable png_read_png() and + * png_write_png() and leave the row_pointers member + * out of the info structure. + */ +#ifndef PNG_NO_INFO_IMAGE +# define PNG_INFO_IMAGE_SUPPORTED +#endif + +/* need the time information for reading tIME chunks */ +#if defined(PNG_tIME_SUPPORTED) +# if !defined(_WIN32_WCE) + /* "time.h" functions are not supported on WindowsCE */ +# include +# endif +#endif + +/* Some typedefs to get us started. These should be safe on most of the + * common platforms. The typedefs should be at least as large as the + * numbers suggest (a png_uint_32 must be at least 32 bits long), but they + * don't have to be exactly that size. Some compilers dislike passing + * unsigned shorts as function parameters, so you may be better off using + * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may + * want to have unsigned int for png_uint_32 instead of unsigned long. + */ + +typedef unsigned long png_uint_32; +typedef long png_int_32; +typedef unsigned short png_uint_16; +typedef short png_int_16; +typedef unsigned char png_byte; + +/* This is usually size_t. It is typedef'ed just in case you need it to + change (I'm not sure if you will or not, so I thought I'd be safe) */ +#ifdef PNG_SIZE_T + typedef PNG_SIZE_T png_size_t; +# define png_sizeof(x) png_convert_size(sizeof (x)) +#else + typedef size_t png_size_t; +# define png_sizeof(x) sizeof (x) +#endif + +/* The following is needed for medium model support. It cannot be in the + * PNG_INTERNAL section. Needs modification for other compilers besides + * MSC. Model independent support declares all arrays and pointers to be + * large using the far keyword. The zlib version used must also support + * model independent data. As of version zlib 1.0.4, the necessary changes + * have been made in zlib. The USE_FAR_KEYWORD define triggers other + * changes that are needed. (Tim Wegner) + */ + +/* Separate compiler dependencies (problem here is that zlib.h always + defines FAR. (SJT) */ +#ifdef __BORLANDC__ +# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__) +# define LDATA 1 +# else +# define LDATA 0 +# endif + /* GRR: why is Cygwin in here? Cygwin is not Borland C... */ +# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__) +# define PNG_MAX_MALLOC_64K +# if (LDATA != 1) +# ifndef FAR +# define FAR __far +# endif +# define USE_FAR_KEYWORD +# endif /* LDATA != 1 */ + /* Possibly useful for moving data out of default segment. + * Uncomment it if you want. Could also define FARDATA as + * const if your compiler supports it. (SJT) +# define FARDATA FAR + */ +# endif /* __WIN32__, __FLAT__, __CYGWIN__ */ +#endif /* __BORLANDC__ */ + + +/* Suggest testing for specific compiler first before testing for + * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM, + * making reliance oncertain keywords suspect. (SJT) + */ + +/* MSC Medium model */ +#if defined(FAR) +# if defined(M_I86MM) +# define USE_FAR_KEYWORD +# define FARDATA FAR +# include +# endif +#endif + +/* SJT: default case */ +#ifndef FAR +# define FAR +#endif + +/* At this point FAR is always defined */ +#ifndef FARDATA +# define FARDATA +#endif + +/* Typedef for floating-point numbers that are converted + to fixed-point with a multiple of 100,000, e.g., int_gamma */ +typedef png_int_32 png_fixed_point; + +/* Add typedefs for pointers */ +typedef void FAR * png_voidp; +typedef png_byte FAR * png_bytep; +typedef png_uint_32 FAR * png_uint_32p; +typedef png_int_32 FAR * png_int_32p; +typedef png_uint_16 FAR * png_uint_16p; +typedef png_int_16 FAR * png_int_16p; +typedef PNG_CONST char FAR * png_const_charp; +typedef char FAR * png_charp; +typedef png_fixed_point FAR * png_fixed_point_p; + +#ifndef PNG_NO_STDIO +#if defined(_WIN32_WCE) +typedef HANDLE png_FILE_p; +#else +typedef FILE * png_FILE_p; +#endif +#endif + +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * png_doublep; +#endif + +/* Pointers to pointers; i.e. arrays */ +typedef png_byte FAR * FAR * png_bytepp; +typedef png_uint_32 FAR * FAR * png_uint_32pp; +typedef png_int_32 FAR * FAR * png_int_32pp; +typedef png_uint_16 FAR * FAR * png_uint_16pp; +typedef png_int_16 FAR * FAR * png_int_16pp; +typedef PNG_CONST char FAR * FAR * png_const_charpp; +typedef char FAR * FAR * png_charpp; +typedef png_fixed_point FAR * FAR * png_fixed_point_pp; +#ifdef PNG_FLOATING_POINT_SUPPORTED +typedef double FAR * FAR * png_doublepp; +#endif + +/* Pointers to pointers to pointers; i.e., pointer to array */ +typedef char FAR * FAR * FAR * png_charppp; + +#if defined(PNG_1_0_X) || defined(PNG_1_2_X) +/* SPC - Is this stuff deprecated? */ +/* It'll be removed as of libpng-1.3.0 - GR-P */ +/* libpng typedefs for types in zlib. If zlib changes + * or another compression library is used, then change these. + * Eliminates need to change all the source files. + */ +typedef charf * png_zcharp; +typedef charf * FAR * png_zcharpp; +typedef z_stream FAR * png_zstreamp; +#endif /* (PNG_1_0_X) || defined(PNG_1_2_X) */ + +/* + * Define PNG_BUILD_DLL if the module being built is a Windows + * LIBPNG DLL. + * + * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL. + * It is equivalent to Microsoft predefined macro _DLL that is + * automatically defined when you compile using the share + * version of the CRT (C Run-Time library) + * + * The cygwin mods make this behavior a little different: + * Define PNG_BUILD_DLL if you are building a dll for use with cygwin + * Define PNG_STATIC if you are building a static library for use with cygwin, + * -or- if you are building an application that you want to link to the + * static library. + * PNG_USE_DLL is defined by default (no user action needed) unless one of + * the other flags is defined. + */ + +#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL)) +# define PNG_DLL +#endif +/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib. + * When building a static lib, default to no GLOBAL ARRAYS, but allow + * command-line override + */ +#if defined(__CYGWIN__) +# if !defined(PNG_STATIC) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +# else +# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS) +# if defined(PNG_USE_GLOBAL_ARRAYS) +# undef PNG_USE_GLOBAL_ARRAYS +# endif +# endif +# endif +# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# define PNG_USE_LOCAL_ARRAYS +# endif +#endif + +/* Do not use global arrays (helps with building DLL's) + * They are no longer used in libpng itself, since version 1.0.5c, + * but might be required for some pre-1.0.5c applications. + */ +#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS) +# if defined(PNG_NO_GLOBAL_ARRAYS) || \ + (defined(__GNUC__) && defined(PNG_DLL)) || defined(_MSC_VER) +# define PNG_USE_LOCAL_ARRAYS +# else +# define PNG_USE_GLOBAL_ARRAYS +# endif +#endif + +#if defined(__CYGWIN__) +# undef PNGAPI +# define PNGAPI __cdecl +# undef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +/* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", + * you may get warnings regarding the linkage of png_zalloc and png_zfree. + * Don't ignore those warnings; you must also reset the default calling + * convention in your compiler to match your PNGAPI, and you must build + * zlib and your applications the same way you build libpng. + */ + +#if defined(__MINGW32__) && !defined(PNG_MODULEDEF) +# ifndef PNG_NO_MODULEDEF +# define PNG_NO_MODULEDEF +# endif +#endif + +#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF) +# define PNG_IMPEXP +#endif + +#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \ + (( defined(_Windows) || defined(_WINDOWS) || \ + defined(WIN32) || defined(_WIN32) || defined(__WIN32__) )) + +# ifndef PNGAPI +# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800)) +# define PNGAPI __cdecl +# else +# define PNGAPI _cdecl +# endif +# endif + +# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \ + 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */) +# define PNG_IMPEXP +# endif + +# if !defined(PNG_IMPEXP) + +# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol +# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol + + /* Borland/Microsoft */ +# if defined(_MSC_VER) || defined(__BORLANDC__) +# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500) +# define PNG_EXPORT PNG_EXPORT_TYPE1 +# else +# define PNG_EXPORT PNG_EXPORT_TYPE2 +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __export +# else +# define PNG_IMPEXP /*__import */ /* doesn't exist AFAIK in + VC++ */ +# endif /* Exists in Borland C++ for + C++ classes (== huge) */ +# endif +# endif + +# if !defined(PNG_IMPEXP) +# if defined(PNG_BUILD_DLL) +# define PNG_IMPEXP __declspec(dllexport) +# else +# define PNG_IMPEXP __declspec(dllimport) +# endif +# endif +# endif /* PNG_IMPEXP */ +#else /* !(DLL || non-cygwin WINDOWS) */ +# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) +# ifndef PNGAPI +# define PNGAPI _System +# endif +# else +# if 0 /* ... other platforms, with other meanings */ +# endif +# endif +#endif + +#ifndef PNGAPI +# define PNGAPI +#endif +#ifndef PNG_IMPEXP +# define PNG_IMPEXP +#endif + +#ifdef PNG_BUILDSYMS +# ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_FUNCTION_EXPORT symbol END +# endif +# ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) PNG_DATA_EXPORT +# endif +# endif +#endif + +#ifndef PNG_EXPORT +# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol +#endif + +#ifdef PNG_USE_GLOBAL_ARRAYS +# ifndef PNG_EXPORT_VAR +# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type +# endif +#endif + +/* User may want to use these so they are not in PNG_INTERNAL. Any library + * functions that are passed far data must be model independent. + */ + +#ifndef PNG_ABORT +# define PNG_ABORT() abort() +#endif + +#ifdef PNG_SETJMP_SUPPORTED +# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf) +#else +# define png_jmpbuf(png_ptr) \ + (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED) +#endif + +#if defined(USE_FAR_KEYWORD) /* memory model independent fns */ +/* use this to make far-to-near assignments */ +# define CHECK 1 +# define NOCHECK 0 +# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK)) +# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK)) +# define png_snprintf _fsnprintf /* Added to v 1.2.19 */ +# define png_strlen _fstrlen +# define png_memcmp _fmemcmp /* SJT: added */ +# define png_memcpy _fmemcpy +# define png_memset _fmemset +#else /* use the usual functions */ +# define CVT_PTR(ptr) (ptr) +# define CVT_PTR_NOCHECK(ptr) (ptr) +# ifndef PNG_NO_SNPRINTF +# ifdef _MSC_VER +# define png_snprintf _snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 _snprintf +# define png_snprintf6 _snprintf +# else +# define png_snprintf snprintf /* Added to v 1.2.19 */ +# define png_snprintf2 snprintf +# define png_snprintf6 snprintf +# endif +# else + /* You don't have or don't want to use snprintf(). Caution: Using + * sprintf instead of snprintf exposes your application to accidental + * or malevolent buffer overflows. If you don't have snprintf() + * as a general rule you should provide one (you can get one from + * Portable OpenSSH). */ +# define png_snprintf(s1,n,fmt,x1) sprintf(s1,fmt,x1) +# define png_snprintf2(s1,n,fmt,x1,x2) sprintf(s1,fmt,x1,x2) +# define png_snprintf6(s1,n,fmt,x1,x2,x3,x4,x5,x6) \ + sprintf(s1,fmt,x1,x2,x3,x4,x5,x6) +# endif +# define png_strlen strlen +# define png_memcmp memcmp /* SJT: added */ +# define png_memcpy memcpy +# define png_memset memset +#endif +/* End of memory model independent support */ + +/* Just a little check that someone hasn't tried to define something + * contradictory. + */ +#if (PNG_ZBUF_SIZE > 65536L) && defined(PNG_MAX_MALLOC_64K) +# undef PNG_ZBUF_SIZE +# define PNG_ZBUF_SIZE 65536L +#endif + +/* Added at libpng-1.2.8 */ +#endif /* PNG_VERSION_INFO_ONLY */ + +#endif /* PNGCONF_H */ diff --git a/WadInstaller_Source/source/libpng/pngu/pngu.c b/WadInstaller_Source/source/libpng/pngu/pngu.c new file mode 100644 index 0000000..e2cfb7f --- /dev/null +++ b/WadInstaller_Source/source/libpng/pngu/pngu.c @@ -0,0 +1,1132 @@ +/******************************************************************************************** + +PNGU Version : 0.2a + +Coder : frontier + +More info : http://frontier-dev.net + +********************************************************************************************/ +#include +#include +#include "pngu.h" +#include "../png.h" + + +// Constants +#define PNGU_SOURCE_BUFFER 1 +#define PNGU_SOURCE_DEVICE 2 + + +// Prototypes of helper functions +int pngu_info (IMGCTX ctx); +int pngu_decode (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, PNGU_u32 stripAlpha); +void pngu_free_info (IMGCTX ctx); +void pngu_read_data_from_buffer (png_structp png_ptr, png_bytep data, png_size_t length); +void pngu_write_data_to_buffer (png_structp png_ptr, png_bytep data, png_size_t length); +void pngu_flush_data_to_buffer (png_structp png_ptr); +int pngu_clamp (int value, int min, int max); + + +// PNGU Image context struct +struct _IMGCTX +{ + int source; + void *buffer; + char *filename; + PNGU_u32 cursor; + + PNGU_u32 propRead; + PNGUPROP prop; + + PNGU_u32 infoRead; + png_structp png_ptr; + png_infop info_ptr; + FILE *fd; + + png_bytep *row_pointers; + png_bytep img_data; +}; + + +// PNGU Implementation // + +IMGCTX PNGU_SelectImageFromBuffer (const void *buffer) +{ + IMGCTX ctx = NULL; + + if (!buffer) + return NULL; + + ctx = malloc (sizeof (struct _IMGCTX)); + if (!ctx) + return NULL; + + ctx->buffer = (void *) buffer; + ctx->source = PNGU_SOURCE_BUFFER; + ctx->cursor = 0; + ctx->filename = NULL; + ctx->propRead = 0; + ctx->infoRead = 0; + + return ctx; +} + + +IMGCTX PNGU_SelectImageFromDevice (const char *filename) +{ + IMGCTX ctx = NULL; + + if (!filename) + return NULL; + + ctx = malloc (sizeof (struct _IMGCTX)); + if (!ctx) + return NULL; + + ctx->buffer = NULL; + ctx->source = PNGU_SOURCE_DEVICE; + ctx->cursor = 0; + + ctx->filename = malloc (strlen (filename) + 1); + if (!ctx->filename) + { + free (ctx); + return NULL; + } + strcpy(ctx->filename, filename); + + ctx->propRead = 0; + ctx->infoRead = 0; + + return ctx; +} + + +void PNGU_ReleaseImageContext (IMGCTX ctx) +{ + if (!ctx) + return; + + if (ctx->filename) + free (ctx->filename); + + if ((ctx->propRead) && (ctx->prop.trans)) + free (ctx->prop.trans); + + pngu_free_info (ctx); + + free (ctx); +} + + +int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *imgprop) +{ + int res; + + if (!ctx->propRead) + { + res = pngu_info (ctx); + if (res != PNGU_OK) + return res; + } + + *imgprop = ctx->prop; + + return PNGU_OK; +} + + +int PNGU_DecodeToYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) +{ + int result; + PNGU_u32 x, y, buffWidth; + + // width needs to be divisible by two + if (width % 2) + return PNGU_ODD_WIDTH; + + // stride needs to be divisible by two + if (stride % 2) + return PNGU_ODD_STRIDE; + + result = pngu_decode (ctx, width, height, 1); + if (result != PNGU_OK) + return result; + + // Copy image to the output buffer + buffWidth = (width + stride) / 2; + for (y = 0; y < height; y++) + for (x = 0; x < (width / 2); x++) + ((PNGU_u32 *)buffer)[y*buffWidth+x] = PNGU_RGB8_TO_YCbYCr (*(ctx->row_pointers[y]+x*6), *(ctx->row_pointers[y]+x*6+1), *(ctx->row_pointers[y]+x*6+2), + *(ctx->row_pointers[y]+x*6+3), *(ctx->row_pointers[y]+x*6+4), *(ctx->row_pointers[y]+x*6+5)); + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_DecodeToRGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) +{ + int result; + PNGU_u32 x, y, buffWidth; + + result = pngu_decode (ctx, width, height, 1); + if (result != PNGU_OK) + return result; + + buffWidth = width + stride; + + // Copy image to the output buffer + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + ((PNGU_u16 *)buffer)[y*buffWidth+x] = + (((PNGU_u16) (ctx->row_pointers[y][x*3] & 0xF8)) << 8) | + (((PNGU_u16) (ctx->row_pointers[y][x*3+1] & 0xFC)) << 3) | + (((PNGU_u16) (ctx->row_pointers[y][x*3+2] & 0xF8)) >> 3); + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_DecodeToRGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride, PNGU_u8 default_alpha) +{ + int result; + PNGU_u32 x, y, buffWidth; + + result = pngu_decode (ctx, width, height, 0); + if (result != PNGU_OK) + return result; + + buffWidth = width + stride; + + // Check is source image has an alpha channel + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) + { + // Alpha channel present, copy image to the output buffer + for (y = 0; y < height; y++) + memcpy (buffer + (y * buffWidth * 4), ctx->row_pointers[y], width * 4); + } + else + { + // No alpha channel present, copy image to the output buffer + for (y = 0; y < height; y++) + for (x = 0; x < width; x++) + ((PNGU_u32 *)buffer)[y*buffWidth+x] = + (((PNGU_u32) ctx->row_pointers[y][x*3]) << 24) | + (((PNGU_u32) ctx->row_pointers[y][x*3+1]) << 16) | + (((PNGU_u32) ctx->row_pointers[y][x*3+2]) << 8) | + ((PNGU_u32) default_alpha); + } + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_DecodeTo4x4RGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer) +{ + int result; + PNGU_u32 x, y, qwidth, qheight; + + // width and height need to be divisible by four + if ((width % 4) || (height % 4)) + return PNGU_INVALID_WIDTH_OR_HEIGHT; + + result = pngu_decode (ctx, width, height, 1); + if (result != PNGU_OK) + return result; + + // Copy image to the output buffer + qwidth = width / 4; + qheight = height / 4; + + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 4; + + PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); + PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase] = + (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | + (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | + (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | + (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+1] = + (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | + (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | + (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | + (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+2] = + (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | + (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | + (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | + (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+3] = + (((field64 & 0xF800000000000000ULL) | ((field64 & 0xFC000000000000ULL) << 3) | ((field64 & 0xF80000000000ULL) << 5)) | + (((field64 & 0xF800000000ULL) << 8) | ((field64 & 0xFC000000ULL) << 11) | ((field64 & 0xF80000ULL) << 13)) | + (((field64 & 0xF800ULL) << 16) | ((field64 & 0xFCULL) << 19) | ((field32 & 0xF8000000ULL) >> 11)) | + (((field32 & 0xF80000ULL) >> 8) | ((field32 & 0xFC00ULL) >> 5) | ((field32 & 0xF8ULL) >> 3))); + } + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_DecodeTo4x4RGB5A3 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha) +{ + int result; + PNGU_u32 x, y, qwidth, qheight; + PNGU_u64 alphaMask; + + // width and height need to be divisible by four + if ((width % 4) || (height % 4)) + return PNGU_INVALID_WIDTH_OR_HEIGHT; + + result = pngu_decode (ctx, width, height, 0); + if (result != PNGU_OK) + return result; + + // Init some vars + qwidth = width / 4; + qheight = height / 4; + + // Check is source image has an alpha channel + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) + { + // Alpha channel present, copy image to the output buffer + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 4; + PNGU_u64 tmp; + + PNGU_u64 fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16)); + PNGU_u64 fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16+8)); + // If first pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 + if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) + tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); + else + tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); + + // If second pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 + if ((fieldA & 0xE0ULL) == 0xE0ULL) + tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); + else + tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); + + // If third pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 + if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) + tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); + else + tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); + + // If fourth pixel is opaque set MSB to 1 and encode colors in RGB555, else set MSB to 0 and encode colors in ARGB3444 + if ((fieldB & 0xE0ULL) == 0xE0ULL) + tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); + else + tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); + ((PNGU_u64 *) buffer)[blockbase] = tmp; + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16+8)); + if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); + + if ((fieldA & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); + + if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); + + if ((fieldB & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); + ((PNGU_u64 *) buffer)[blockbase+1] = tmp; + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16+8)); + if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); + + if ((fieldA & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); + + if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); + + if ((fieldB & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); + ((PNGU_u64 *) buffer)[blockbase+2] = tmp; + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16+8)); + if ((fieldA & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = 0x8000000000000000ULL | ((fieldA & 0xF800000000000000ULL) >> 1) | ((fieldA & 0xF8000000000000ULL) << 2) | ((fieldA & 0xF80000000000ULL) << 5); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = ((fieldA & 0xE000000000ULL) << 23) | ((fieldA & 0xF000000000000000ULL) >> 4) | (fieldA & 0xF0000000000000ULL) | ((fieldA & 0xF00000000000ULL) << 4); + + if ((fieldA & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x800000000000ULL | ((fieldA & 0xF8000000ULL) << 15) | ((fieldA & 0xF80000ULL) << 18) | ((fieldA & 0xF800ULL) << 21); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldA & 0xE0ULL) << 39) | ((fieldA & 0xF0000000ULL) << 12) | ((fieldA & 0xF00000ULL) << 16) | ((fieldA & 0xF000ULL) << 20); + + if ((fieldB & 0xE000000000ULL) == 0xE000000000ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x80000000ULL | ((fieldB & 0xF800000000000000ULL) >> 33) | ((fieldB & 0xF8000000000000ULL) >> 30) | ((fieldB & 0xF80000000000ULL) >> 27); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE000000000ULL) >> 9) | ((fieldB & 0xF000000000000000ULL) >> 36) | ((fieldB & 0xF0000000000000ULL) >> 32) | ((fieldB & 0xF00000000000ULL) >> 28); + + if ((fieldB & 0xE0ULL) == 0xE0ULL) + // Opaque pixel, so set MSB to 1 and encode colors in RGB555 + tmp = tmp | 0x8000ULL | ((fieldB & 0xF8000000ULL) >> 17) | ((fieldB & 0xF80000ULL) >> 14) | ((fieldB & 0xF800ULL) >> 11); + else + // Tranlucid pixel, so set MSB to 0 and encode colors in ARGB3444 + tmp = tmp | ((fieldB & 0xE0ULL) << 7) | ((fieldB & 0xF0000000ULL) >> 20) | ((fieldB & 0xF00000ULL) >> 16) | ((fieldB & 0xF000ULL) >> 12); + ((PNGU_u64 *) buffer)[blockbase+3] = tmp; + } + } + else + { + // No alpha channel present, copy image to the output buffer + default_alpha = (default_alpha >> 5); + if (default_alpha == 7) + { + // The user wants an opaque texture, so set MSB to 1 and encode colors in RGB555 + alphaMask = 0x8000800080008000ULL; + + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 4; + + PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); + PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase] = + alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | + ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | + ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | + ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+1] = + alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | + ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | + ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | + ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+2] = + alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | + ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | + ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | + ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+3] = + alphaMask | ((field64 & 0xF800000000000000ULL) >> 1) | ((field64 & 0xF8000000000000ULL) << 2) | + ((field64 & 0xF80000000000ULL) << 5) | ((field64 & 0xF800000000ULL) << 7) | ((field64 & 0xF8000000ULL) << 10) | + ((field64 & 0xF80000ULL) << 13) | ((field64 & 0xF800ULL) << 15) | ((field64 & 0xF8ULL) << 18) | + ((field32 & 0xF8000000ULL) >> 11) | ((field32 & 0xF80000ULL) >> 9) | ((field32 & 0xF800ULL) >> 6) | ((field32 & 0xF8ULL) >> 3); + } + } + else + { + // The user wants a translucid texture, so set MSB to 0 and encode colors in ARGB3444 + default_alpha = (default_alpha << 4); + alphaMask = (((PNGU_u64) default_alpha) << 56) | (((PNGU_u64) default_alpha) << 40) | + (((PNGU_u64) default_alpha) << 24) | (((PNGU_u64) default_alpha) << 8); + + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 4; + + PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); + PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase] = + alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | + ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | + ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | + ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+1] = + alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | + ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | + ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | + ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+2] = + alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | + ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | + ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | + ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+3] = + alphaMask | ((field64 & 0xF000000000000000ULL) >> 4) | (field64 & 0xF0000000000000ULL) | ((field64 & 0xF00000000000ULL) << 4) | + ((field64 & 0xF000000000ULL) << 4) | ((field64 & 0xF0000000ULL) << 8) | ((field64 & 0xF00000ULL) << 12) | + ((field64 & 0xF000ULL) << 12) | ((field64 & 0xF0ULL) << 16) | ((field32 & 0xF0000000ULL) >> 12) | + ((field32 & 0xF00000ULL) >> 12) | ((field32 & 0xF000ULL) >> 8) | ((field32 & 0xF0ULL) >> 4); + } + } + } + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha) +{ + int result; + PNGU_u32 x, y, qwidth, qheight; + PNGU_u64 alphaMask; + + // width and height need to be divisible by four + if ((width % 4) || (height % 4)) + return PNGU_INVALID_WIDTH_OR_HEIGHT; + + result = pngu_decode (ctx, width, height, 0); + if (result != PNGU_OK) + return result; + + // Init some variables + qwidth = width / 4; + qheight = height / 4; + + // Check is source image has an alpha channel + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) ) + { + // Alpha channel present, copy image to the output buffer + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 8; + + PNGU_u64 fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16)); + PNGU_u64 fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*16+8)); + ((PNGU_u64 *) buffer)[blockbase] = + ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | + ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | + ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | + ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); + ((PNGU_u64 *) buffer)[blockbase+4] = + ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | + ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*16+8)); + ((PNGU_u64 *) buffer)[blockbase+1] = + ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | + ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | + ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | + ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); + ((PNGU_u64 *) buffer)[blockbase+5] = + ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | + ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*16+8)); + ((PNGU_u64 *) buffer)[blockbase+2] = + ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | + ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | + ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | + ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); + ((PNGU_u64 *) buffer)[blockbase+6] = + ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | + ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); + + fieldA = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16)); + fieldB = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*16+8)); + ((PNGU_u64 *) buffer)[blockbase+3] = + ((fieldA & 0xFF00000000ULL) << 24) | ((fieldA & 0xFF00000000000000ULL) >> 8) | + ((fieldA & 0xFFULL) << 40) | ((fieldA & 0xFF000000ULL) << 8) | + ((fieldB & 0xFF00000000ULL) >> 8) | ((fieldB & 0xFF00000000000000ULL) >> 40) | + ((fieldB & 0xFFULL) << 8) | ((fieldB & 0xFF000000ULL) >> 24); + ((PNGU_u64 *) buffer)[blockbase+7] = + ((fieldA & 0xFFFF0000000000ULL) << 8) | ((fieldA & 0xFFFF00ULL) << 24) | + ((fieldB & 0xFFFF0000000000ULL) >> 24) | ((fieldB & 0xFFFF00ULL) >> 8); + } + } + else + { + // No alpha channel present, copy image to the output buffer + alphaMask = (((PNGU_u64)default_alpha) << 56) | (((PNGU_u64)default_alpha) << 40) | + (((PNGU_u64)default_alpha) << 24) | (((PNGU_u64)default_alpha) << 8); + + for (y = 0; y < qheight; y++) + for (x = 0; x < qwidth; x++) + { + int blockbase = (y * qwidth + x) * 8; + + PNGU_u64 field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4]+x*12)); + PNGU_u64 field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase] = + (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | + ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); + ((PNGU_u64 *) buffer)[blockbase+4] = + (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | + ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+1]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+1]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+1] = + (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | + ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); + ((PNGU_u64 *) buffer)[blockbase+5] = + (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | + ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+2]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+2]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+2] = + (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | + ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); + ((PNGU_u64 *) buffer)[blockbase+6] = + (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | + ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); + + field64 = *((PNGU_u64 *)(ctx->row_pointers[y*4+3]+x*12)); + field32 = (PNGU_u64) *((PNGU_u32 *)(ctx->row_pointers[y*4+3]+x*12+8)); + ((PNGU_u64 *) buffer)[blockbase+3] = + (((field64 & 0xFF00000000000000ULL) >> 8) | (field64 & 0xFF00000000ULL) | + ((field64 & 0xFF00ULL) << 8) | ((field32 & 0xFF0000ULL) >> 16) | alphaMask); + ((PNGU_u64 *) buffer)[blockbase+7] = + (((field64 & 0xFFFF0000000000ULL) << 8) | ((field64 & 0xFFFF0000ULL) << 16) | + ((field64 & 0xFFULL) << 24) | ((field32 & 0xFF000000ULL) >> 8) | (field32 & 0xFFFFULL)); + } + } + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + + // Success + return PNGU_OK; +} + + +int PNGU_EncodeFromYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride) +{ + png_uint_32 rowbytes; + PNGU_u32 x, y, buffWidth; + + // Erase from the context any readed info + pngu_free_info (ctx); + ctx->propRead = 0; + + // Check if the user has selected a file to write the image + if (ctx->source == PNGU_SOURCE_BUFFER); + + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Open file + if (!(ctx->fd = fopen (ctx->filename, "wb"))) + return PNGU_CANT_OPEN_FILE; + } + + else + return PNGU_NO_FILE_SELECTED; + + // Allocation of libpng structs + ctx->png_ptr = png_create_write_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!(ctx->png_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + ctx->info_ptr = png_create_info_struct (ctx->png_ptr); + if (!(ctx->info_ptr)) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + if (ctx->source == PNGU_SOURCE_BUFFER) + { + // Installation of our custom data writer function + ctx->cursor = 0; + png_set_write_fn (ctx->png_ptr, ctx, pngu_write_data_to_buffer, pngu_flush_data_to_buffer); + } + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Default data writer uses function fwrite, so it needs to use our FILE* + png_init_io (ctx->png_ptr, ctx->fd); + } + + // Setup output file properties + png_set_IHDR (ctx->png_ptr, ctx->info_ptr, width, height, 8, PNG_COLOR_TYPE_RGB, + PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT); + + // Allocate memory to store the image in RGB format + rowbytes = width * 3; + if (rowbytes % 4) + rowbytes = ((rowbytes / 4) + 1) * 4; // Add extra padding so each row starts in a 4 byte boundary + + ctx->img_data = malloc (rowbytes * height); + if (!ctx->img_data) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + ctx->row_pointers = malloc (sizeof (png_bytep) * height); + if (!ctx->row_pointers) + { + png_destroy_write_struct (&(ctx->png_ptr), (png_infopp)NULL); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + // Encode YCbYCr image into RGB8 format + buffWidth = (width + stride) / 2; + for (y = 0; y < height; y++) + { + ctx->row_pointers[y] = ctx->img_data + (y * rowbytes); + + for (x = 0; x < (width / 2); x++) + PNGU_YCbYCr_TO_RGB8 ( ((PNGU_u32 *)buffer)[y*buffWidth+x], + ((PNGU_u8 *) ctx->row_pointers[y]+x*6), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+1), + ((PNGU_u8 *) ctx->row_pointers[y]+x*6+2), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+3), + ((PNGU_u8 *) ctx->row_pointers[y]+x*6+4), ((PNGU_u8 *) ctx->row_pointers[y]+x*6+5) ); + } + + // Tell libpng where is our image data + png_set_rows (ctx->png_ptr, ctx->info_ptr, ctx->row_pointers); + + // Write file header and image data + png_write_png (ctx->png_ptr, ctx->info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + + // Tell libpng we have no more data to write + png_write_end (ctx->png_ptr, (png_infop) NULL); + + // Free resources + free (ctx->img_data); + free (ctx->row_pointers); + png_destroy_write_struct (&(ctx->png_ptr), &(ctx->info_ptr)); + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + + // Success + return PNGU_OK; +} + + +// This function is taken from a libogc example +PNGU_u32 PNGU_RGB8_TO_YCbYCr (PNGU_u8 r1, PNGU_u8 g1, PNGU_u8 b1, PNGU_u8 r2, PNGU_u8 g2, PNGU_u8 b2) +{ + int y1, cb1, cr1, y2, cb2, cr2, cb, cr; + + y1 = (299 * r1 + 587 * g1 + 114 * b1) / 1000; + cb1 = (-16874 * r1 - 33126 * g1 + 50000 * b1 + 12800000) / 100000; + cr1 = (50000 * r1 - 41869 * g1 - 8131 * b1 + 12800000) / 100000; + + y2 = (299 * r2 + 587 * g2 + 114 * b2) / 1000; + cb2 = (-16874 * r2 - 33126 * g2 + 50000 * b2 + 12800000) / 100000; + cr2 = (50000 * r2 - 41869 * g2 - 8131 * b2 + 12800000) / 100000; + + cb = (cb1 + cb2) >> 1; + cr = (cr1 + cr2) >> 1; + + return (PNGU_u32) ((y1 << 24) | (cb << 16) | (y2 << 8) | cr); +} + + +void PNGU_YCbYCr_TO_RGB8 (PNGU_u32 ycbycr, PNGU_u8 *r1, PNGU_u8 *g1, PNGU_u8 *b1, PNGU_u8 *r2, PNGU_u8 *g2, PNGU_u8 *b2) +{ + PNGU_u8 *val = (PNGU_u8 *) &ycbycr; + int r, g, b; + + r = 1.371f * (val[3] - 128); + g = - 0.698f * (val[3] - 128) - 0.336f * (val[1] - 128); + b = 1.732f * (val[1] - 128); + + *r1 = pngu_clamp (val[0] + r, 0, 255); + *g1 = pngu_clamp (val[0] + g, 0, 255); + *b1 = pngu_clamp (val[0] + b, 0, 255); + + *r2 = pngu_clamp (val[2] + r, 0, 255); + *g2 = pngu_clamp (val[2] + g, 0, 255); + *b2 = pngu_clamp (val[2] + b, 0, 255); +} + + +int pngu_info (IMGCTX ctx) +{ + png_byte magic[8]; + png_uint_32 width; + png_uint_32 height; + png_color_16p background; + png_bytep trans; + png_color_16p trans_values; + int scale, i; + + // Check if there is a file selected and if it is a valid .png + if (ctx->source == PNGU_SOURCE_BUFFER) + memcpy (magic, ctx->buffer, 8); + + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Open file + if (!(ctx->fd = fopen (ctx->filename, "rb"))) + return PNGU_CANT_OPEN_FILE; + + // Load first 8 bytes into magic buffer + if (fread (magic, 1, 8, ctx->fd) != 8) + { + fclose (ctx->fd); + return PNGU_CANT_READ_FILE; + } + } + + else + return PNGU_NO_FILE_SELECTED;; + + if (png_sig_cmp(magic, 0, 8) != 0) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_FILE_IS_NOT_PNG; + } + + // Allocation of libpng structs + ctx->png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!(ctx->png_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + return PNGU_LIB_ERROR; + } + + ctx->info_ptr = png_create_info_struct (ctx->png_ptr); + if (!(ctx->info_ptr)) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + png_destroy_read_struct (&(ctx->png_ptr), (png_infopp)NULL, (png_infopp)NULL); + return PNGU_LIB_ERROR; + } + + if (ctx->source == PNGU_SOURCE_BUFFER) + { + // Installation of our custom data provider function + ctx->cursor = 0; + png_set_read_fn (ctx->png_ptr, ctx, pngu_read_data_from_buffer); + } + else if (ctx->source == PNGU_SOURCE_DEVICE) + { + // Default data provider uses function fread, so it needs to use our FILE* + png_init_io (ctx->png_ptr, ctx->fd); + png_set_sig_bytes (ctx->png_ptr, 8); // We have read 8 bytes already to check PNG authenticity + } + + // Read png header + png_read_info (ctx->png_ptr, ctx->info_ptr); + + // Query image properties if they have not been queried before + if (!ctx->propRead) + { + png_get_IHDR(ctx->png_ptr, ctx->info_ptr, &width, &height, + (int *) &(ctx->prop.imgBitDepth), + (int *) &(ctx->prop.imgColorType), + NULL, NULL, NULL); + + ctx->prop.imgWidth = width; + ctx->prop.imgHeight = height; + switch (ctx->prop.imgColorType) + { + case PNG_COLOR_TYPE_GRAY: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY; + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_GRAY_ALPHA; + break; + case PNG_COLOR_TYPE_PALETTE: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_PALETTE; + break; + case PNG_COLOR_TYPE_RGB: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB; + break; + case PNG_COLOR_TYPE_RGB_ALPHA: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_RGB_ALPHA; + break; + default: + ctx->prop.imgColorType = PNGU_COLOR_TYPE_UNKNOWN; + break; + } + + // Constant used to scale 16 bit values to 8 bit values + scale = 1; + if (ctx->prop.imgBitDepth == 16) + scale = 256; + + // Query background color, if any. + ctx->prop.validBckgrnd = 0; + if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA)) && + (png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background))) + { + ctx->prop.validBckgrnd = 1; + ctx->prop.bckgrnd.r = background->red / scale; + ctx->prop.bckgrnd.g = background->green / scale; + ctx->prop.bckgrnd.b = background->blue / scale; + } + else if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA)) && + (png_get_bKGD (ctx->png_ptr, ctx->info_ptr, &background))) + { + ctx->prop.validBckgrnd = 1; + ctx->prop.bckgrnd.r = ctx->prop.bckgrnd.g = ctx->prop.bckgrnd.b = background->gray / scale; + } + + // Query list of transparent colors, if any. + ctx->prop.numTrans = 0; + ctx->prop.trans = NULL; + if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA)) && + (png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values))) + { + if (ctx->prop.numTrans) + { + ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctx->prop.numTrans); + if (ctx->prop.trans) + for (i = 0; i < ctx->prop.numTrans; i++) + { + ctx->prop.trans[i].r = trans_values[i].red / scale; + ctx->prop.trans[i].g = trans_values[i].green / scale; + ctx->prop.trans[i].b = trans_values[i].blue / scale; + } + else + ctx->prop.numTrans = 0; + } + } + else if (((ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA)) && + (png_get_tRNS (ctx->png_ptr, ctx->info_ptr, &trans, (int *) &(ctx->prop.numTrans), &trans_values))) + { + if (ctx->prop.numTrans) + { + ctx->prop.trans = malloc (sizeof (PNGUCOLOR) * ctx->prop.numTrans); + if (ctx->prop.trans) + for (i = 0; i < ctx->prop.numTrans; i++) + ctx->prop.trans[i].r = ctx->prop.trans[i].g = ctx->prop.trans[i].b = + trans_values[i].gray / scale; + else + ctx->prop.numTrans = 0; + } + } + + ctx->propRead = 1; + } + + // Success + ctx->infoRead = 1; + + return PNGU_OK; +} + + +int pngu_decode (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, PNGU_u32 stripAlpha) +{ + png_uint_32 rowbytes; + int i; + + // Read info if it hasn't been read before + if (!ctx->infoRead) + { + i = pngu_info (ctx); + if (i != PNGU_OK) + return i; + } + + // Check if the user has specified the real width and height of the image + if ( (ctx->prop.imgWidth != width) || (ctx->prop.imgHeight != height) ) + return PNGU_INVALID_WIDTH_OR_HEIGHT; + + // Check if color type is supported by PNGU + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_PALETTE) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_UNKNOWN) ) + return PNGU_UNSUPPORTED_COLOR_TYPE; + + // Scale 16 bit samples to 8 bit + if (ctx->prop.imgBitDepth == 16) + png_set_strip_16 (ctx->png_ptr); + + // Remove alpha channel if we don't need it + if (stripAlpha && ((ctx->prop.imgColorType == PNGU_COLOR_TYPE_RGB_ALPHA) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA))) + png_set_strip_alpha (ctx->png_ptr); + + // Expand 1, 2 and 4 bit samples to 8 bit + if (ctx->prop.imgBitDepth < 8) + png_set_packing (ctx->png_ptr); + + // Transform grayscale images to RGB + if ( (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY) || (ctx->prop.imgColorType == PNGU_COLOR_TYPE_GRAY_ALPHA) ) + png_set_gray_to_rgb (ctx->png_ptr); + + // Flush transformations + png_read_update_info (ctx->png_ptr, ctx->info_ptr); + + // Allocate memory to store the image + rowbytes = png_get_rowbytes (ctx->png_ptr, ctx->info_ptr); + if (rowbytes % 4) + rowbytes = ((rowbytes / 4) + 1) * 4; // Add extra padding so each row starts in a 4 byte boundary + + ctx->img_data = malloc (rowbytes * ctx->prop.imgHeight); + if (!ctx->img_data) + { + pngu_free_info (ctx); + return PNGU_LIB_ERROR; + } + + ctx->row_pointers = malloc (sizeof (png_bytep) * ctx->prop.imgHeight); + if (!ctx->row_pointers) + { + free (ctx->img_data); + pngu_free_info (ctx); + return PNGU_LIB_ERROR; + } + + for (i = 0; i < ctx->prop.imgHeight; i++) + ctx->row_pointers[i] = ctx->img_data + (i * rowbytes); + + // Transform the image and copy it to our allocated memory + png_read_image (ctx->png_ptr, ctx->row_pointers); + + // Free resources + pngu_free_info (ctx); + + // Success + return PNGU_OK; +} + + +void pngu_free_info (IMGCTX ctx) +{ + if (ctx->infoRead) + { + if (ctx->source == PNGU_SOURCE_DEVICE) + fclose (ctx->fd); + + png_destroy_read_struct (&(ctx->png_ptr), &(ctx->info_ptr), (png_infopp)NULL); + + ctx->infoRead = 0; + } +} + + +// Custom data provider function used for reading from memory buffers. +void pngu_read_data_from_buffer (png_structp png_ptr, png_bytep data, png_size_t length) +{ + IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); + memcpy (data, ctx->buffer + ctx->cursor, length); + ctx->cursor += length; +} + + +// Custom data writer function used for writing to memory buffers. +void pngu_write_data_to_buffer (png_structp png_ptr, png_bytep data, png_size_t length) +{ + IMGCTX ctx = (IMGCTX) png_get_io_ptr (png_ptr); + memcpy (ctx->buffer + ctx->cursor, data, length); + ctx->cursor += length; +} + + +// Custom data flusher function used for writing to memory buffers. +void pngu_flush_data_to_buffer (png_structp png_ptr) +{ + // Nothing to do here +} + + +// Function used in YCbYCr to RGB decoding +int pngu_clamp (int value, int min, int max) +{ + if (value < min) + value = min; + else if (value > max) + value = max; + + return value; +} + diff --git a/WadInstaller_Source/source/libpng/pngu/pngu.h b/WadInstaller_Source/source/libpng/pngu/pngu.h new file mode 100644 index 0000000..b5e172b --- /dev/null +++ b/WadInstaller_Source/source/libpng/pngu/pngu.h @@ -0,0 +1,171 @@ +/******************************************************************************************** + +PNGU Version : 0.2a + +Coder : frontier + +More info : http://frontier-dev.net + +********************************************************************************************/ +#ifndef __PNGU__ +#define __PNGU__ + +// Return codes +#define PNGU_OK 0 +#define PNGU_ODD_WIDTH 1 +#define PNGU_ODD_STRIDE 2 +#define PNGU_INVALID_WIDTH_OR_HEIGHT 3 +#define PNGU_FILE_IS_NOT_PNG 4 +#define PNGU_UNSUPPORTED_COLOR_TYPE 5 +#define PNGU_NO_FILE_SELECTED 6 +#define PNGU_CANT_OPEN_FILE 7 +#define PNGU_CANT_READ_FILE 8 +#define PNGU_LIB_ERROR 9 + +// Color types +#define PNGU_COLOR_TYPE_GRAY 1 +#define PNGU_COLOR_TYPE_GRAY_ALPHA 2 +#define PNGU_COLOR_TYPE_PALETTE 3 +#define PNGU_COLOR_TYPE_RGB 4 +#define PNGU_COLOR_TYPE_RGB_ALPHA 5 +#define PNGU_COLOR_TYPE_UNKNOWN 6 + + +#ifdef __cplusplus + extern "C" { +#endif + +// Types +typedef unsigned char PNGU_u8; +typedef unsigned short PNGU_u16; +typedef unsigned int PNGU_u32; +typedef unsigned long long PNGU_u64; + +typedef struct +{ + PNGU_u8 r; + PNGU_u8 g; + PNGU_u8 b; +} PNGUCOLOR; + +typedef struct +{ + PNGU_u32 imgWidth; // In pixels + PNGU_u32 imgHeight; // In pixels + PNGU_u32 imgBitDepth; // In bitx + PNGU_u32 imgColorType; // PNGU_COLOR_TYPE_* + PNGU_u32 validBckgrnd; // Non zero if there is a background color + PNGUCOLOR bckgrnd; // Backgroun color + PNGU_u32 numTrans; // Number of transparent colors + PNGUCOLOR *trans; // Transparent colors +} PNGUPROP; + +// Image context, always initialize with SelectImageFrom* and free with ReleaseImageContext +struct _IMGCTX; +typedef struct _IMGCTX *IMGCTX; + + +/**************************************************************************** +* Pixel conversion * +****************************************************************************/ + +// Macro to convert RGB8 values to RGB565 +#define PNGU_RGB8_TO_RGB565(r,g,b) ( ((((PNGU_u16) r) & 0xF8U) << 8) | ((((PNGU_u16) g) & 0xFCU) << 3) | (((PNGU_u16) b) >> 3) ) + +// Macro to convert RGBA8 values to RGB5A3 +#define PNGU_RGB8_TO_RGB5A3(r,g,b,a) (PNGU_u16) (((a & 0xE0U) == 0xE0U) ? \ + (0x8000U | ((((PNGU_u16) r) & 0xF8U) << 7) | ((((PNGU_u16) g) & 0xF8U) << 2) | (((PNGU_u16) b) >> 3)) : \ + (((((PNGU_u16) a) & 0xE0U) << 7) | ((((PNGU_u16) r) & 0xF0U) << 4) | (((PNGU_u16) g) & 0xF0U) | ((((PNGU_u16) b) & 0xF0U) >> 4))) + +// Function to convert two RGB8 values to YCbYCr +PNGU_u32 PNGU_RGB8_TO_YCbYCr (PNGU_u8 r1, PNGU_u8 g1, PNGU_u8 b1, PNGU_u8 r2, PNGU_u8 g2, PNGU_u8 b2); + +// Function to convert an YCbYCr to two RGB8 values. +void PNGU_YCbYCr_TO_RGB8 (PNGU_u32 ycbycr, PNGU_u8 *r1, PNGU_u8 *g1, PNGU_u8 *b1, PNGU_u8 *r2, PNGU_u8 *g2, PNGU_u8 *b2); + + +/**************************************************************************** +* Image context handling * +****************************************************************************/ + +// Selects a PNG file, previosly loaded into a buffer, and creates an image context for subsequent procesing. +IMGCTX PNGU_SelectImageFromBuffer (const void *buffer); + +// Selects a PNG file, from any devoptab device, and creates an image context for subsequent procesing. +IMGCTX PNGU_SelectImageFromDevice (const char *filename); + +// Frees resources associated with an image context. Always call this function when you no longer need the IMGCTX. +void PNGU_ReleaseImageContext (IMGCTX ctx); + + +/**************************************************************************** +* Miscelaneous * +****************************************************************************/ + +// Retrieves info from selected PNG file, including image dimensions, color format, background and transparency colors. +int PNGU_GetImageProperties (IMGCTX ctx, PNGUPROP *fileproperties); + + +/**************************************************************************** +* Image conversion * +****************************************************************************/ + +// Expands selected image into an YCbYCr buffer. You need to specify context, image dimensions, +// destination address and stride in pixels (stride = buffer width - image width). +int PNGU_DecodeToYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); + +// Macro for decoding an image inside a buffer at given coordinates. +#define PNGU_DECODE_TO_COORDS_YCbYCr(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ + \ + PNGU_DecodeToYCbYCr (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ + (coordX) * 2, (bufferWidth) - (imgWidth)) + +// Expands selected image into a linear RGB565 buffer. You need to specify context, image dimensions, +// destination address and stride in pixels (stride = buffer width - image width). +int PNGU_DecodeToRGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); + +// Macro for decoding an image inside a buffer at given coordinates. +#define PNGU_DECODE_TO_COORDS_RGB565(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ + \ + PNGU_DecodeToRGB565 (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ + (coordX) * 2, (bufferWidth) - (imgWidth)) + +// Expands selected image into a linear RGBA8 buffer. You need to specify context, image dimensions, +// destination address, stride in pixels and default alpha value, which is used if the source image +// doesn't have an alpha channel. +int PNGU_DecodeToRGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride, PNGU_u8 default_alpha); + +// Macro for decoding an image inside a buffer at given coordinates. +#define PNGU_DECODE_TO_COORDS_RGBA8(ctx,coordX,coordY,imgWidth,imgHeight,default_alpha,bufferWidth,bufferHeight,buffer) \ + \ + PNGU_DecodeToRGBA8 (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ + (coordX) * 2, (bufferWidth) - (imgWidth), default_alpha) + +// Expands selected image into a 4x4 tiled RGB565 buffer. You need to specify context, image dimensions +// and destination address. +int PNGU_DecodeTo4x4RGB565 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer); + +// Expands selected image into a 4x4 tiled RGB5A3 buffer. You need to specify context, image dimensions, +// destination address and default alpha value, which is used if the source image doesn't have an alpha channel. +int PNGU_DecodeTo4x4RGB5A3 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha); + +// Expands selected image into a 4x4 tiled RGBA8 buffer. You need to specify context, image dimensions, +// destination address and default alpha value, which is used if the source image doesn't have an alpha channel. +int PNGU_DecodeTo4x4RGBA8 (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u8 default_alpha); + +// Encodes an YCbYCr image in PNG format and stores it in the selected device or memory buffer. You need to +// specify context, image dimensions, destination address and stride in pixels (stride = buffer width - image width). +int PNGU_EncodeFromYCbYCr (IMGCTX ctx, PNGU_u32 width, PNGU_u32 height, void *buffer, PNGU_u32 stride); + +// Macro for encoding an image stored into an YCbYCr buffer at given coordinates. +#define PNGU_ENCODE_TO_COORDS_YCbYCr(ctx,coordX,coordY,imgWidth,imgHeight,bufferWidth,bufferHeight,buffer) \ + \ + PNGU_EncodeFromYCbYCr (ctx, imgWidth, imgHeight, ((void *) buffer) + (coordY) * (bufferWidth) * 2 + \ + (coordX) * 2, (bufferWidth) - (imgWidth)) + +#ifdef __cplusplus + } +#endif + +#endif + diff --git a/WadInstaller_Source/source/menu.c b/WadInstaller_Source/source/menu.c new file mode 100644 index 0000000..313506c --- /dev/null +++ b/WadInstaller_Source/source/menu.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include + +#include "fat.h" +#include "restart.h" +#include "title.h" +#include "utils.h" +#include "video.h" +#include "wad.h" +#include "wpad.h" + +/* Constants */ +#define CIOS_VERSION 249 + +void LoadSelectedIOS() +{ + u8 selectedIOS = Wad_SelectIOS(); + + s32 ret; + ret = IOS_ReloadIOS(selectedIOS); + if (ret<0) + { + printf("\nUsing default IOS"); + } else + { + printf("\nUsing selected IOS %d\n", selectedIOS); + } +} + +void Menu_Loop(void) +{ + Wad_InstallFromMemory(); +} diff --git a/WadInstaller_Source/source/menu.h b/WadInstaller_Source/source/menu.h new file mode 100644 index 0000000..c3ba917 --- /dev/null +++ b/WadInstaller_Source/source/menu.h @@ -0,0 +1,9 @@ +#ifndef _MENU_H_ +#define _MENU_H_ + +/* Prototypes */ +void Menu_Loop(void); +void LoadSelectedIOS(void); + +#endif + diff --git a/WadInstaller_Source/source/restart.c b/WadInstaller_Source/source/restart.c new file mode 100644 index 0000000..0660ac8 --- /dev/null +++ b/WadInstaller_Source/source/restart.c @@ -0,0 +1,33 @@ +#include +#include + +#include "sys.h" +#include "wpad.h" + + +void Restart(void) +{ + printf("\n Restarting Wii..."); + fflush(stdout); + + /* Load system menu */ + Sys_LoadMenu(); +} + +void Restart_Wait(void) +{ + printf("\n"); + + printf(" Press any button to restart..."); + fflush(stdout); + + /* Wait for button */ + Wpad_WaitButtons(); + + printf(" Restarting Wii..."); + fflush(stdout); + + /* Load system menu */ + Sys_LoadMenu(); +} + diff --git a/WadInstaller_Source/source/restart.h b/WadInstaller_Source/source/restart.h new file mode 100644 index 0000000..3df94d7 --- /dev/null +++ b/WadInstaller_Source/source/restart.h @@ -0,0 +1,8 @@ +#ifndef _RESTART_H_ +#define _RESTART_H_ + +/* Prototypes */ +void Restart(void); +void Restart_Wait(void); + +#endif diff --git a/WadInstaller_Source/source/sha1.c b/WadInstaller_Source/source/sha1.c new file mode 100644 index 0000000..83a533a --- /dev/null +++ b/WadInstaller_Source/source/sha1.c @@ -0,0 +1,172 @@ +/* +SHA-1 in C +By Steve Reid +100% Public Domain + +Test Vectors (from FIPS PUB 180-1) +"abc" + A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D +"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 +A million repetitions of "a" + 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F +*/ + +/* #define LITTLE_ENDIAN * This should be #define'd if true. */ +#define SHA1HANDSOFF + +#include +#include +#include "sha1.h" + +#define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) + +/* blk0() and blk() perform the initial expand. */ +/* I got the idea of expanding during the round function from SSLeay */ +#ifdef LITTLE_ENDIAN +#define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ + |(rol(block->l[i],8)&0x00FF00FF)) +#else +#define blk0(i) block->l[i] +#endif +#define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ + ^block->l[(i+2)&15]^block->l[i&15],1)) + +/* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ +#define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); +#define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); +#define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); +#define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); + + +/* Hash a single 512-bit block. This is the core of the algorithm. */ + +void SHA1Transform(unsigned long state[5], unsigned char buffer[64]) +{ +unsigned long a, b, c, d, e; +typedef union { + unsigned char c[64]; + unsigned long l[16]; +} CHAR64LONG16; +CHAR64LONG16* block; +#ifdef SHA1HANDSOFF +static unsigned char workspace[64]; + block = (CHAR64LONG16*)workspace; + memcpy(block, buffer, 64); +#else + block = (CHAR64LONG16*)buffer; +#endif + /* Copy context->state[] to working vars */ + a = state[0]; + b = state[1]; + c = state[2]; + d = state[3]; + e = state[4]; + /* 4 rounds of 20 operations each. Loop unrolled. */ + R0(a,b,c,d,e, 0); R0(e,a,b,c,d, 1); R0(d,e,a,b,c, 2); R0(c,d,e,a,b, 3); + R0(b,c,d,e,a, 4); R0(a,b,c,d,e, 5); R0(e,a,b,c,d, 6); R0(d,e,a,b,c, 7); + R0(c,d,e,a,b, 8); R0(b,c,d,e,a, 9); R0(a,b,c,d,e,10); R0(e,a,b,c,d,11); + R0(d,e,a,b,c,12); R0(c,d,e,a,b,13); R0(b,c,d,e,a,14); R0(a,b,c,d,e,15); + R1(e,a,b,c,d,16); R1(d,e,a,b,c,17); R1(c,d,e,a,b,18); R1(b,c,d,e,a,19); + R2(a,b,c,d,e,20); R2(e,a,b,c,d,21); R2(d,e,a,b,c,22); R2(c,d,e,a,b,23); + R2(b,c,d,e,a,24); R2(a,b,c,d,e,25); R2(e,a,b,c,d,26); R2(d,e,a,b,c,27); + R2(c,d,e,a,b,28); R2(b,c,d,e,a,29); R2(a,b,c,d,e,30); R2(e,a,b,c,d,31); + R2(d,e,a,b,c,32); R2(c,d,e,a,b,33); R2(b,c,d,e,a,34); R2(a,b,c,d,e,35); + R2(e,a,b,c,d,36); R2(d,e,a,b,c,37); R2(c,d,e,a,b,38); R2(b,c,d,e,a,39); + R3(a,b,c,d,e,40); R3(e,a,b,c,d,41); R3(d,e,a,b,c,42); R3(c,d,e,a,b,43); + R3(b,c,d,e,a,44); R3(a,b,c,d,e,45); R3(e,a,b,c,d,46); R3(d,e,a,b,c,47); + R3(c,d,e,a,b,48); R3(b,c,d,e,a,49); R3(a,b,c,d,e,50); R3(e,a,b,c,d,51); + R3(d,e,a,b,c,52); R3(c,d,e,a,b,53); R3(b,c,d,e,a,54); R3(a,b,c,d,e,55); + R3(e,a,b,c,d,56); R3(d,e,a,b,c,57); R3(c,d,e,a,b,58); R3(b,c,d,e,a,59); + R4(a,b,c,d,e,60); R4(e,a,b,c,d,61); R4(d,e,a,b,c,62); R4(c,d,e,a,b,63); + R4(b,c,d,e,a,64); R4(a,b,c,d,e,65); R4(e,a,b,c,d,66); R4(d,e,a,b,c,67); + R4(c,d,e,a,b,68); R4(b,c,d,e,a,69); R4(a,b,c,d,e,70); R4(e,a,b,c,d,71); + R4(d,e,a,b,c,72); R4(c,d,e,a,b,73); R4(b,c,d,e,a,74); R4(a,b,c,d,e,75); + R4(e,a,b,c,d,76); R4(d,e,a,b,c,77); R4(c,d,e,a,b,78); R4(b,c,d,e,a,79); + /* Add the working vars back into context.state[] */ + state[0] += a; + state[1] += b; + state[2] += c; + state[3] += d; + state[4] += e; + /* Wipe variables */ + a = b = c = d = e = 0; +} + + +/* SHA1Init - Initialize new context */ + +void SHA1Init(SHA1_CTX* context) +{ + /* SHA1 initialization constants */ + context->state[0] = 0x67452301; + context->state[1] = 0xEFCDAB89; + context->state[2] = 0x98BADCFE; + context->state[3] = 0x10325476; + context->state[4] = 0xC3D2E1F0; + context->count[0] = context->count[1] = 0; +} + + +/* Run your data through this. */ + +void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len) +{ +unsigned int i, j; + + j = (context->count[0] >> 3) & 63; + if ((context->count[0] += len << 3) < (len << 3)) context->count[1]++; + context->count[1] += (len >> 29); + if ((j + len) > 63) { + memcpy(&context->buffer[j], data, (i = 64-j)); + SHA1Transform(context->state, context->buffer); + for ( ; i + 63 < len; i += 64) { + SHA1Transform(context->state, &data[i]); + } + j = 0; + } + else i = 0; + memcpy(&context->buffer[j], &data[i], len - i); +} + + +/* Add padding and return the message digest. */ + +void SHA1Final(unsigned char digest[20], SHA1_CTX* context) +{ +unsigned long i, j; +unsigned char finalcount[8]; + + for (i = 0; i < 8; i++) { + finalcount[i] = (unsigned char)((context->count[(i >= 4 ? 0 : 1)] + >> ((3-(i & 3)) * 8) ) & 255); /* Endian independent */ + } + SHA1Update(context, (unsigned char *)"\200", 1); + while ((context->count[0] & 504) != 448) { + SHA1Update(context, (unsigned char *)"\0", 1); + } + SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ + for (i = 0; i < 20; i++) { + digest[i] = (unsigned char) + ((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255); + } + /* Wipe variables */ + i = j = 0; + memset(context->buffer, 0, 64); + memset(context->state, 0, 20); + memset(context->count, 0, 8); + memset(&finalcount, 0, 8); +#ifdef SHA1HANDSOFF /* make SHA1Transform overwrite it's own static vars */ + SHA1Transform(context->state, context->buffer); +#endif +} + +void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf) { + SHA1_CTX ctx; + + SHA1Init(&ctx); + SHA1Update(&ctx, ptr, size); + SHA1Final(outbuf, &ctx); +} + diff --git a/WadInstaller_Source/source/sha1.h b/WadInstaller_Source/source/sha1.h new file mode 100644 index 0000000..757af1c --- /dev/null +++ b/WadInstaller_Source/source/sha1.h @@ -0,0 +1,12 @@ +typedef struct { + unsigned long state[5]; + unsigned long count[2]; + unsigned char buffer[64]; +} SHA1_CTX; + +void SHA1Transform(unsigned long state[5], unsigned char buffer[64]); +void SHA1Init(SHA1_CTX* context); +void SHA1Update(SHA1_CTX* context, unsigned char* data, unsigned int len); +void SHA1Final(unsigned char digest[20], SHA1_CTX* context); + +void SHA1(unsigned char *ptr, unsigned int size, unsigned char *outbuf); diff --git a/WadInstaller_Source/source/stub.S b/WadInstaller_Source/source/stub.S new file mode 100644 index 0000000..418c838 --- /dev/null +++ b/WadInstaller_Source/source/stub.S @@ -0,0 +1,6 @@ + .rodata + + .globl bgData + .balign 32 +bgData: + .incbin "../data/background" diff --git a/WadInstaller_Source/source/sys.c b/WadInstaller_Source/source/sys.c new file mode 100644 index 0000000..c9e7723 --- /dev/null +++ b/WadInstaller_Source/source/sys.c @@ -0,0 +1,98 @@ +#include +#include +#include + +#include "sys.h" + +/* Constants */ +#define CERTS_LEN 0x280 + +/* Variables */ +static const char certs_fs[] ATTRIBUTE_ALIGN(32) = "/sys/cert.sys"; + + +void __Sys_ResetCallback(void) +{ + /* Reboot console */ + Sys_Reboot(); +} + +void __Sys_PowerCallback(void) +{ + /* Poweroff console */ + Sys_Shutdown(); +} + + +void Sys_Init(void) +{ + /* Initialize video subsytem */ + VIDEO_Init(); + + /* Set RESET/POWER button callback */ + SYS_SetResetCallback(__Sys_ResetCallback); + SYS_SetPowerCallback(__Sys_PowerCallback); +} + +void Sys_Reboot(void) +{ + /* Restart console */ + STM_RebootSystem(); +} + +void Sys_Shutdown(void) +{ + /* Poweroff console */ + if(CONF_GetShutdownMode() == CONF_SHUTDOWN_IDLE) { + s32 ret; + + /* Set LED mode */ + ret = CONF_GetIdleLedMode(); + if(ret >= 0 && ret <= 2) + STM_SetLedMode(ret); + + /* Shutdown to idle */ + STM_ShutdownToIdle(); + } else { + /* Shutdown to standby */ + STM_ShutdownToStandby(); + } +} + +void Sys_LoadMenu(void) +{ + u32 *stub = (u32 *)0x80001800; + + /* Homebrew Channel stub */ + if (*stub) + exit(0); + + /* Return to the Wii system menu */ + SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); +} + +s32 Sys_GetCerts(signed_blob **certs, u32 *len) +{ + static signed_blob certificates[CERTS_LEN] ATTRIBUTE_ALIGN(32); + + s32 fd, ret; + + /* Open certificates file */ + fd = IOS_Open(certs_fs, 1); + if (fd < 0) + return fd; + + /* Read certificates */ + ret = IOS_Read(fd, certificates, sizeof(certificates)); + + /* Close file */ + IOS_Close(fd); + + /* Set values */ + if (ret > 0) { + *certs = certificates; + *len = sizeof(certificates); + } + + return ret; +} diff --git a/WadInstaller_Source/source/sys.h b/WadInstaller_Source/source/sys.h new file mode 100644 index 0000000..cfbf604 --- /dev/null +++ b/WadInstaller_Source/source/sys.h @@ -0,0 +1,11 @@ +#ifndef _SYS_H_ +#define _SYS_H_ + +/* Prototypes */ +void Sys_Init(void); +void Sys_Reboot(void); +void Sys_Shutdown(void); +void Sys_LoadMenu(void); +s32 Sys_GetCerts(signed_blob **, u32 *); + +#endif diff --git a/WadInstaller_Source/source/title.c b/WadInstaller_Source/source/title.c new file mode 100644 index 0000000..0d05bd9 --- /dev/null +++ b/WadInstaller_Source/source/title.c @@ -0,0 +1,256 @@ +#include +#include +#include +#include +#include + +#include "utils.h" + + +s32 Title_GetList(u64 **outbuf, u32 *outlen) +{ + u64 *titles = NULL; + + u32 len, nb_titles; + s32 ret; + + /* Get number of titles */ + ret = ES_GetNumTitles(&nb_titles); + if (ret < 0) + return ret; + + /* Calculate buffer lenght */ + len = round_up(sizeof(u64) * nb_titles, 32); + + /* Allocate memory */ + titles = memalign(32, len); + if (!titles) + return -1; + + /* Get titles */ + ret = ES_GetTitles(titles, nb_titles); + if (ret < 0) + goto err; + + /* Set values */ + *outbuf = titles; + *outlen = nb_titles; + + return 0; + +err: + /* Free memory */ + if (titles) + free(titles); + + return ret; +} + +s32 Title_GetTicketViews(u64 tid, tikview **outbuf, u32 *outlen) +{ + tikview *views = NULL; + + u32 nb_views; + s32 ret; + + /* Get number of ticket views */ + ret = ES_GetNumTicketViews(tid, &nb_views); + if (ret < 0) + return ret; + + /* Allocate memory */ + views = (tikview *)memalign(32, sizeof(tikview) * nb_views); + if (!views) + return -1; + + /* Get ticket views */ + ret = ES_GetTicketViews(tid, views, nb_views); + if (ret < 0) + goto err; + + /* Set values */ + *outbuf = views; + *outlen = nb_views; + + return 0; + +err: + /* Free memory */ + if (views) + free(views); + + return ret; +} + +s32 Title_GetTMD(u64 tid, signed_blob **outbuf, u32 *outlen) +{ + void *p_tmd = NULL; + + u32 len; + s32 ret; + + /* Get TMD size */ + ret = ES_GetStoredTMDSize(tid, &len); + if (ret < 0) + return ret; + + /* Allocate memory */ + p_tmd = memalign(32, round_up(len, 32)); + if (!p_tmd) + return -1; + + /* Read TMD */ + ret = ES_GetStoredTMD(tid, p_tmd, len); + if (ret < 0) + goto err; + + /* Set values */ + *outbuf = p_tmd; + *outlen = len; + + return 0; + +err: + /* Free memory */ + if (p_tmd) + free(p_tmd); + + return ret; +} + +s32 Title_GetVersion(u64 tid, u16 *outbuf) +{ + signed_blob *p_tmd = NULL; + tmd *tmd_data = NULL; + + u32 len; + s32 ret; + + /* Get title TMD */ + ret = Title_GetTMD(tid, &p_tmd, &len); + if (ret < 0) + return ret; + + /* Retrieve TMD info */ + tmd_data = (tmd *)SIGNATURE_PAYLOAD(p_tmd); + + /* Set values */ + *outbuf = tmd_data->title_version; + + /* Free memory */ + free(p_tmd); + + return 0; +} + +s32 Title_GetSysVersion(u64 tid, u64 *outbuf) +{ + signed_blob *p_tmd = NULL; + tmd *tmd_data = NULL; + + u32 len; + s32 ret; + + /* Get title TMD */ + ret = Title_GetTMD(tid, &p_tmd, &len); + if (ret < 0) + return ret; + + /* Retrieve TMD info */ + tmd_data = (tmd *)SIGNATURE_PAYLOAD(p_tmd); + + /* Set values */ + *outbuf = tmd_data->sys_version; + + /* Free memory */ + free(p_tmd); + + return 0; +} + +s32 Title_GetSize(u64 tid, u32 *outbuf) +{ + signed_blob *p_tmd = NULL; + tmd *tmd_data = NULL; + + u32 cnt, len, size = 0; + s32 ret; + + /* Get title TMD */ + ret = Title_GetTMD(tid, &p_tmd, &len); + if (ret < 0) + return ret; + + /* Retrieve TMD info */ + tmd_data = (tmd *)SIGNATURE_PAYLOAD(p_tmd); + + /* Calculate title size */ + for (cnt = 0; cnt < tmd_data->num_contents; cnt++) { + tmd_content *content = &tmd_data->contents[cnt]; + + /* Add content size */ + size += content->size; + } + + /* Set values */ + *outbuf = size; + + /* Free memory */ + free(p_tmd); + + return 0; +} + +s32 Title_GetIOSVersions(u8 **outbuf, u32 *outlen) +{ + u8 *buffer = NULL; + u64 *list = NULL; + + u32 count, cnt, idx; + s32 ret; + + /* Get title list */ + ret = Title_GetList(&list, &count); + if (ret < 0) + return ret; + + /* Count IOS */ + for (cnt = idx = 0; idx < count; idx++) { + u32 tidh = (list[idx] >> 32); + u32 tidl = (list[idx] & 0xFFFFFFFF); + + /* Title is IOS */ + if ((tidh == 0x1) && (tidl >= 3) && (tidl <= 255)) + cnt++; + } + + /* Allocate memory */ + buffer = (u8 *)memalign(32, cnt); + if (!buffer) { + ret = -1; + goto out; + } + + /* Copy IOS */ + for (cnt = idx = 0; idx < count; idx++) { + u32 tidh = (list[idx] >> 32); + u32 tidl = (list[idx] & 0xFFFFFFFF); + + /* Title is IOS */ + if ((tidh == 0x1) && (tidl >= 3) && (tidl <= 255)) + buffer[cnt++] = (u8)(tidl & 0xFF); + } + + /* Set values */ + *outbuf = buffer; + *outlen = cnt; + + goto out; + +out: + /* Free memory */ + if (list) + free(list); + + return ret; +} diff --git a/WadInstaller_Source/source/title.h b/WadInstaller_Source/source/title.h new file mode 100644 index 0000000..5d1c573 --- /dev/null +++ b/WadInstaller_Source/source/title.h @@ -0,0 +1,16 @@ +#ifndef _TITLE_H_ +#define _TITLE_H_ + +/* Constants */ +#define BLOCK_SIZE 1024 + +/* Prototypes */ +s32 Title_GetList(u64 **, u32 *); +s32 Title_GetTicketViews(u64, tikview **, u32 *); +s32 Title_GetTMD(u64, signed_blob **, u32 *); +s32 Title_GetVersion(u64, u16 *); +s32 Title_GetSysVersion(u64, u64 *); +s32 Title_GetSize(u64, u32 *); +s32 Title_GetIOSVersions(u8 **, u32 *); + +#endif diff --git a/WadInstaller_Source/source/utils.h b/WadInstaller_Source/source/utils.h new file mode 100644 index 0000000..3a4862b --- /dev/null +++ b/WadInstaller_Source/source/utils.h @@ -0,0 +1,15 @@ +#ifndef _UTILS_H_ +#define _UTILS_H_ + +/* Constants */ +#define KB_SIZE 1024.0 +#define MB_SIZE 1048576.0 +#define GB_SIZE 1073741824.0 + +/* Macros */ +#define round_up(x,n) (-(-(x) & -(n))) + +/* Prototypes */ +u32 swap32(u32); + +#endif diff --git a/WadInstaller_Source/source/video.c b/WadInstaller_Source/source/video.c new file mode 100644 index 0000000..0182671 --- /dev/null +++ b/WadInstaller_Source/source/video.c @@ -0,0 +1,141 @@ +#include +#include + +#include "sys.h" +#include "video.h" + +/* Video variables */ +static void *framebuffer = NULL; +static GXRModeObj *vmode = NULL; + + +void Con_Init(u32 x, u32 y, u32 w, u32 h) +{ + /* Create console in the framebuffer */ + CON_InitEx(vmode, x, y, w, h); +} + +void Con_Clear(void) +{ + /* Clear console */ + printf("\x1b[2J"); + fflush(stdout); +} + +void Con_ClearLine(void) +{ + s32 cols, rows; + u32 cnt; + + printf("\r"); + fflush(stdout); + + /* Get console metrics */ + CON_GetMetrics(&cols, &rows); + + /* Erase line */ + for (cnt = 1; cnt < cols; cnt++) { + printf(" "); + fflush(stdout); + } + + printf("\r"); + fflush(stdout); +} + +void Con_FgColor(u32 color, u8 bold) +{ + /* Set foreground color */ + printf("\x1b[%u;%um", color + 30, bold); + fflush(stdout); +} + +void Con_BgColor(u32 color, u8 bold) +{ + /* Set background color */ + printf("\x1b[%u;%um", color + 40, bold); + fflush(stdout); +} + +void Con_FillRow(u32 row, u32 color, u8 bold) +{ + s32 cols, rows; + u32 cnt; + + /* Set color */ + printf("\x1b[%u;%um", color + 40, bold); + fflush(stdout); + + /* Get console metrics */ + CON_GetMetrics(&cols, &rows); + + /* Save current row and col */ + printf("\x1b[s"); + fflush(stdout); + + /* Move to specified row */ + printf("\x1b[%u;0H", row); + fflush(stdout); + + /* Fill row */ + for (cnt = 0; cnt < cols; cnt++) { + printf(" "); + fflush(stdout); + } + + /* Load saved row and col */ + printf("\x1b[u"); + fflush(stdout); + + /* Set default color */ + Con_BgColor(0, 0); + Con_FgColor(7, 1); +} + +void Video_Configure(GXRModeObj *rmode) +{ + /* Configure the video subsystem */ + VIDEO_Configure(rmode); + + /* Setup video */ + VIDEO_SetBlack(FALSE); + VIDEO_Flush(); + VIDEO_WaitVSync(); + + if (rmode->viTVMode & VI_NON_INTERLACE) + VIDEO_WaitVSync(); +} + +void Video_SetMode(void) +{ + /* Select preferred video mode */ + vmode = VIDEO_GetPreferredMode(NULL); + + /* Allocate memory for the framebuffer */ + framebuffer = MEM_K0_TO_K1(SYS_AllocateFramebuffer(vmode)); + + /* Configure the video subsystem */ + VIDEO_Configure(vmode); + + /* Setup video */ + VIDEO_SetNextFramebuffer(framebuffer); + VIDEO_SetBlack(FALSE); + VIDEO_Flush(); + VIDEO_WaitVSync(); + + if (vmode->viTVMode & VI_NON_INTERLACE) + VIDEO_WaitVSync(); + + /* Clear the screen */ + Video_Clear(COLOR_BLACK); +} + +void Video_Clear(s32 color) +{ + VIDEO_ClearFrameBuffer(vmode, framebuffer, color); +} + +void Video_DrawPng(IMGCTX ctx, PNGUPROP imgProp, u16 x, u16 y) +{ + PNGU_DECODE_TO_COORDS_YCbYCr(ctx, x, y, imgProp.imgWidth, imgProp.imgHeight, vmode->fbWidth, vmode->xfbHeight, framebuffer); +} diff --git a/WadInstaller_Source/source/video.h b/WadInstaller_Source/source/video.h new file mode 100644 index 0000000..e0fb7fd --- /dev/null +++ b/WadInstaller_Source/source/video.h @@ -0,0 +1,19 @@ +#ifndef _VIDEO_H_ +#define _VIDEO_H_ + +#include "libpng/pngu/pngu.h" + +/* Prototypes */ +void Con_Init(u32, u32, u32, u32); +void Con_Clear(void); +void Con_ClearLine(void); +void Con_FgColor(u32, u8); +void Con_BgColor(u32, u8); +void Con_FillRow(u32, u32, u8); + +void Video_Configure(GXRModeObj *); +void Video_SetMode(void); +void Video_Clear(s32); +void Video_DrawPng(IMGCTX, PNGUPROP, u16, u16); + +#endif diff --git a/WadInstaller_Source/source/wad-manager.c b/WadInstaller_Source/source/wad-manager.c new file mode 100644 index 0000000..92453d2 --- /dev/null +++ b/WadInstaller_Source/source/wad-manager.c @@ -0,0 +1,72 @@ +#include +#include +#include +#include + +#include "gui.h" +#include "menu.h" +#include "restart.h" +#include "sys.h" +#include "video.h" +#include "wpad.h" + + +void Disclaimer(void) +{ + /* Print disclaimer */ + printf(" [DISCLAIMER]:\n\n"); + + printf(" THIS APPLICATION COMES WITH NO WARRANTY AT ALL,\n"); + printf(" NEITHER EXPRESS NOR IMPLIED.\n"); + printf(" I DO NOT TAKE ANY RESPONSIBILITY FOR ANY DAMAGE IN YOUR\n"); + printf(" WII CONSOLE BECAUSE OF A IMPROPER USAGE OF THIS SOFTWARE.\n\n"); + + printf(">> If you agree and install the streamed wad\n"); + printf(">> press A button to continue.\n"); + printf(">> Otherwise, press B button to restart your Wii.\n"); + + /* Wait for user answer */ + for (;;) { + u32 buttons = Wpad_WaitButtons(); + + /* A button */ + if ((buttons & WPAD_BUTTON_A)||(buttons & PAD_BUTTON_A)) + break; + + /* B button */ + if ((buttons & WPAD_BUTTON_B)||(buttons & WPAD_CLASSIC_BUTTON_B)) + Restart(); + } +} + +int main(int argc, char **argv) +{ + /* Initialize subsystems */ + Sys_Init(); + + /* Set video mode */ + Video_SetMode(); + + /* Initialize console */ + Gui_InitConsole(); + + /* Draw background */ + Gui_DrawBackground(); + + /* Load Selected IOS */ + LoadSelectedIOS(); + + /* Initialize Wiimote */ + Wpad_Init(); + + /* Print disclaimer */ + Disclaimer(); + + /* Menu loop */ + Menu_Loop(); + + /* Restart Wii */ + Restart_Wait(); + + return 0; +} diff --git a/WadInstaller_Source/source/wad.c b/WadInstaller_Source/source/wad.c new file mode 100644 index 0000000..76b7151 --- /dev/null +++ b/WadInstaller_Source/source/wad.c @@ -0,0 +1,375 @@ +#include +#include +#include +#include +#include + +#include "title.h" +#include "utils.h" +#include "video.h" +#include "wad.h" +#include "sha1.h" +#include "install.h" + + +/* 'WAD Header' structure */ +typedef struct { + /* Header length */ + u32 header_len; + + /* WAD type */ + u16 type; + + u16 padding; + + /* Data length */ + u32 certs_len; + u32 crl_len; + u32 tik_len; + u32 tmd_len; + u32 data_len; + u32 footer_len; +} ATTRIBUTE_PACKED wadHeader; + +/* Variables */ +static u8 wadBuffer[BLOCK_SIZE] ATTRIBUTE_ALIGN(32); + +void * startOfData; +void * endOfData; +void * internalPointer; + +void mopen(void * memPointer) +{ + u32 size = *((u32 * ) memPointer); + startOfData = memPointer + 28; + endOfData = startOfData + size; + internalPointer = startOfData; +} + + +int mseek(u32 offset, int origin) +{ + if (origin == SEEK_SET) + { + internalPointer = startOfData + offset; + } else if (origin == SEEK_CUR) + { + internalPointer = internalPointer + offset; + } else if (origin == SEEK_END) { + internalPointer = endOfData - offset; + } else + { + return -2; + } + + if ((internalPointer endOfData)) + { + return -1; + } else + { + return 0; + } +} + +int mread(void * buf, int size, int count) +{ + memcpy(buf, internalPointer, size*count); + //DCFlushRange(buf, size*count); + return 0; +} + + +//-------------------------- INSTALL FROM MEMORY ------------------------------- + +s32 __Wad_ReadFile(void *outbuf, u32 offset, u32 len) +{ + s32 ret; + + /* Seek to offset */ + mseek(offset, SEEK_SET); + + /* Read data */ + ret = mread(outbuf, len, 1); + if (ret < 0) + return ret; + + return 0; +} + +s32 __Wad_ReadAlloc(void **outbuf, u32 offset, u32 len) +{ + void *buffer = NULL; + s32 ret; + + /* Allocate memory */ + buffer = memalign(32, len); + if (!buffer) + return -1; + + /* Read file */ + ret = __Wad_ReadFile(buffer, offset, len); + if (ret < 0) { + free(buffer); + return ret; + } + + /* Set pointer */ + *outbuf = buffer; + + return 0; +} + +s32 __Wad_GetTitleID(wadHeader *header, u64 *tid) +{ + signed_blob *p_tik = NULL; + tik *tik_data = NULL; + + u32 offset = 0; + s32 ret; + + /* Ticket offset */ + offset += round_up(header->header_len, 64); + offset += round_up(header->certs_len, 64); + offset += round_up(header->crl_len, 64); + + /* Read ticket */ + ret = __Wad_ReadAlloc((void *)&p_tik, offset, header->tik_len); + if (ret < 0) + goto out; + + /* Ticket data */ + tik_data = (tik *)SIGNATURE_PAYLOAD(p_tik); + + /* Copy title ID */ + *tid = tik_data->titleid; + +out: + /* Free memory */ + if (p_tik) + free(p_tik); + + return ret; +} + + +s32 __Wad_Install() +{ + wadHeader *header = NULL; + signed_blob *p_certs = NULL, *p_crl = NULL, *p_tik = NULL, *p_tmd = NULL; + + tmd *tmd_data = NULL; + + u32 cnt, offset = 0; + s32 ret; + + printf("\t\t>> Reading WAD data..."); + fflush(stdout); + + /* WAD header */ + ret = __Wad_ReadAlloc((void *)&header, offset, sizeof(wadHeader)); + if (ret < 0) + goto err; + else + offset += round_up(header->header_len, 64); + + /* WAD certificates */ + ret = __Wad_ReadAlloc((void *)&p_certs, offset, header->certs_len); + if (ret < 0) + goto err; + else + offset += round_up(header->certs_len, 64); + + /* WAD crl */ + if (header->crl_len) { + ret = __Wad_ReadAlloc((void *)&p_crl, offset, header->crl_len); + if (ret < 0) + goto err; + else + offset += round_up(header->crl_len, 64); + } + + /* WAD ticket */ + ret = __Wad_ReadAlloc((void *)&p_tik, offset, header->tik_len); + if (ret < 0) + goto err; + else + offset += round_up(header->tik_len, 64); + + /* WAD TMD */ + ret = __Wad_ReadAlloc((void *)&p_tmd, offset, header->tmd_len); + if (ret < 0) + goto err; + else + offset += round_up(header->tmd_len, 64); + + Con_ClearLine(); + + printf("\t\t>> Installing ticket..."); + fflush(stdout); + + /* Install ticket */ + ret = ES_AddTicket(p_tik, header->tik_len, p_certs, header->certs_len, p_crl, header->crl_len); + if (ret < 0) + goto err; + + Con_ClearLine(); + + printf("\r\t\t>> Installing title..."); + fflush(stdout); + + /* Install title */ + ret = ES_AddTitleStart(p_tmd, header->tmd_len, p_certs, header->certs_len, p_crl, header->crl_len); + if (ret < 0) + goto err; + + /* Get TMD info */ + tmd_data = (tmd *)SIGNATURE_PAYLOAD(p_tmd); + + /* Install contents */ + for (cnt = 0; cnt < tmd_data->num_contents; cnt++) { + tmd_content *content = &tmd_data->contents[cnt]; + + u32 idx = 0, len; + s32 cfd; + + Con_ClearLine(); + + printf("\r\t\t>> Installing content #%02d...", content->cid); + fflush(stdout); + + /* Encrypted content size */ + len = round_up(content->size, 64); + + /* Install content */ + cfd = ES_AddContentStart(tmd_data->title_id, content->cid); + if (cfd < 0) { + ret = cfd; + goto err; + } + + /* Install content data */ + while (idx < len) { + u32 size; + + /* Data length */ + size = (len - idx); + if (size > BLOCK_SIZE) + size = BLOCK_SIZE; + + /* Read data */ + ret = __Wad_ReadFile(&wadBuffer, offset, size); + if (ret < 0) + goto err; + + /* Install data */ + ret = ES_AddContentData(cfd, wadBuffer, size); + if (ret < 0) + goto err; + + /* Increase variables */ + idx += size; + offset += size; + } + + /* Finish content installation */ + ret = ES_AddContentFinish(cfd); + if (ret < 0) + goto err; + } + + Con_ClearLine(); + + printf("\r\t\t>> Finishing installation..."); + fflush(stdout); + + /* Finish title install */ + ret = ES_AddTitleFinish(); + if (ret >= 0) { + printf(" OK!\n"); + goto out; + } + +err: + printf(" ERROR! (ret = %d)\n", ret); + + /* Cancel install */ + ES_AddTitleCancel(); + +out: + /* Free memory */ + if (header) + free(header); + if (p_certs) + free(p_certs); + if (p_crl) + free(p_crl); + if (p_tik) + free(p_tik); + if (p_tmd) + free(p_tmd); + + return ret; +} + + +void DumpHash(u8 * hash) +{ + int i; + for (i=0;i<20;i++) + { + printf("%x", hash[i]); + } +} + +s32 CompareHashes(u8 * hash1, u8 * hash2) +{ + + printf("\nCalculated SHA1 Hash: "); DumpHash(hash1); + printf("\nStored SHA1 Hash : "); DumpHash(hash2); + sleep(3); + + if (memcmp(hash1, hash2, 20)==0) + { + return 1; + } + else + { + return 0; + } +} + +s32 Wad_EnsureInjectedData() +{ + u32 size = *((u32 * ) install); + u8 wadOffset = 28; + + u8 hash1[20]; + + SHA1(((u8 *)install)+wadOffset, size , hash1); //Taking SHA of contents... + + return CompareHashes(hash1, ((u8 *)install)+4); +} + +s32 Wad_InstallFromMemory() +{ + /* Check integrity of the wad file using SHA */ + /* SHA digest of the installed wad will be from XX-XX region in the injected data */ + printf("\n"); + printf("\r\t\t>> Checking integrity of the contents..."); + if (Wad_EnsureInjectedData()) + { + printf("\n\n\t\t>> Wad file integrity check succeeded\n\n"); + mopen(install); + return __Wad_Install(); + } else + { + printf("\n\n\t\t>> Wad file integrity check failed! Will not install the wad, possible corruption during transfer..."); + } +} + +u8 Wad_SelectIOS() +{ + u8 iosOffset = 24; + return *(install+iosOffset); + +} \ No newline at end of file diff --git a/WadInstaller_Source/source/wad.h b/WadInstaller_Source/source/wad.h new file mode 100644 index 0000000..1471fdf --- /dev/null +++ b/WadInstaller_Source/source/wad.h @@ -0,0 +1,8 @@ +#ifndef _WAD_H_ +#define _WAD_H_ + +/* Prototypes */ +s32 Wad_InstallFromMemory(); +u8 Wad_SelectIOS(void); + +#endif diff --git a/WadInstaller_Source/source/wpad.c b/WadInstaller_Source/source/wpad.c new file mode 100644 index 0000000..2f50b9a --- /dev/null +++ b/WadInstaller_Source/source/wpad.c @@ -0,0 +1,81 @@ +#include +#include + +#include "sys.h" +#include "wpad.h" + +/* Constants */ +#define MAX_WIIMOTES 4 + + +void __Wpad_PowerCallback(s32 chan) +{ + /* Poweroff console */ + Sys_Shutdown(); +} + + +s32 Wpad_Init(void) +{ + s32 ret; + + /* Initialize GC Pads */ + + ret = PAD_Init(); + if (ret < 0) + return ret; + + /* Initialize Wiimote subsystem */ + ret = WPAD_Init(); + if (ret < 0) + return ret; + + /* Set POWER button callback */ + WPAD_SetPowerButtonCallback(__Wpad_PowerCallback); + + return ret; +} + +void Wpad_Disconnect(void) +{ + u32 cnt; + + /* Disconnect Wiimotes */ + for (cnt = 0; cnt < MAX_WIIMOTES; cnt++) + WPAD_Disconnect(cnt); + + /* Shutdown Wiimote subsystem */ + WPAD_Shutdown(); +} + +u32 Wpad_GetButtons(void) +{ + u32 buttons = 0, cnt; + + /* Scan pads */ + WPAD_ScanPads(); + + /* Get pressed buttons */ + for (cnt = 0; cnt < MAX_WIIMOTES; cnt++) + buttons |= WPAD_ButtonsDown(cnt); + + return buttons; +} + +u32 Wpad_WaitButtons(void) +{ + u32 buttons = 0; + + /* Wait for button pressing */ + while (!buttons) { + buttons = Wpad_GetButtons(); + if (!buttons) + { + PAD_ScanPads(); + buttons = PAD_ButtonsDown(0); + } + VIDEO_WaitVSync(); + } + + return buttons; +} diff --git a/WadInstaller_Source/source/wpad.h b/WadInstaller_Source/source/wpad.h new file mode 100644 index 0000000..63053bb --- /dev/null +++ b/WadInstaller_Source/source/wpad.h @@ -0,0 +1,12 @@ +#ifndef _WPAD_H_ +#define _WPAD_H_ + +#include + +/* Prototypes */ +s32 Wpad_Init(void); +void Wpad_Disconnect(void); +u32 Wpad_GetButtons(void); +u32 Wpad_WaitButtons(void); + +#endif