From nobody Fri Jul 22 00:44:48 2022 X-Original-To: dev-commits-ports-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4LprLT1Pm1z4Wl9r; Fri, 22 Jul 2022 00:44:49 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4LprLT14g8z3Kvh; Fri, 22 Jul 2022 00:44:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1658450689; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GV9lpZX+W2zNLiJLV3j1LqXzD5xHSbx8DEvI0CCNX3Y=; b=C1gBdwdfxK7Edyfc++xhFqi+09GErweEuI6AAqyzJRcuJHGATM9iC0KD9ach+GjyPANuYE D3SzvhA+i1m1L9k0n9AV8D+KTWfVk7vWS6O+DJVsqz8KELIvXlt1rAG8htQC7q92jz1uQM WO6UVy9gT4j0tj9Wh2vXlfdNMmmDPI5krAmOZckbMZqreqiaYFsLZS44WwKrOG5k4kmzjf J3f8cCh1GKs4mi2FxYY4FujLdpysh91KpDootki2izxS6Hm2ZGsrPx6vlJcAuyozuIlmKZ OYkZsQEP9wwvZWUf6YvScK5WHI2tMvsVN+U5fGCgZ+8tsP9PKqnrCZXRuplg+w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4LprLS748kzhvD; Fri, 22 Jul 2022 00:44:48 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 26M0imo2004081; Fri, 22 Jul 2022 00:44:48 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 26M0imUd004080; Fri, 22 Jul 2022 00:44:48 GMT (envelope-from git) Date: Fri, 22 Jul 2022 00:44:48 GMT Message-Id: <202207220044.26M0imUd004080@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Olivier Cochard Subject: git: 0c4ac5e1b2ee - main - graphics/openfx-arena: Update to 2.4.3 and fix build List-Id: Commits to the main branch of the FreeBSD ports repository List-Archive: https://lists.freebsd.org/archives/dev-commits-ports-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-ports-main@freebsd.org X-BeenThere: dev-commits-ports-main@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: olivier X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 0c4ac5e1b2ee5c25a44b190566345b61e3ae9791 Auto-Submitted: auto-generated ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1658450689; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=GV9lpZX+W2zNLiJLV3j1LqXzD5xHSbx8DEvI0CCNX3Y=; b=ueyAGsiPj+rN2W2eYXJIakiAZTksSRBFg/pyU1S7YR0oO7xfwY4nRCLEnWcGSLHZezeFvQ Xm2oDnqnirH2FwbXj2tIPRubg+H2cQ5Eudokv5V+eW5xKbFFGmpuEmYKQnxkPUXsjGNHjT ctdWZbmDt9T3gcU2NtTK/UhA4Fh6BHpgkdHquPu4N/GQnZdXHGefUoquLQih7trVGzc37V ydPPtuCVFQp9qPJseHNXEpb04DaIZGNos8IOaKE5TeznKW9vXxEoyDpFUmvfFe9iGmcoGg 3JcULD0+4UrO7jRRjuCoGpG4sQ6n2iU7VCzxhROH9Try8jtXUBPyl4yqHjxZQQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1658450689; a=rsa-sha256; cv=none; b=ssgo1LzFm66rlh2PQTJfyPvt/8kDOAcly+NXYDKlvm8KUVF9UaN4o864YF7BEYAfi5/dND o6fsQvz4fYlxa5P1WHvJm7x9m4+LO9D2Ena5Z3626xpFO7vC/3Q6RJG0ThRQ1BFAUhqOfK p7F4/DyAgZfM3yrAmoMkDrcIioNDw9kz58oM1LGqlTJhCWCDa1F2hFP+jx6ZoxlnwaLSKg Thxw/XwsyTD4DpkKUu3eapU5J7QBigGdtWgH1GdJzB2sTDkhupOLR+GozcwEybLr2M5zpl ZfxkRaiuIiWFO5d2cBjaUc8adWvZN5EbCAOt9D96Sh3UWdwBsr1MMDVUoE/f5Q== ARC-Authentication-Results: i=1; mx1.freebsd.org; none X-ThisMailContainsUnwantedMimeParts: N The branch main has been updated by olivier: URL: https://cgit.FreeBSD.org/ports/commit/?id=0c4ac5e1b2ee5c25a44b190566345b61e3ae9791 commit 0c4ac5e1b2ee5c25a44b190566345b61e3ae9791 Author: Olivier Cochard AuthorDate: 2022-07-22 00:42:11 +0000 Commit: Olivier Cochard CommitDate: 2022-07-22 00:44:20 +0000 graphics/openfx-arena: Update to 2.4.3 and fix build PR: 265166 Reported by: pkg-fallout --- graphics/openfx-arena/Makefile | 27 +- graphics/openfx-arena/distinfo | 30 +- graphics/openfx-arena/files/patch-Bundle_Makefile | 18 - .../openfx-arena/files/patch-Bundle_lodepng.cpp | 6226 -------------------- graphics/openfx-arena/files/patch-Bundle_lodepng.h | 1762 ------ .../openfx-arena/files/patch-Extra_ReadPDF.cpp | 13 - graphics/openfx-arena/files/patch-Makefile.master | 10 - graphics/openfx-arena/pkg-plist | 2 + 8 files changed, 29 insertions(+), 8059 deletions(-) diff --git a/graphics/openfx-arena/Makefile b/graphics/openfx-arena/Makefile index db857e90e129..a1d27d47d088 100644 --- a/graphics/openfx-arena/Makefile +++ b/graphics/openfx-arena/Makefile @@ -1,23 +1,18 @@ PORTNAME= openfx-arena -PORTVERSION= 2.3.14 +PORTVERSION= 2.4.3 DISTVERSIONPREFIX= Natron- -PORTREVISION= 56 CATEGORIES= graphics -PATCH_SITES= https://github.com/${GH_ACCOUNT}/${GH_PROJECT}/commit/ -PATCHFILES= bc06a46bb1ccef8f7da6caf17faf165fbac662db.diff:-p1 - MAINTAINER= olivier@FreeBSD.org COMMENT= Extra OpenFX plugins for Natron LICENSE= GPLv2 -BROKEN= does not build: error: no member named 'apply' in 'OpenColorIO_v2_1::Processor' - ONLY_FOR_ARCHS= amd64 powerpc64 powerpc64le BUILD_DEPENDS= opencl>=0:devel/opencl LIB_DEPENDS= libOpenColorIO.so:graphics/opencolorio \ libfontconfig.so:x11-fonts/fontconfig \ + libfribidi.so:converters/fribidi \ libcdr-0.1.so:graphics/libcdr01 \ librevenge-0.0.so:textproc/librevenge \ libpoppler-glib.so:graphics/poppler-glib \ @@ -35,21 +30,23 @@ LIB_DEPENDS= libOpenColorIO.so:graphics/opencolorio \ liblqr-1.so:graphics/liblqr-1 \ libfftw3.so:math/fftw3 \ libltdl.so:devel/libltdl \ - libpoppler.so:graphics/poppler + libpoppler.so:graphics/poppler \ + libraqm.so:print/libraqm -USES= gl gmake gnome iconv magick:6 xorg +USES= gl gmake gnome iconv magick:6 ssl xorg USE_GITHUB= yes GH_ACCOUNT= NatronGitHub -GH_TUPLE= NatronGitHub:openfx-supportext:e600cae:openfx_supportext/SupportExt \ - NatronGitHub:openfx:a85dc34:openfx/OpenFX \ - NatronGitHub:openfx-io:Natron-2.3.12:OpenFX_IO/OpenFX-IO \ - NatronGitHub:SequenceParsing:9e8b77a:SequenceParsing/OpenFX-IO/IOSupport/SequenceParsing \ - NatronGitHub:tinydir:3aae922:tinydir/OpenFX-IO/IOSupport/SequenceParsing/tinydir +GH_TUPLE= NatronGitHub:openfx-supportext:79d8c22:openfx_supportext/SupportExt \ + NatronGitHub:openfx:d5db5d0:openfx/OpenFX \ + NatronGitHub:openfx-io:c6ad47b:OpenFX_IO/OpenFX-IO \ + lvandeve:lodepng:5601b82:dummy/lodepng \ + NatronGitHub:SequenceParsing:3c93fcc:SequenceParsing/OpenFX-IO/IOSupport/SequenceParsing \ + NatronGitHub:tinydir:64fb1d4:tinydir/OpenFX-IO/IOSupport/SequenceParsing/tinydir MAKE_ENV+= CONFIG=release USE_GL= gl USE_GNOME= libxml2 pango cairo librsvg2 -USE_XORG+= x11 xcb xau xdamage xfixes xxf86vm xrender xext xdmcp pixman sm ice xt +USE_XORG+= x11 xcb xau xdamage xfixes xft xxf86vm xrender xext xdmcp pixman sm ice xt MAKE_ENV+= CONFIG=release post-extract: diff --git a/graphics/openfx-arena/distinfo b/graphics/openfx-arena/distinfo index 9cca9d7901b1..a372b2efa330 100644 --- a/graphics/openfx-arena/distinfo +++ b/graphics/openfx-arena/distinfo @@ -1,15 +1,15 @@ -TIMESTAMP = 1533473532 -SHA256 (NatronGitHub-openfx-arena-Natron-2.3.14_GH0.tar.gz) = 7fd6f987cce774578498d9c649989f1357baf0e6a828352fb72790f1a1373f90 -SIZE (NatronGitHub-openfx-arena-Natron-2.3.14_GH0.tar.gz) = 566620 -SHA256 (NatronGitHub-openfx-supportext-e600cae_GH0.tar.gz) = b6fbe4552d0986a4913ab4e6a999bd30b432646495b2b431d2e295b1ed6514cf -SIZE (NatronGitHub-openfx-supportext-e600cae_GH0.tar.gz) = 287231 -SHA256 (NatronGitHub-openfx-a85dc34_GH0.tar.gz) = c59082fcd9327e87ff544e93179ddc5b81d39442854283064480526ab153bfde -SIZE (NatronGitHub-openfx-a85dc34_GH0.tar.gz) = 10651841 -SHA256 (NatronGitHub-openfx-io-Natron-2.3.12_GH0.tar.gz) = 3fcd8b570026113286c516ca5b0590b93338ca124bfccc7e4341a5ee9defa442 -SIZE (NatronGitHub-openfx-io-Natron-2.3.12_GH0.tar.gz) = 468698 -SHA256 (NatronGitHub-SequenceParsing-9e8b77a_GH0.tar.gz) = 7a2c1591b3198f8780bf2b791494da0d9bbd74d073653baa295ff30bf00c16fe -SIZE (NatronGitHub-SequenceParsing-9e8b77a_GH0.tar.gz) = 15980 -SHA256 (NatronGitHub-tinydir-3aae922_GH0.tar.gz) = eb816fff00d9713742a1f1367432fee0ea73ccb0f458c90035543e923e8e55d1 -SIZE (NatronGitHub-tinydir-3aae922_GH0.tar.gz) = 24552 -SHA256 (bc06a46bb1ccef8f7da6caf17faf165fbac662db.diff) = 3b91e4cdfa5c29000d15fa5a485f648386fcc72aa36bc3d44e759c6cabe5ab88 -SIZE (bc06a46bb1ccef8f7da6caf17faf165fbac662db.diff) = 7313 +TIMESTAMP = 1658449942 +SHA256 (NatronGitHub-openfx-arena-Natron-2.4.3_GH0.tar.gz) = e3835a1fdc2f617fd3d0ed225fe6a80a8ff2fec636e94be55d72cafe80ca610f +SIZE (NatronGitHub-openfx-arena-Natron-2.4.3_GH0.tar.gz) = 617742 +SHA256 (NatronGitHub-openfx-supportext-79d8c22_GH0.tar.gz) = fa4a1565a46f536540df650d31d8ebb862703043e6386d12bf9a4c500f998d43 +SIZE (NatronGitHub-openfx-supportext-79d8c22_GH0.tar.gz) = 295608 +SHA256 (NatronGitHub-openfx-d5db5d0_GH0.tar.gz) = 7d626b85a7731c8ee4175f7cd7c7c9dd3c7c77523c3c49c19d8090d39fd28161 +SIZE (NatronGitHub-openfx-d5db5d0_GH0.tar.gz) = 10706209 +SHA256 (NatronGitHub-openfx-io-c6ad47b_GH0.tar.gz) = 20ddd9a367371bcbc4f7122712a5724cee89e851099e29215d124be8e6e198e7 +SIZE (NatronGitHub-openfx-io-c6ad47b_GH0.tar.gz) = 481035 +SHA256 (lvandeve-lodepng-5601b82_GH0.tar.gz) = 3ac3a5e5119456ff2bf214336790e69d555f5034a8794cbc77b0801b2b1913fd +SIZE (lvandeve-lodepng-5601b82_GH0.tar.gz) = 241633 +SHA256 (NatronGitHub-SequenceParsing-3c93fcc_GH0.tar.gz) = 143112f7f59a2edccd63bb8354536f47f77b283d2eda5d2123e058ed8ccd6224 +SIZE (NatronGitHub-SequenceParsing-3c93fcc_GH0.tar.gz) = 16032 +SHA256 (NatronGitHub-tinydir-64fb1d4_GH0.tar.gz) = 728f9948b59131b650bc2c53b8dcb1db8c49ef07c27d0aca3a13b666ae6b2c59 +SIZE (NatronGitHub-tinydir-64fb1d4_GH0.tar.gz) = 24782 diff --git a/graphics/openfx-arena/files/patch-Bundle_Makefile b/graphics/openfx-arena/files/patch-Bundle_Makefile deleted file mode 100644 index 7a71ae197661..000000000000 --- a/graphics/openfx-arena/files/patch-Bundle_Makefile +++ /dev/null @@ -1,18 +0,0 @@ ---- Bundle/Makefile.orig 2017-01-03 14:53:38 UTC -+++ Bundle/Makefile -@@ -168,11 +168,11 @@ endif - - PNGVERSION = a70c086077c0eaecbae3845e4da4424de5f43361 - --lodepng.cpp: -- curl -o $@ https://raw.githubusercontent.com/lvandeve/lodepng/$(PNGVERSION)/lodepng.cpp -+#lodepng.cpp: -+ #curl -o $@ https://raw.githubusercontent.com/lvandeve/lodepng/$(PNGVERSION)/lodepng.cpp - --lodepng.h: -- curl -o $@ https://raw.githubusercontent.com/lvandeve/lodepng/$(PNGVERSION)/lodepng.h -+#lodepng.h: -+ #curl -o $@ https://raw.githubusercontent.com/lvandeve/lodepng/$(PNGVERSION)/lodepng.h - - $(OBJECTPATH)/lodepng.o: lodepng.cpp lodepng.h - $(OBJECTPATH)/ReadKrita.o: ReadKrita.cpp lodepng.h diff --git a/graphics/openfx-arena/files/patch-Bundle_lodepng.cpp b/graphics/openfx-arena/files/patch-Bundle_lodepng.cpp deleted file mode 100644 index 197f1b738811..000000000000 --- a/graphics/openfx-arena/files/patch-Bundle_lodepng.cpp +++ /dev/null @@ -1,6226 +0,0 @@ ---- Bundle/lodepng.cpp.orig 2017-10-04 17:18:33 UTC -+++ Bundle/lodepng.cpp -@@ -0,0 +1,6223 @@ -+/* -+LodePNG version 20160418 -+ -+Copyright (c) 2005-2016 Lode Vandevenne -+ -+This software is provided 'as-is', without any express or implied -+warranty. In no event will the authors be held liable for any damages -+arising from the use of this software. -+ -+Permission is granted to anyone to use this software for any purpose, -+including commercial applications, and to alter it and redistribute it -+freely, subject to the following restrictions: -+ -+ 1. The origin of this software must not be misrepresented; you must not -+ claim that you wrote the original software. If you use this software -+ in a product, an acknowledgment in the product documentation would be -+ appreciated but is not required. -+ -+ 2. Altered source versions must be plainly marked as such, and must not be -+ misrepresented as being the original software. -+ -+ 3. This notice may not be removed or altered from any source -+ distribution. -+*/ -+ -+/* -+The manual and changelog are in the header file "lodepng.h" -+Rename this file to lodepng.cpp to use it for C++, or to lodepng.c to use it for C. -+*/ -+ -+#include "lodepng.h" -+ -+#include -+#include -+#include -+ -+#if defined(_MSC_VER) && (_MSC_VER >= 1310) /*Visual Studio: A few warning types are not desired here.*/ -+#pragma warning( disable : 4244 ) /*implicit conversions: not warned by gcc -Wall -Wextra and requires too much casts*/ -+#pragma warning( disable : 4996 ) /*VS does not like fopen, but fopen_s is not standard C so unusable here*/ -+#endif /*_MSC_VER */ -+ -+const char* LODEPNG_VERSION_STRING = "20160418"; -+ -+/* -+This source file is built up in the following large parts. The code sections -+with the "LODEPNG_COMPILE_" #defines divide this up further in an intermixed way. -+-Tools for C and common code for PNG and Zlib -+-C Code for Zlib (huffman, deflate, ...) -+-C Code for PNG (file format chunks, adam7, PNG filters, color conversions, ...) -+-The C++ wrapper around all of the above -+*/ -+ -+/*The malloc, realloc and free functions defined here with "lodepng_" in front -+of the name, so that you can easily change them to others related to your -+platform if needed. Everything else in the code calls these. Pass -+-DLODEPNG_NO_COMPILE_ALLOCATORS to the compiler, or comment out -+#define LODEPNG_COMPILE_ALLOCATORS in the header, to disable the ones here and -+define them in your own project's source files without needing to change -+lodepng source code. Don't forget to remove "static" if you copypaste them -+from here.*/ -+ -+#ifdef LODEPNG_COMPILE_ALLOCATORS -+static void* lodepng_malloc(size_t size) -+{ -+ return malloc(size); -+} -+ -+static void* lodepng_realloc(void* ptr, size_t new_size) -+{ -+ return realloc(ptr, new_size); -+} -+ -+static void lodepng_free(void* ptr) -+{ -+ free(ptr); -+} -+#else /*LODEPNG_COMPILE_ALLOCATORS*/ -+void* lodepng_malloc(size_t size); -+void* lodepng_realloc(void* ptr, size_t new_size); -+void lodepng_free(void* ptr); -+#endif /*LODEPNG_COMPILE_ALLOCATORS*/ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* // Tools for C, and common code for PNG and Zlib. // */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+/* -+Often in case of an error a value is assigned to a variable and then it breaks -+out of a loop (to go to the cleanup phase of a function). This macro does that. -+It makes the error handling code shorter and more readable. -+ -+Example: if(!uivector_resizev(&frequencies_ll, 286, 0)) ERROR_BREAK(83); -+*/ -+#define CERROR_BREAK(errorvar, code)\ -+{\ -+ errorvar = code;\ -+ break;\ -+} -+ -+/*version of CERROR_BREAK that assumes the common case where the error variable is named "error"*/ -+#define ERROR_BREAK(code) CERROR_BREAK(error, code) -+ -+/*Set error var to the error code, and return it.*/ -+#define CERROR_RETURN_ERROR(errorvar, code)\ -+{\ -+ errorvar = code;\ -+ return code;\ -+} -+ -+/*Try the code, if it returns error, also return the error.*/ -+#define CERROR_TRY_RETURN(call)\ -+{\ -+ unsigned error = call;\ -+ if(error) return error;\ -+} -+ -+/*Set error var to the error code, and return from the void function.*/ -+#define CERROR_RETURN(errorvar, code)\ -+{\ -+ errorvar = code;\ -+ return;\ -+} -+ -+/* -+About uivector, ucvector and string: -+-All of them wrap dynamic arrays or text strings in a similar way. -+-LodePNG was originally written in C++. The vectors replace the std::vectors that were used in the C++ version. -+-The string tools are made to avoid problems with compilers that declare things like strncat as deprecated. -+-They're not used in the interface, only internally in this file as static functions. -+-As with many other structs in this file, the init and cleanup functions serve as ctor and dtor. -+*/ -+ -+#ifdef LODEPNG_COMPILE_ZLIB -+/*dynamic vector of unsigned ints*/ -+typedef struct uivector -+{ -+ unsigned* data; -+ size_t size; /*size in number of unsigned longs*/ -+ size_t allocsize; /*allocated size in bytes*/ -+} uivector; -+ -+static void uivector_cleanup(void* p) -+{ -+ ((uivector*)p)->size = ((uivector*)p)->allocsize = 0; -+ lodepng_free(((uivector*)p)->data); -+ ((uivector*)p)->data = NULL; -+} -+ -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned uivector_reserve(uivector* p, size_t allocsize) -+{ -+ if(allocsize > p->allocsize) -+ { -+ size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); -+ void* data = lodepng_realloc(p->data, newsize); -+ if(data) -+ { -+ p->allocsize = newsize; -+ p->data = (unsigned*)data; -+ } -+ else return 0; /*error: not enough memory*/ -+ } -+ return 1; -+} -+ -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned uivector_resize(uivector* p, size_t size) -+{ -+ if(!uivector_reserve(p, size * sizeof(unsigned))) return 0; -+ p->size = size; -+ return 1; /*success*/ -+} -+ -+/*resize and give all new elements the value*/ -+static unsigned uivector_resizev(uivector* p, size_t size, unsigned value) -+{ -+ size_t oldsize = p->size, i; -+ if(!uivector_resize(p, size)) return 0; -+ for(i = oldsize; i < size; ++i) p->data[i] = value; -+ return 1; -+} -+ -+static void uivector_init(uivector* p) -+{ -+ p->data = NULL; -+ p->size = p->allocsize = 0; -+} -+ -+#ifdef LODEPNG_COMPILE_ENCODER -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned uivector_push_back(uivector* p, unsigned c) -+{ -+ if(!uivector_resize(p, p->size + 1)) return 0; -+ p->data[p->size - 1] = c; -+ return 1; -+} -+#endif /*LODEPNG_COMPILE_ENCODER*/ -+#endif /*LODEPNG_COMPILE_ZLIB*/ -+ -+/* /////////////////////////////////////////////////////////////////////////// */ -+ -+/*dynamic vector of unsigned chars*/ -+typedef struct ucvector -+{ -+ unsigned char* data; -+ size_t size; /*used size*/ -+ size_t allocsize; /*allocated size*/ -+} ucvector; -+ -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned ucvector_reserve(ucvector* p, size_t allocsize) -+{ -+ if(allocsize > p->allocsize) -+ { -+ size_t newsize = (allocsize > p->allocsize * 2) ? allocsize : (allocsize * 3 / 2); -+ void* data = lodepng_realloc(p->data, newsize); -+ if(data) -+ { -+ p->allocsize = newsize; -+ p->data = (unsigned char*)data; -+ } -+ else return 0; /*error: not enough memory*/ -+ } -+ return 1; -+} -+ -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned ucvector_resize(ucvector* p, size_t size) -+{ -+ if(!ucvector_reserve(p, size * sizeof(unsigned char))) return 0; -+ p->size = size; -+ return 1; /*success*/ -+} -+ -+#ifdef LODEPNG_COMPILE_PNG -+ -+static void ucvector_cleanup(void* p) -+{ -+ ((ucvector*)p)->size = ((ucvector*)p)->allocsize = 0; -+ lodepng_free(((ucvector*)p)->data); -+ ((ucvector*)p)->data = NULL; -+} -+ -+static void ucvector_init(ucvector* p) -+{ -+ p->data = NULL; -+ p->size = p->allocsize = 0; -+} -+#endif /*LODEPNG_COMPILE_PNG*/ -+ -+#ifdef LODEPNG_COMPILE_ZLIB -+/*you can both convert from vector to buffer&size and vica versa. If you use -+init_buffer to take over a buffer and size, it is not needed to use cleanup*/ -+static void ucvector_init_buffer(ucvector* p, unsigned char* buffer, size_t size) -+{ -+ p->data = buffer; -+ p->allocsize = p->size = size; -+} -+#endif /*LODEPNG_COMPILE_ZLIB*/ -+ -+#if (defined(LODEPNG_COMPILE_PNG) && defined(LODEPNG_COMPILE_ANCILLARY_CHUNKS)) || defined(LODEPNG_COMPILE_ENCODER) -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned ucvector_push_back(ucvector* p, unsigned char c) -+{ -+ if(!ucvector_resize(p, p->size + 1)) return 0; -+ p->data[p->size - 1] = c; -+ return 1; -+} -+#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ -+ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+#ifdef LODEPNG_COMPILE_PNG -+#ifdef LODEPNG_COMPILE_ANCILLARY_CHUNKS -+/*returns 1 if success, 0 if failure ==> nothing done*/ -+static unsigned string_resize(char** out, size_t size) -+{ -+ char* data = (char*)lodepng_realloc(*out, size + 1); -+ if(data) -+ { -+ data[size] = 0; /*null termination char*/ -+ *out = data; -+ } -+ return data != 0; -+} -+ -+/*init a {char*, size_t} pair for use as string*/ -+static void string_init(char** out) -+{ -+ *out = NULL; -+ string_resize(out, 0); -+} -+ -+/*free the above pair again*/ -+static void string_cleanup(char** out) -+{ -+ lodepng_free(*out); -+ *out = NULL; -+} -+ -+static void string_set(char** out, const char* in) -+{ -+ size_t insize = strlen(in), i; -+ if(string_resize(out, insize)) -+ { -+ for(i = 0; i != insize; ++i) -+ { -+ (*out)[i] = in[i]; -+ } -+ } -+} -+#endif /*LODEPNG_COMPILE_ANCILLARY_CHUNKS*/ -+#endif /*LODEPNG_COMPILE_PNG*/ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+unsigned lodepng_read32bitInt(const unsigned char* buffer) -+{ -+ return (unsigned)((buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3]); -+} -+ -+#if defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER) -+/*buffer must have at least 4 allocated bytes available*/ -+static void lodepng_set32bitInt(unsigned char* buffer, unsigned value) -+{ -+ buffer[0] = (unsigned char)((value >> 24) & 0xff); -+ buffer[1] = (unsigned char)((value >> 16) & 0xff); -+ buffer[2] = (unsigned char)((value >> 8) & 0xff); -+ buffer[3] = (unsigned char)((value ) & 0xff); -+} -+#endif /*defined(LODEPNG_COMPILE_PNG) || defined(LODEPNG_COMPILE_ENCODER)*/ -+ -+#ifdef LODEPNG_COMPILE_ENCODER -+static void lodepng_add32bitInt(ucvector* buffer, unsigned value) -+{ -+ ucvector_resize(buffer, buffer->size + 4); /*todo: give error if resize failed*/ -+ lodepng_set32bitInt(&buffer->data[buffer->size - 4], value); -+} -+#endif /*LODEPNG_COMPILE_ENCODER*/ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* / File IO / */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+#ifdef LODEPNG_COMPILE_DISK -+ -+/* returns negative value on error. This should be pure C compatible, so no fstat. */ -+static long lodepng_filesize(const char* filename) -+{ -+ FILE* file; -+ long size; -+ file = fopen(filename, "rb"); -+ if(!file) return -1; -+ -+ if(fseek(file, 0, SEEK_END) != 0) -+ { -+ fclose(file); -+ return -1; -+ } -+ -+ size = ftell(file); -+ /* It may give LONG_MAX as directory size, this is invalid for us. */ -+ if(size == LONG_MAX) size = -1; -+ -+ fclose(file); -+ return size; -+} -+ -+/* load file into buffer that already has the correct allocated size. Returns error code.*/ -+static unsigned lodepng_buffer_file(unsigned char* out, size_t size, const char* filename) -+{ -+ FILE* file; -+ size_t readsize; -+ file = fopen(filename, "rb"); -+ if(!file) return 78; -+ -+ readsize = fread(out, 1, size, file); -+ fclose(file); -+ -+ if (readsize != size) return 78; -+ return 0; -+} -+ -+unsigned lodepng_load_file(unsigned char** out, size_t* outsize, const char* filename) -+{ -+ long size = lodepng_filesize(filename); -+ if (size < 0) return 78; -+ *outsize = (size_t)size; -+ -+ *out = (unsigned char*)lodepng_malloc((size_t)size); -+ if(!(*out) && size > 0) return 83; /*the above malloc failed*/ -+ -+ return lodepng_buffer_file(*out, (size_t)size, filename); -+} -+ -+/*write given buffer to the file, overwriting the file, it doesn't append to it.*/ -+unsigned lodepng_save_file(const unsigned char* buffer, size_t buffersize, const char* filename) -+{ -+ FILE* file; -+ file = fopen(filename, "wb" ); -+ if(!file) return 79; -+ fwrite((char*)buffer , 1 , buffersize, file); -+ fclose(file); -+ return 0; -+} -+ -+#endif /*LODEPNG_COMPILE_DISK*/ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* // End of common code and tools. Begin of Zlib related code. // */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+#ifdef LODEPNG_COMPILE_ZLIB -+#ifdef LODEPNG_COMPILE_ENCODER -+/*TODO: this ignores potential out of memory errors*/ -+#define addBitToStream(/*size_t**/ bitpointer, /*ucvector**/ bitstream, /*unsigned char*/ bit)\ -+{\ -+ /*add a new byte at the end*/\ -+ if(((*bitpointer) & 7) == 0) ucvector_push_back(bitstream, (unsigned char)0);\ -+ /*earlier bit of huffman code is in a lesser significant bit of an earlier byte*/\ -+ (bitstream->data[bitstream->size - 1]) |= (bit << ((*bitpointer) & 0x7));\ -+ ++(*bitpointer);\ -+} -+ -+static void addBitsToStream(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -+{ -+ size_t i; -+ for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> i) & 1)); -+} -+ -+static void addBitsToStreamReversed(size_t* bitpointer, ucvector* bitstream, unsigned value, size_t nbits) -+{ -+ size_t i; -+ for(i = 0; i != nbits; ++i) addBitToStream(bitpointer, bitstream, (unsigned char)((value >> (nbits - 1 - i)) & 1)); -+} -+#endif /*LODEPNG_COMPILE_ENCODER*/ -+ -+#ifdef LODEPNG_COMPILE_DECODER -+ -+#define READBIT(bitpointer, bitstream) ((bitstream[bitpointer >> 3] >> (bitpointer & 0x7)) & (unsigned char)1) -+ -+static unsigned char readBitFromStream(size_t* bitpointer, const unsigned char* bitstream) -+{ -+ unsigned char result = (unsigned char)(READBIT(*bitpointer, bitstream)); -+ ++(*bitpointer); -+ return result; -+} -+ -+static unsigned readBitsFromStream(size_t* bitpointer, const unsigned char* bitstream, size_t nbits) -+{ -+ unsigned result = 0, i; -+ for(i = 0; i != nbits; ++i) -+ { -+ result += ((unsigned)READBIT(*bitpointer, bitstream)) << i; -+ ++(*bitpointer); -+ } -+ return result; -+} -+#endif /*LODEPNG_COMPILE_DECODER*/ -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+/* / Deflate - Huffman / */ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+#define FIRST_LENGTH_CODE_INDEX 257 -+#define LAST_LENGTH_CODE_INDEX 285 -+/*256 literals, the end code, some length codes, and 2 unused codes*/ -+#define NUM_DEFLATE_CODE_SYMBOLS 288 -+/*the distance codes have their own symbols, 30 used, 2 unused*/ -+#define NUM_DISTANCE_SYMBOLS 32 -+/*the code length codes. 0-15: code lengths, 16: copy previous 3-6 times, 17: 3-10 zeros, 18: 11-138 zeros*/ -+#define NUM_CODE_LENGTH_CODES 19 -+ -+/*the base lengths represented by codes 257-285*/ -+static const unsigned LENGTHBASE[29] -+ = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, -+ 67, 83, 99, 115, 131, 163, 195, 227, 258}; -+ -+/*the extra bits used by codes 257-285 (added to base length)*/ -+static const unsigned LENGTHEXTRA[29] -+ = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, -+ 4, 4, 4, 4, 5, 5, 5, 5, 0}; -+ -+/*the base backwards distances (the bits of distance codes appear after length codes and use their own huffman tree)*/ -+static const unsigned DISTANCEBASE[30] -+ = {1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, -+ 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577}; -+ -+/*the extra bits of backwards distances (added to base)*/ -+static const unsigned DISTANCEEXTRA[30] -+ = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, -+ 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13}; -+ -+/*the order in which "code length alphabet code lengths" are stored, out of this -+the huffman tree of the dynamic huffman tree lengths is generated*/ -+static const unsigned CLCL_ORDER[NUM_CODE_LENGTH_CODES] -+ = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}; -+ -+/* ////////////////////////////////////////////////////////////////////////// */ -+ -+/* -+Huffman tree struct, containing multiple representations of the tree -+*/ -+typedef struct HuffmanTree -+{ -+ unsigned* tree2d; -+ unsigned* tree1d; -+ unsigned* lengths; /*the lengths of the codes of the 1d-tree*/ -+ unsigned maxbitlen; /*maximum number of bits a single code can get*/ -+ unsigned numcodes; /*number of symbols in the alphabet = number of codes*/ -+} HuffmanTree; -+ -+/*function used for debug purposes to draw the tree in ascii art with C++*/ -+/* -+static void HuffmanTree_draw(HuffmanTree* tree) -+{ -+ std::cout << "tree. length: " << tree->numcodes << " maxbitlen: " << tree->maxbitlen << std::endl; -+ for(size_t i = 0; i != tree->tree1d.size; ++i) -+ { -+ if(tree->lengths.data[i]) -+ std::cout << i << " " << tree->tree1d.data[i] << " " << tree->lengths.data[i] << std::endl; -+ } -+ std::cout << std::endl; -+}*/ -+ -+static void HuffmanTree_init(HuffmanTree* tree) -+{ -+ tree->tree2d = 0; -+ tree->tree1d = 0; -+ tree->lengths = 0; -+} -+ -+static void HuffmanTree_cleanup(HuffmanTree* tree) -+{ -+ lodepng_free(tree->tree2d); -+ lodepng_free(tree->tree1d); -+ lodepng_free(tree->lengths); -+} -+ -+/*the tree representation used by the decoder. return value is error*/ -+static unsigned HuffmanTree_make2DTree(HuffmanTree* tree) -+{ -+ unsigned nodefilled = 0; /*up to which node it is filled*/ -+ unsigned treepos = 0; /*position in the tree (1 of the numcodes columns)*/ -+ unsigned n, i; -+ -+ tree->tree2d = (unsigned*)lodepng_malloc(tree->numcodes * 2 * sizeof(unsigned)); -+ if(!tree->tree2d) return 83; /*alloc fail*/ -+ -+ /* -+ convert tree1d[] to tree2d[][]. In the 2D array, a value of 32767 means -+ uninited, a value >= numcodes is an address to another bit, a value < numcodes -+ is a code. The 2 rows are the 2 possible bit values (0 or 1), there are as -+ many columns as codes - 1. -+ A good huffman tree has N * 2 - 1 nodes, of which N - 1 are internal nodes. -+ Here, the internal nodes are stored (what their 0 and 1 option point to). -+ There is only memory for such good tree currently, if there are more nodes -+ (due to too long length codes), error 55 will happen -+ */ -+ for(n = 0; n < tree->numcodes * 2; ++n) -+ { -+ tree->tree2d[n] = 32767; /*32767 here means the tree2d isn't filled there yet*/ -+ } -+ -+ for(n = 0; n < tree->numcodes; ++n) /*the codes*/ -+ { -+ for(i = 0; i != tree->lengths[n]; ++i) /*the bits for this code*/ -+ { -+ unsigned char bit = (unsigned char)((tree->tree1d[n] >> (tree->lengths[n] - i - 1)) & 1); -+ /*oversubscribed, see comment in lodepng_error_text*/ -+ if(treepos > 2147483647 || treepos + 2 > tree->numcodes) return 55; -+ if(tree->tree2d[2 * treepos + bit] == 32767) /*not yet filled in*/ -+ { -+ if(i + 1 == tree->lengths[n]) /*last bit*/ -+ { -+ tree->tree2d[2 * treepos + bit] = n; /*put the current code in it*/ -+ treepos = 0; -+ } -+ else -+ { -+ /*put address of the next step in here, first that address has to be found of course -+ (it's just nodefilled + 1)...*/ -+ ++nodefilled; -+ /*addresses encoded with numcodes added to it*/ -+ tree->tree2d[2 * treepos + bit] = nodefilled + tree->numcodes; -+ treepos = nodefilled; -+ } -+ } -+ else treepos = tree->tree2d[2 * treepos + bit] - tree->numcodes; -+ } -+ } -+ -+ for(n = 0; n < tree->numcodes * 2; ++n) -+ { -+ if(tree->tree2d[n] == 32767) tree->tree2d[n] = 0; /*remove possible remaining 32767's*/ -+ } -+ -+ return 0; -+} -+ -+/* -+Second step for the ...makeFromLengths and ...makeFromFrequencies functions. -+numcodes, lengths and maxbitlen must already be filled in correctly. return -+value is error. -+*/ -+static unsigned HuffmanTree_makeFromLengths2(HuffmanTree* tree) -+{ -+ uivector blcount; -+ uivector nextcode; -+ unsigned error = 0; -+ unsigned bits, n; -+ -+ uivector_init(&blcount); -+ uivector_init(&nextcode); -+ -+ tree->tree1d = (unsigned*)lodepng_malloc(tree->numcodes * sizeof(unsigned)); -+ if(!tree->tree1d) error = 83; /*alloc fail*/ -+ -+ if(!uivector_resizev(&blcount, tree->maxbitlen + 1, 0) -+ || !uivector_resizev(&nextcode, tree->maxbitlen + 1, 0)) -+ error = 83; /*alloc fail*/ -+ -+ if(!error) -+ { -+ /*step 1: count number of instances of each code length*/ -+ for(bits = 0; bits != tree->numcodes; ++bits) ++blcount.data[tree->lengths[bits]]; -+ /*step 2: generate the nextcode values*/ -+ for(bits = 1; bits <= tree->maxbitlen; ++bits) -+ { -+ nextcode.data[bits] = (nextcode.data[bits - 1] + blcount.data[bits - 1]) << 1; -+ } -+ /*step 3: generate all the codes*/ -+ for(n = 0; n != tree->numcodes; ++n) -+ { -+ if(tree->lengths[n] != 0) tree->tree1d[n] = nextcode.data[tree->lengths[n]]++; -+ } -+ } -+ -+ uivector_cleanup(&blcount); -+ uivector_cleanup(&nextcode); -+ -+ if(!error) return HuffmanTree_make2DTree(tree); -+ else return error; -+} -+ -+/* -+given the code lengths (as stored in the PNG file), generate the tree as defined -+by Deflate. maxbitlen is the maximum bits that a code in the tree can have. -+return value is error. -+*/ -+static unsigned HuffmanTree_makeFromLengths(HuffmanTree* tree, const unsigned* bitlen, -+ size_t numcodes, unsigned maxbitlen) -+{ -+ unsigned i; -+ tree->lengths = (unsigned*)lodepng_malloc(numcodes * sizeof(unsigned)); -+ if(!tree->lengths) return 83; /*alloc fail*/ -+ for(i = 0; i != numcodes; ++i) tree->lengths[i] = bitlen[i]; -+ tree->numcodes = (unsigned)numcodes; /*number of symbols*/ -+ tree->maxbitlen = maxbitlen; -+ return HuffmanTree_makeFromLengths2(tree); -+} -+ -+#ifdef LODEPNG_COMPILE_ENCODER -+ -+/*BPM: Boundary Package Merge, see "A Fast and Space-Economical Algorithm for Length-Limited Coding", -+Jyrki Katajainen, Alistair Moffat, Andrew Turpin, 1995.*/ -+ -+/*chain node for boundary package merge*/ -+typedef struct BPMNode -+{ -+ int weight; /*the sum of all weights in this chain*/ -+ unsigned index; /*index of this leaf node (called "count" in the paper)*/ -+ struct BPMNode* tail; /*the next nodes in this chain (null if last)*/ -+ int in_use; -+} BPMNode; -+ -+/*lists of chains*/ -+typedef struct BPMLists -+{ -+ /*memory pool*/ -+ unsigned memsize; -+ BPMNode* memory; -+ unsigned numfree; -+ unsigned nextfree; -+ BPMNode** freelist; -+ /*two heads of lookahead chains per list*/ -+ unsigned listsize; -+ BPMNode** chains0; -+ BPMNode** chains1; -+} BPMLists; -+ -+/*creates a new chain node with the given parameters, from the memory in the lists */ -+static BPMNode* bpmnode_create(BPMLists* lists, int weight, unsigned index, BPMNode* tail) -+{ -+ unsigned i; -+ BPMNode* result; -+ -+ /*memory full, so garbage collect*/ -+ if(lists->nextfree >= lists->numfree) -+ { -+ /*mark only those that are in use*/ -+ for(i = 0; i != lists->memsize; ++i) lists->memory[i].in_use = 0; -+ for(i = 0; i != lists->listsize; ++i) -+ { -+ BPMNode* node; -+ for(node = lists->chains0[i]; node != 0; node = node->tail) node->in_use = 1; -+ for(node = lists->chains1[i]; node != 0; node = node->tail) node->in_use = 1; -+ } -+ /*collect those that are free*/ -+ lists->numfree = 0; -+ for(i = 0; i != lists->memsize; ++i) -+ { -+ if(!lists->memory[i].in_use) lists->freelist[lists->numfree++] = &lists->memory[i]; -+ } -+ lists->nextfree = 0; -+ } -+ -+ result = lists->freelist[lists->nextfree++]; -+ result->weight = weight; -+ result->index = index; -+ result->tail = tail; -+ return result; -+} -+ -+/*sort the leaves with stable mergesort*/ -+static void bpmnode_sort(BPMNode* leaves, size_t num) -+{ -+ BPMNode* mem = (BPMNode*)lodepng_malloc(sizeof(*leaves) * num); -+ size_t width, counter = 0; -+ for(width = 1; width < num; width *= 2) -+ { -+ BPMNode* a = (counter & 1) ? mem : leaves; -+ BPMNode* b = (counter & 1) ? leaves : mem; -+ size_t p; -+ for(p = 0; p < num; p += 2 * width) -+ { -+ size_t q = (p + width > num) ? num : (p + width); -+ size_t r = (p + 2 * width > num) ? num : (p + 2 * width); -+ size_t i = p, j = q, k; -+ for(k = p; k < r; k++) -+ { -+ if(i < q && (j >= r || a[i].weight <= a[j].weight)) b[k] = a[i++]; -+ else b[k] = a[j++]; -+ } -+ } -+ counter++; -+ } -+ if(counter & 1) memcpy(leaves, mem, sizeof(*leaves) * num); -+ lodepng_free(mem); -+} -+ -+/*Boundary Package Merge step, numpresent is the amount of leaves, and c is the current chain.*/ -+static void boundaryPM(BPMLists* lists, BPMNode* leaves, size_t numpresent, int c, int num) -+{ -+ unsigned lastindex = lists->chains1[c]->index; -+ -+ if(c == 0) -+ { -+ if(lastindex >= numpresent) return; -+ lists->chains0[c] = lists->chains1[c]; -+ lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, 0); -+ } -+ else -+ { -+ /*sum of the weights of the head nodes of the previous lookahead chains.*/ -+ int sum = lists->chains0[c - 1]->weight + lists->chains1[c - 1]->weight; -+ lists->chains0[c] = lists->chains1[c]; -+ if(lastindex < numpresent && sum > leaves[lastindex].weight) -+ { -+ lists->chains1[c] = bpmnode_create(lists, leaves[lastindex].weight, lastindex + 1, lists->chains1[c]->tail); -+ return; -+ } -+ lists->chains1[c] = bpmnode_create(lists, sum, lastindex, lists->chains1[c - 1]); -+ /*in the end we are only interested in the chain of the last list, so no -+ need to recurse if we're at the last one (this gives measurable speedup)*/ -+ if(num + 1 < (int)(2 * numpresent - 2)) -+ { -+ boundaryPM(lists, leaves, numpresent, c - 1, num); -+ boundaryPM(lists, leaves, numpresent, c - 1, num); -+ } -+ } -+} -+ -+unsigned lodepng_huffman_code_lengths(unsigned* lengths, const unsigned* frequencies, -+ size_t numcodes, unsigned maxbitlen) -+{ -+ unsigned error = 0; -+ unsigned i; -+ size_t numpresent = 0; /*number of symbols with non-zero frequency*/ -+ BPMNode* leaves; /*the symbols, only those with > 0 frequency*/ -+ -+ if(numcodes == 0) return 80; /*error: a tree of 0 symbols is not supposed to be made*/ -+ if((1u << maxbitlen) < numcodes) return 80; /*error: represent all symbols*/ -+ -+ leaves = (BPMNode*)lodepng_malloc(numcodes * sizeof(*leaves)); -+ if(!leaves) return 83; /*alloc fail*/ -+ -+ for(i = 0; i != numcodes; ++i) -+ { -+ if(frequencies[i] > 0) -+ { -+ leaves[numpresent].weight = (int)frequencies[i]; -+ leaves[numpresent].index = i; -+ ++numpresent; -+ } -+ } -+ -+ for(i = 0; i != numcodes; ++i) lengths[i] = 0; -+ -+ /*ensure at least two present symbols. There should be at least one symbol -+ according to RFC 1951 section 3.2.7. Some decoders incorrectly require two. To -+ make these work as well ensure there are at least two symbols. The -+ Package-Merge code below also doesn't work correctly if there's only one -+ symbol, it'd give it the theoritical 0 bits but in practice zlib wants 1 bit*/ -+ if(numpresent == 0) -+ { -+ lengths[0] = lengths[1] = 1; /*note that for RFC 1951 section 3.2.7, only lengths[0] = 1 is needed*/ -+ } -+ else if(numpresent == 1) -+ { -+ lengths[leaves[0].index] = 1; -+ lengths[leaves[0].index == 0 ? 1 : 0] = 1; -+ } -+ else -+ { -+ BPMLists lists; *** 7208 LINES SKIPPED ***