diff --git a/.gitmodules b/.gitmodules index 101c270a6..847afe966 100644 --- a/.gitmodules +++ b/.gitmodules @@ -54,3 +54,6 @@ [submodule "third_party/mujs"] path = third_party/mujs url = https://github.com/aseprite/mujs.git +[submodule "third_party/giflib"] + path = third_party/giflib + url = https://github.com/aseprite/giflib.git diff --git a/third_party/CMakeLists.txt b/third_party/CMakeLists.txt index c1d77ee9e..596ffa2e4 100644 --- a/third_party/CMakeLists.txt +++ b/third_party/CMakeLists.txt @@ -39,6 +39,7 @@ if(WITH_WEBP_SUPPORT) endif() if(NOT USE_SHARED_GIFLIB) + set(GIFLIB_UTILS OFF CACHE BOOL "Build giflib utils") add_subdirectory(giflib) endif() diff --git a/third_party/giflib b/third_party/giflib new file mode 160000 index 000000000..39b32b876 --- /dev/null +++ b/third_party/giflib @@ -0,0 +1 @@ +Subproject commit 39b32b876e42d627dce4c61c82b639028a8f11e0 diff --git a/third_party/giflib/AUTHORS b/third_party/giflib/AUTHORS deleted file mode 100644 index 78611cac2..000000000 --- a/third_party/giflib/AUTHORS +++ /dev/null @@ -1,36 +0,0 @@ -Michael Brown - callbacks to write data via user defined function - -Daniel Eisenbud - Fixes for crashes with invalid gif files and double freeing of - colormaps - -Gershon Elber - original giflib code - -Marc Ewing - spec file (for rpms) updates - -Toshio Kuratomi - uncompressed gif writing code - autoconf/automake process - former maintainer - -marek - Gif initialization fix - windows build code - -Peter Mehlitz - callbacks to read data from arbitrary sources (like libjpeg/libpng) - -Dick Porter - int/pointer fixes for Alpha - -Eric Raymond - current as well as long time former maintainer of giflib code - -Petter Reinholdtsen - Tru64 build fixs - -Georg Schwarz - IRIX fixes diff --git a/third_party/giflib/BUGS b/third_party/giflib/BUGS deleted file mode 100644 index feb30ea58..000000000 --- a/third_party/giflib/BUGS +++ /dev/null @@ -1,2 +0,0 @@ -Please report BUGS to the bug tracker on sourceforge: -http://sourceforge.net/tracker/?group_id=102202 diff --git a/third_party/giflib/CMakeLists.txt b/third_party/giflib/CMakeLists.txt deleted file mode 100644 index 5d28a0974..000000000 --- a/third_party/giflib/CMakeLists.txt +++ /dev/null @@ -1,54 +0,0 @@ -# ASEPRITE -# Copyright (C) 2001-2015 David Capello - -include(CheckIncludeFiles) - -include_directories( - lib - ${CMAKE_CURRENT_BINARY_DIR} # For config.h - ) - -check_include_files("dlfcn.h" HAVE_DLFCN_H) -check_include_files("fcntl.h" HAVE_FCNTL_H) -check_include_files("gl/gl.h" HAVE_GL_GL_H) -check_include_files("inttypes.h" HAVE_INTTYPES_H) -check_include_files("memory.h" HAVE_MEMORY_H) -check_include_files("rle.h" HAVE_RLE_H) -check_include_files("stdarg.h" HAVE_STDARG_H) -check_include_files("stdint.h" HAVE_STDINT_H) -check_include_files("stdlib.h" HAVE_STDLIB_H) -check_include_files("strings.h" HAVE_STRINGS_H) -check_include_files("string.h" HAVE_STRING_H) -check_include_files("sys/stat.h" HAVE_SYS_STAT_H) -check_include_files("sys/types.h" HAVE_SYS_TYPES_H) -check_include_files("unistd.h" HAVE_UNISTD_H) -check_include_files("varargs.h" HAVE_VARARGS_H) -check_include_files("X11/Xlib.h" HAVE_X11_XLIB_H) -check_include_files("X11/Xutil.h" HAVE_X11_XUTIL_H) - -check_function_exists("vprintf" HAVE_VPRINTF) -check_function_exists("_doprnt" HAVE_DOPRNT) -check_function_exists("strdup" HAVE_STRDUP) - -if(HAVE_STDINT_H OR HAVE_INTTYPES_H) - set("UINT32" "uint32_t") -else() - set("UINT32" "unsigned int") -endif() - -configure_file(config.h.cmake config.h) - -add_definitions(-DHAVE_CONFIG_H=1) - -if(WIN32) -add_definitions(-DWINDOWS32=1) -endif() - -add_library(giflib - lib/dgif_lib.c - lib/egif_lib.c - lib/gif_err.c - lib/gif_font.c - lib/gif_hash.c - lib/gifalloc.c - lib/quantize.c) diff --git a/third_party/giflib/COPYING b/third_party/giflib/COPYING deleted file mode 100644 index b9c0b5012..000000000 --- a/third_party/giflib/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -The GIFLIB distribution is Copyright (c) 1997 Eric S. Raymond - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/third_party/giflib/ChangeLog b/third_party/giflib/ChangeLog deleted file mode 100644 index a723ed690..000000000 --- a/third_party/giflib/ChangeLog +++ /dev/null @@ -1,666 +0,0 @@ -shipper: ignore this. - It's retained for archival purposes only, and because -autotools throws a hissy fit if there isn't one. The single point of -truth about changes and the reasons for them is the repository. - -2007-11-10 14:50 abadger1999 - - * NEWS, configure.ac, lib/Makefile.am, lib/egif_lib.c, - lib/gif_hash.c: 4.1.6 update. Errors in including headers could - lead to build problems on some platforms. - -2007-11-10 13:16 abadger1999 - - * configure.ac: Bump release version in configure.ac. - -2007-11-10 13:15 abadger1999 - - * Makefile.am: Remove PATENT_PROBLEMS from build rules as well. - -2007-11-10 13:09 abadger1999 - - * NEWS, PATENT_PROBLEMS, lib/Makefile.am: Remove PATENT_PROBLEMS as - it's no longer covered. Update NEWS and Makefile.am for the new - release. - -2007-11-10 10:46 abadger1999 - - * configure.ac, util/gif2epsn.c, util/gif2iris.c, util/gif2ps.c, - util/gif2rgb.c, util/gif2rle.c, util/gif2x11.c: Find and fix - segfaults in the gif2* programs due to referencing the ColorMap - beforefinding out if hte GifFile produced a valid colormap or was - corrupt. - -2007-11-10 09:30 abadger1999 - - * lib/dgif_lib.c: Add checks to fail gracefully when corrupted - images are submitted that have improper LZ codes. - -2007-11-10 09:22 abadger1999 - - * lib/: dgif_lib.c, egif_lib.c: Further checks to compile correctly - on WIN32. - -2007-11-09 20:28 abadger1999 - - * util/giftext.c: Fix a SegFault when a GifFile does not store a - global colormap. - -2007-11-09 20:13 abadger1999 - - * util/gif2x11.c: Fix gif2x11 to work with modern, 24 bit displays. - -2007-11-09 14:18 abadger1999 - - * configure.ac: Check for headers as well as the libraries for rle, - X11, and gl_s. - -2007-11-09 13:24 abadger1999 - - * configure.ac: Merge better fix for finding an unsignd 32 bit - integer type. - -2007-11-09 13:01 abadger1999 - - * configure.ac: Add configure comman line switches to turn off X11, - rle, and gl support. - -2007-11-09 12:36 abadger1999 - - * configure.ac, util/Makefile.am: Fixes to build under cygwin. - -2007-11-09 11:49 abadger1999 - - * configure.ac: Make GCC check more robust. Add a needed automake - check. - -2007-11-09 11:48 abadger1999 - - * lib/dgif_lib.c: Fix closing file handles on failure in - DGifOpenFileHandle(). - -2007-11-09 11:33 abadger1999 - - * lib/egif_lib.c: Save files in binary mode for WIN32 as well as - MSDOS. - -2007-11-09 11:25 abadger1999 - - * lib/Makefile.ms: * Makefile for building under Visual C++ from - Bug #981209. - -2005-11-13 20:14 abadger1999 - - * configure.ac, lib/Makefile.am, util/Makefile.am: Changes to - conditionalize -Wall upon compiling with gcc. - -2005-11-06 08:45 abadger1999 - - * lib/: gif_hash.c, gif_hash.h: Add inttypes.h to the headers we - could include to get a 32-it int type. - -2005-11-06 08:34 abadger1999 - - * configure.ac: Search for ISO/ANSI definitions of uint32_t in - stdint.h _and_ inttypes.h before POSIX u_int32_t in sys/types.h - as some systems have sys/types.h without the definition. - Eventually we need to code a test that the expected UINT32 - definition exists in the header we select so order does not - matter. - -2005-11-06 08:32 abadger1999 - - * AUTHORS, README: Modify so that it no longer appears that esr - still maintains this package. - -= giflib-4.1.4 = - -2005-10-09 Toshio Kuratomi - r94 - * Sync with libungif r93. - * ChangeLog: Update to r92. - * NEWS: Update with combined libungif/giflib changes. - -2005-10-09 Toshio Kuratomi - r92 - * lib/gif_lib.h: Change GifPrefixType to unsigned. - -2005-10-09 Toshio Kuratomi - r91 - * ChangeLog: Update to r90. - * NEWS: Update on GBA and Windows fixes. - -2005-10-06 Toshio Kuratomi - r90 - Changes from Lennie Araki: - * gba/giftest.mak: Prefix the names of defines for the GBA build with _GBA. - * lib/dgif_lib.c, lib/gif_lib_private.h, lib/gif_err.c: - - When Compiling for Game Boy Advance, file functions are not needed so - exclude DGifOpenFileName(), DGifOpenFileHandle(), DGifSlurp(), and - PrintGifError(). - - On Game Boy Advance we need to reduce memory usage. Change values to - short int where appropriate. - * lib/gif_lib.h: - - Handle te GBA changes by defining GifPrefixType and GifWord to int - unless compiling on GBA. Then use unsigned short and short - respectively. - - Fix a problem with the API on _WIN32. DrawText conflicts with the - Windows API. Call it DrawGifText instead. - -2005-09-27 Toshio Kuratomi - r86 - * Sync with libungif r85. - -2005-09-27 Toshio Kuratomi - r82 - * AUTHORS: Add Daniel Eisenbud. Obscure email addresses. - * libungif.spec: Bump to version 4.1.4. - * configure.ac: Bump to 4.1.4. No longer check for ranlib. - * doc/lzgif.txt: Change dos line encoding to UNIX. - * lib/dgif_lib.c: (eisenbud) - - Set GifFile's ColorMaps to NULL when we free a colormap object. - - Detect some cases of corrupted GIFs which were crashing the library. - * lib/egif_lib.c: Set ColorMaps to NULL when we free a colormap object. - * lib/gifalloc.c: Set ColorMaps to NULL when we free a colormap object. - * lib/dev2gif.c: Fix redefinition problem on IRIX. - * NEWS: Update to 4.1.4 - * util/gifcomb.c: Set a olorMap to NULL. - -2004-07-11 Toshio Kuratomi - r79 - * gif2iris.c: Fixes from Georg Schwarz . - - stdlib.h is available and needs to be included on IRIX. - - ColorMapSize was being set from non-existent variables. - -2004-05-29 Toshio Kuratomi - r76 - * Sync with libungif-4.1.3. - -2004-05-29 Toshio Kuratomi - r74 - * ChangeLog, prop=lastlog: Sync with the subversion logs. - -2004-05-29 Toshio Kuratomi - r73 - * test-unx: Add a test of extension code. - * lib/egif_lib.c: Remove a debugging statement - -2004-05-29 Toshio Kuratomi - r72 - * Makefile.am, doc/Makefile.am, pic/Makefile.am: Change wildcarded entries - into explicit filenames so make distcheck will succeed. - -2004-05-29 Toshio Kuratomi - r71 - * ChangeLog, prop=lastlog: Sync the ChangeLog for the release. - -2004-05-29 Toshio Kuratomi - r70 - * AUTHORS: Add Lennie Araki to the list of contributers. - * windows: The windows subdirectory and all files under it are contributions - from Lennie Araki to provide a nice interface on MS Windows. - * README: Redundancy fix. - * doc/gif_lib.html: Add EGifPutExtension{First,Next,Last} to the documentation - so people know they should use it instead of EGifPutExtension. - * Makefile.am: Mark the windows files to be distributed. - * NEWS: Complete the NEWS item for 4.1.3. - -2004-05-29 Toshio Kuratomi - r69 - * libungif.spec: Some updates from the latest RedHat spec. - * configure.ac: Bump version to 4.1.3. - * lib/gifalloc.c: Add to my comments on ESR's note about Extension blocks. - * lib/egif_lib.c: - - EGifPutComment(): reimplemented using EGifPutExtensionFirst, Next, and - Last so that it won't break on unusually long comments. - - EGifPutExtension{First,Next,Last}: Changed fwrites to WRITE so any - user defined write function will get called properly. - - EGifPutExtensionTerminate: if the Extension block is empty (Zero length) - then don't attempt to output a last extension block, just output the - block terminator. - - EGifPutExtension: Comment that this function does not work when there - are multiple subblocks in an Extension block. Use the functions - EGifPutExtension{First,Next,Last} instead. - - EGifSpew: Reimplement to use EGifPutExtension{First,Next,Last} so we - don't output broken GIFs when there are multiple sub-blocks on an - extension. - * lib/Makefile.am: Bump version to 4.1.3. - * NEWS: Begin writing an entry for 4.1.3. - * util/icon2gif.c: Few casting fixes to make gcc -Wall happy. - * util/gif2ps.c: printf format string corrections. - -2004-05-26 Toshio Kuratomi - r67 - * Clean up some typos. - -2004-05-25 Toshio Kuratomi - r66 - * Sync with libungif-4.1.2. - -2004-03-03 Toshio Kuratomi - r64 - Last minute updates to the release notes in various files. - -2004-03-03 Toshio Kuratomi - r63 - * Set property lastlog to remind me when I last synced the ChangeLog - -2004-03-03 Toshio Kuratomi - r62 - * ChangeLog: Update - -2004-03-03 Toshio Kuratomi - r61 - * configure.ac: Bump version to 4.1.2 - -2004-02-22 Toshio Kuratomi - r59 - * configure.ac, lib/Makefile.am: Bump version. Forgot to do this for 4.1.1... - -2004-02-22 Toshio Kuratomi - r58 - * TODO: Take out -Wall as that's all ready now. - -2004-02-22 Toshio Kuratomi - r57 - Merge changes to the code from branch indent-audit r55 - * README: MakeExtension deprecation note. - * TODO: Bunch of things I need to fix or check that I saw while doing the - indentation of the code. - * lib/getarg.h: indent changes - * lib/dgif_lib.c: indent changes - - Move stdlib.h out of #ifdef's as it's included on all platforms. - - Add checks to be sure malloc and MakeMapObject succeed. - * lib/quantize.c: indent changes - - Move stdlib.h out of #ifdef's as it's included on all platforms. - - _GifError already pulled in through gif_lib_private.h. Remove decl. - - Make Count in NewColorMapType be unsigned. - - Separated mallocs from conditionals in a few places. Easier reading. - * lib/gifalloc.c: indent changes - - Added four FIXME's where I think the code might not be doing what we - want. Need to do more research to figure out. - - Add note to MakeExtension that I think it needs to be deprecated. - - Separated mallocs from conditionals in a few places. Easier reading. - - FreeLastSavedImage: New private function to free the last image in a - GifFile structure. Used to back out when unable to completely - allocate a new SavedImage structure. - - check for NULL values before deallocating in Free* functions and make - sure all Free* functions set the pointer to NULL after they deallocate - the memory. - * lib/egif_lib.c: indent changes - - EGifPutScreenDesc: If we have no colormap, output a default value for - its size instead of trying to reference its unallocated BitsPerPixel - field. (Fixes bug noted in r46) - * lib/gif_lib.h: indent changes - - Condense the #else #if VARARGS to #elif VARARGS check. - * lib/qprintf.c: indent changes - - Condense the #else #if VARARGS to #elif VARARGS check. - * lib/dev2gif.c: indent changes - * lib/getarg.c: indent changes - * lib/gif_lib_private.h: indent changes - * lib/gif_font.c: indent changes - * lib/gif_err.c: indent changes - -2004-02-22 Toshio Kuratomi - r56 - * lib/Makefile.am, util/Makefile.am: Add -Wall to the compilation flags so - we can keep the code from acquiring too much bad style. - -2004-02-20 Toshio Kuratomi - r46 - * egif_lib.c: Note for a bug fix (Can wait until after indent because - there's no patch.) - * gif_lib.h, dev2gif.c: Change int type to explicit long type in - DumpScreen2Gif. - * util/gifinto.c: Give the fprintf back its %d format. - GifFile->ImageCount is used as the Image number. - -2004-02-20 Toshio Kuratomi - r45 - * README: add varargs to the deprecation list - -2004-02-20 Toshio Kuratomi - r44 - * test-unx: Quote the program names. - * lib/dgif_lib.c: - - Make sure memory was allocated for the colormap - - Some reformatting of code but no syntactic changes. - * lib/gif_lib.h: - - C++ extern "C" fix - - Fix typo with EGifOpen - * lib/qprintf.c, lib/getarg.c: Update the varargs code. Some users reported - that not all systems can handle the hybridized varargs parameter lists - we had. Need to use old-style declarations instead. - -2004-02-20 Toshio Kuratomi - r43 - * NEWS: Note bugfixes and deprecations - * README: Deprecation list is now being compiled in this file. - * TODO: Notes about interlace bug, -Wall status, merging of old bug status - -2004-02-19 Toshio Kuratomi - r42 - * Makefile.am: Disable testing for now because gif2x11 is broken so none - of the tests _appear_ to complete successfully. - -2004-02-19 Toshio Kuratomi - r38 - Merge -Wall fixes from branches/Wall-audit r29 - * configure.ac: - - Make the stdarg vs varargs check simpler by relying on - AC_CHECK_HEADERS() magic. - - Check for unistd.h - * dgif_lib.c, gif_lib.h, egif_lib.c, gifalloc.c, quantize.c, dev2gif.c, - getarg.c, gif_lib_private.h, gif_font.c gif_err.c, gifinto.c, icon2gif.c, - raw2gif.c, gifcolor.c, gifasm.c, gif2epsn.c, gif2iris.c, gifrotat.c, - gifovly.c, gif2x11.c, rle2gif.c, gif2rle.c, text2gif.c, gifspnge.c, - gifclrmp.c, giffiltr.c, giftext.c, gifinfo.c, rgb2gif.c, gif2rgb.c, gif2ps.c - - Changes to get rid of -Wall compile warnings. - + Casting of types - + New header includes for unistd.h and fcntl.h - + Explicit declaration of many types to unsigned - + Removed unused variables and functions - + Removed VersionStr from every library file. Instead include it via - gif_lib_private.h - * gif_lib.h, gif_lib_private.h: Moved the VersionStr into gif_lib_private.h - and made it a #define instead of a static char *. - -2004-02-19 Toshio Kuratomi - r37 - Deprecation notes - -2004-02-19 Toshio Kuratomi - r36 - Add notes about security things to do and giflib syncing - -2004-02-18 Toshio Kuratomi - r32 - * TODO: Add notes about how to go about syncing Wall-audit and indent changes - into giflib. It won't be pretty. - * svn:ignore: Change the tarball names from libungif to giflib - -2004-02-18 Toshio Kuratomi - r31 - Add config.h include to gif_hash.c - -2004-02-17 Toshio Kuratomi - r30 - Sync up with libungif 4.1.1 - -2004-02-17 Toshio Kuratomi - r26 - Updated ChangeLog - -2004-02-17 Toshio Kuratomi - * Updated libungif.spec to look more like fedora core spec - * Updated version numbers in all files - -2004-02-17 Toshio Kuratomi - * Add the libungif*.tar.bz2 distribution tarball to the ignored files - * configure.ac, lib/getarg.c, lib/getarg.h, lib/gif_lib.h, lib/qprintf.c: - Prefer stdarg.h over vararg.h - * TODO: Add information about functions that will go away in 5.0 - (In reality, I don't think new software uses libungif, so there may never - be a 5.0 release.) - * lib/gif_lib.h: Change version from 4.0 to 4.1 - * NEWS: add deprecation warning for the qprintf stuff: GifQuietPrint var and - GifQprintf function. - -2004-02-16 Toshio Kuratomi - * util/gif2iris.c, util/gif2rle.c, util/gifinfo.c: Fix problems with fprintf error statements in the utils - -2004-02-16 Toshio Kuratomi - Add DEVELOPERS file to the distribution. - -2004-02-16 Toshio Kuratomi - * AUTHORS, libungif.spec, libungif.lsm, README, BUGS, NEWS: - Lots of changes to my email address and the website/download. (libungif is - moving to sourceforge.) - * TODO: Few notes on cleanups that need to happen. State what needs to be done - for 4.1.1 to be released. - -2004-02-15 Toshio Kuratomi - Changes imported from last cvs checkout - * TODO: note to check return of malloc everywhere - * lib/dgif_lib.c, lib/egif_lib.c: Fix some deallocation bugs - * lib/gifalloc.c: Fix a colormap allocation problem - * lib/gif_font.c: Fix to drawing text - -2004-02-15 Toshio Kuratomi - Added libgetarg.a to the ignore list. - -2004-02-15 Toshio Kuratomi - Changes to the build infrastructure to build under current libtool, automake, - and libtool. - * configure.in: renamed to configure.ac - * acconfig.h: deleted. Functionality moved into the configure.ac - * autogen.sh: now runs libtoolize --automake - * lib/Makefile.am, util/Makefile.am: CFLAGS=>AM_CFLAGS; INCLUDES=>AM_CPPFLAGS - * configure.ac: - - initialization macros for automake and autoconf have changed - - removed checks for C++ compiler and Awk - - acconfig.h functionality moved here. - - add other X11 libraries to the X11_LIB define - -2004-02-15 Toshio Kuratomi - * Remove INSTALL file as it's autogenerated.\n* Add stamp-h1 to ignored files - -2004-02-15 Toshio Kuratomi - Additional adds and deletes to make version 4.1.0b1 - -2004-02-15 Toshio Kuratomi - Import of version 4.1.0b1 - -2004-02-15 Toshio Kuratomi - r10 - Import giflib 4.1.0 - -2004-02-15 Toshio Kuratomi - r9 - Copy the 4.1.0 libungif release to be the base of the 4.1.0 giflib release. - -2004-02-15 Toshio Kuratomi - r7 - Release 4.1.0 - -2004-02-15 Toshio Kuratomi - r6 - Import of version 4.1.0 - -2004-02-15 Toshio Kuratomi - r5 - Set ignore patterns on the project directories. - -2004-02-15 Toshio Kuratomi - r3 - Remove a Makefile.in that was left in in the first commit. - -2004-02-14 Toshio Kuratomi - r2 - Commit revision 3.1.0 to subversion - -2004-02-14 Toshio Kuratomi - r1 - Initial SVN Repository Layout - -2000 6 Feb Toshio Kuratomi - * configure.in: Change to using config.h - - Every .c file: Change to using config.h. - * configure.in: added check for varargs header. - * lib/getarg.c: Changed the ifdef USE_VARARGS to ifdef HAVE_VARARGS_H. - - lib/getarg.h: Ditto. - - lib/gif_lib.h: Ditto. - - lib/qprintf.h: Ditto. - -2000 6 Feb Toshio Kuratomi - * lib/getarg.h: Prepend an underscore to the header file define. - * lib/gif_lib.h: Ditto - * lib/gif_lib_private.h: Ditto - * lib/getarg.c: ifdef'd MyMalloc so it actually won't define if it already - is. - -2000 3 Feb Toshio Kuratomi - * A new cvs repository based my private tree from home. It now goes back - to giflib-3.0. - * Updated the cvs repository to make multiple developers possible. - * Merge all of Michael's patches into the distribution. - * DEVELOPER: Updated to reflect the new versions of - autoconf/automake/libtool we're using. - * libungif.spec: Updated a few things from the latest redhat spec file. - -1999 5 Dec Toshio Kuratomi - * Update links to the web pages as I have reorganized them somewhat. - * Add the welcome2.gif to the pic directory and a test that utilizes - it to test-unx. - -1999 17 Nov Toshio Kuratomi - * New cvs Repository. Hopefully I've got everything that was in the - old one. This one is available on anonymous cvs. - * Update to libtool 1.3.3, automake 1.4, and autoconf 2.13 - -1999 23 May Michael R Brown - * Lots of 'const' qualifiers added, thanks Alexis - Wilke for finding these. - -1999 22 Mar Michael R Brown - * util/gif2x11.c: Patch by (who?) to fix lots of memory leeks. - * util/*.c: - lib/dgif_lib.c: - Makefile.in: - Patch by David Kaelbling to compile on IRIX 6.x. Basically fixing - lots of bad/missing parameter passing to printf, scanf and similar. - * Added pics/welcome2.gif, from Peter Merz which provokes a bug prior - to patch 19990224 to do with colour map management. There is still - a problem with util/gifspnge processing this image, so it will not - be added to test-unx yet. - -1999 05 Mar Michael R Brown - * lib/getarg.c: Lines 107 and 189 - Added ifdef's to use stdarg when available. On dec-alpha the - default code was causing programs to crash, probably because - it assumes a stack that grows-up. - -1999 24 Feb Michael R Brown - * lib/dgif_lib.c: Lines 363 and 367 - Bug reported by Steve Sanders, where &'s where causing the - memcpy to overwrite the pointers. Fixed by removing the &'s - so that memcpy overwrote the memory pointed to. - -1999 09 Feb Toshio Kuratomi - * Release 4.1.0 - -1999 09 Feb Toshio Kuratomi - * Merge libungif changes into the giflib tree: - - upgrade to libtool 1.2b - - util/Makefile.am: Minor change to allow compilation outside the - source_dir. - - lib/egif_lib.c: FILE_STATE_WRITE, FILE_STATE_SCREEN, - FILE_STATE_IMAGE, IS_WRITEABLE are now in gif_lib_private.h - - lib/dgif_lib.c: FILE_STATE_READ and IS_READABLE are now in - gif_lib_private.h - - lib/gif_lib_private.h: Above mentioned constants and macros are now - here. FILE_STATE_READ is now 0x08 instead of 0x00. - - configure.in: Update version to 4.1.0 - - lib/Makefile.am: Update libtool version to 5:0:1 (libtool) - - giflib.spec: Update for version 4.1.0 (Add libungif-4.1 - compatibility stuff and change version.) - - giflib.lsm: Update for version 4.1.0 - - lib/egif_lib.c: (WRITE) change from a function to a macro. - - lib/dgif_lib.c: (DGifOpenFileName) close FileHandle on error. - - lib/dgif_lib.c: (DGifOpenFileHandle) make sure the FILE stream is - closed if we hit an error. - - lib/dev2gif.c, lib/quantize.c, lib/gif_err.c, lib/gif_lib_private.h: - Reflect Eric's copyright notice rather than Gershon's - -1999 14 Jan Michael R Brown - * lib/gif_lib.h: Add OutputFunc type - * lib/gif_lib.h: Add EGifOpen for user supplied output function - * lib/egif_lib.c: (EGifOpenFileName) Fixed wasted memory when an - error occurs in EGifOpenFileHandle - * lib/egif_lib.c: Add EGifOpen, WRITE, and lots of changes to - support user supplied output function. Basically changing - all fwrite's to WRITE, and then all of the knock on effects. - -1998 17 Dec Toshio Kuratomi - * configure.in: Change references to libungif to giflib. - * libungif.lsm: Rename to giflib.lsm and change to reflect giflib - rather than libungif. - * libungif.spec: Rename to giflib.spec and change to reflect giflib - rather than libungif. - * UNCOMPRESSED_GIF: Removed from this branch. - * PATENT_PROBLEMS: Add file explaining Unisys's patent claims. - * Makefile.am: Replace libungif with giflib. - * README: Adapted language to giflib. - * lib/Makefile.am: Changed references to libungif to libgif. - * util/Makefile.am: Changed references to libungif to libgif. - -1998 17 Dec Toshio Kuratomi - * lib/egif_lib.c: Merge LZW stuff into this branch of the library. - This includes numerous changes to initialize the hash table as well - as the code forthe encoder. - * lib/gif_hash.c: Functions needed for the LZW encoder. - * lib/gif_hash.h: Functions needed for the LZW encoder. - * lib/Makefile.am: Add gif_hash.c gif_hash.h to the list of sources. - -1998 15 Dec Toshio Kuratomi - * lib/dgif_lib.c: (DGifSlurp) Fix a Seg Fault when an image contains - no extension blocks. - -1998 14 Dec Toshio Kuratomi - * configure.in: Update version to 4.0 - * lib/Makefile.am: Update libtool version to 4:0:0 (libtool) - * libungif.spec: Update for version 4.0 (not binary compatible with - giflib, change version.) - * lib/gif_lib_private.h: (PrivateType) New header for common stuff - private to the library. Currently, this is only the Private struct. - * lib/dgif_lib.c: (PrivateType) Extract the Private struct to - gif_lib_private.h - * lib/egif_lib.c: (PrivateType) Extract the Private struct to - gif_lib_private.h - * lib/Makefile.am: Add gif_lib_private.h to the list of source files. - * lib/gif_lib.h: (ExtensionBlock) Add a Function entry to the - ExtensionBlock record. Note that this is not entirely correct: - the GifLib ExtensionBlock structure is actually a data sub-block - record. By adding the function entry here, we are pushing the - ExtensionBlockType in with the DataSubBlock. - Sometime in the future, we need to change the API to have true - ExtensionBlocks which have DataSubBlocks belonging to them. - * lib/gif_lib.h: (ExtensionBlock) Deprecate the use of Function in - the SavedImage struct. Use ExtensionBlock's Function instead. - * lib/egif_lib.c: (EGifSpew) Changes to use the new Function variable. - * lib/dgif_lib.c: (DGifSlurp) Changes to put data into the new - Function variable. - -1998 3 Dec Toshio Kuratomi - * lib/dgif_lib.c: (DGifSlurp) Three changes: - - No longer allocate SaveImage in this function. All allocations - of SaveImage take place in DGifGetImageDesc. - - Extension blocks are now associated with the Image Block that is - read in subsequent to them, not before. This should now be - conformant to the gif89a specification. - - Fix an off-by-one error when copying extension data from structure - to structure. - * lib/dgif_lib.c: (DGifGetImageDesc) Change the function to do its own - allocation of space for the SavedImage structure no matter what. - * lib/egif_lib.c: (EGifSpew) The function now spits out - ExtensionBlocks before the associated Image Block to conform with - the gif89a specification. - * lib/egif_lib.c: (EGifOpenFileHandle) Move the write of the - GifVersion (gif87a or gif89a) from this function into - EGifPutScreenDesc so that it can be controlled by EGifSpew. Note - that this is still a hack as the GifVersion write doesn't really - belong in either of these functions. - * lib/egif_lib.c: (EGifPutScreenDesc) Moved writing the version - (gif87a or gif89a) into the file into this function from - EGifOpenFileHandle. - * test-unx: Now test the extension code. - * pic/x-trans.gif: New image with Comments and transparency to test - the extension code with. - -1998 29 Nov Toshio Kuratomi - * lib/dgif_lib.c: (DGifSlurp) Fix a few of the minor bugs plaguing - this function. At this point, the function should no longer cause - a Seg Fault. It is now losing all extension data however. I know - how to hack a fix in, but I need to commit these changes first. - * lib/dgif_lib.c: (DGifGetImageDesc) Fix my bug fix: the colormap is - now only copied if it exists :-). - -1998 10 Nov Toshio Kuratomi - * test-unx: Add a test for DGifSlurp and EGifSpew - -1998 14 Oct Toshio Kuratomi - * lib/dgif_lib.c: (DGifGetImageDesc) Fix a bug where the Colormap for - the image description and the SaveImage were pointers to the same - structure, causing a SegV when DGifClosing the file. - -1998 9 Oct Toshio Kuratomi - * lib/dgif_lib.c: (DGifSlurp) memory for the extensions was not being - allocated. Now I call AddExtensionBlock when I add an extension to - the structure. Additionally, fix a memory leak here. - * configure.in, NEWS, lib/Makefile.am: Update to version 3.1.1 - * ltmain.sh, ltconfig: removed from the cvs repository - * BUGS: add the BUGS file to list unresolved BUGS. - -1998 9 Sep Toshio Kuratomi - * libungif.spec: Fix wrong version in %files and %install section. - -1998 8 Sep Toshio Kuratomi - * lib/gif_hash.c, lib/gif_hash.h: Removed these because a hash table - is not needed to create uncompressed gifs. - * lib/egif_lib.c: Remove all references to the hash functions. - * lib/Makefile.am: Remove gif_hash.c gif_hash.h from the source files. - * libungif.lsm: added this file - -1998 7 Sep Toshio Kuratomi - * lib/dgif_lib.c, lib/gif_lib.h: (DGifOpen) Add callback to read gif - image through user supplied function (Peter Mehlitz). - -1998 6 Sep Toshio Kuratomi - * util/*.{gif.rle}: removed files that were left by my testing - process and shouldn't have been in the distribution. - * UNCOMPRESSED_GIF: add section on why software that can decode - LZW compressed gifs (but not write them) is legal. - * .cvsignore: added .cvsignore files to ignore Makefiles and other - generated files in my cvs repository. - * Makefile.am's: Fixes to allow the dist* family of targets to work - correctly. Preliminary support for make check as well. - * configure.in: Update version to 3.1.0 - * lib/Makefile.am: Update libtool version to 4:0:1 libtool) - * libungif-3.0.spec: Update from Marc Ewing. - * Add int/pointer Alpha fixes from Dick Porter to many source files. diff --git a/third_party/giflib/NEWS b/third_party/giflib/NEWS deleted file mode 100644 index 4652fd390..000000000 --- a/third_party/giflib/NEWS +++ /dev/null @@ -1,591 +0,0 @@ - GIFLIB NEWS - -Short summary of recent news: - Minor API change to assist library wrappers in dynamic languages. - The gif2raw utility has been removed. - Various minor fix patches for unusual edge cases. - -Version 5.1.0 -============= - -Changes to the API require a library major-version bump. - -Code Fixes ----------- - -* A small change to the API: DGifClose() and EGifClose() now take a - pointer-to-int second argument (like the corresponding openers) - where a diagnostic code will be deposited when they return - GIF_ERROR. This replaces the old behavior in which the GifFile - structure was left unfreed so the Error member in it could be filled - and remain available. The change was was required because it's - not always possible to free the struct afterwards. Case in point is - a C# wrapper for giflib (or any language/environment where you can't - just free objects allocated in a foreign shared library.) - -* Minor fix for SF bug #56; BitsPerPixel may be left as uninitialized - value when reading (truncated) gif. - -* Applied SF patch #17: Use a fallback on Windows where mkstemp is not - available. - -* Applied SF patch #15: Code hardening, preventing spurious - defective-image messages. - -Retirements ------------ - -* Removed gif2raw from utils. Its blithe assumption that the EGA16 - palette is a reliable default is now about 20 years obsolete. Format - conversion is better done with convert(1) from the ImageMagick suite, - anyway. - -Version 5.0.6 -============= - -Minor fix for a rare memory leak (SF bug #55). - -MinGW port fixes. - -Repair the internal quantization function used in gif2rgb so it's -less vulnerable to cross-platform skew due to qsort() being unstable. -This shouldn't affect production use, it's just a cross-platform -issue for regression testing - -Version 5.0.5 -============= - -Set the error return properly when a screen descriptor read fails. -Fixes for some minor API documentation bugs. Some internal manual -pages are not to be installed. - -Version 5.0.4 -============= - -Fix for a rare misrendering bug when a GIF overruns the decompression-code -table. The image on which this was spotted was a relatively long-running -animated GIF; still images of ordinary size should have been immune. - -Version 5.0.3 -============= - -Fix a build-system glitch so it will install manpages. - -Version 5.0.2 -============= - -Documentation and polish ------------------------- -* Partial build is now possible on systems without xmlto. - -Code Fixes ----------- -* Change unused return of EGifSetGifVersion() to void. -* Buffer overrun prevention in gifinto. - -Version 5.0.1 -============= - -Documentation and polish ------------------------- -* There is now an installable manual page for the GIFLIB utility kit. - -Retirements ------------ -* gifinter is gone. Use convert -interlace from the ImageMagic suite. - -Code Fixes ----------- -* In 5.0.0 the private gif89 bit wasn't being guaranteed cleared at - the beginning of EGifGetGifVersion(); this occasionally led to an - incorrect version prefix being issued dependent on the state of - malloced memory. -* An EGifSetGifVersion() function taking a GifFile argument has been - added for use with the low-level sequential API. This change requires - a bump of the library revision number. - -Version 5.0.0 -============= - -Changes to the API require a library major-version bump. Certain -initialization functions have acquired an integer address argument for -passing back an error code, in order to avoid thread-unsafe static -storage. Application code using extension blocks will require minor -changes. A few functions have been renamed. - -Code Fixes ----------- -* Fixes applied for CVE-2005-2974 and CVE-2005-3350 - This closes Debian bug #337972. - -New API Features ----------------- - -Thread Safety -~~~~~~~~~~~~~ -The library is now completely re-entrant and thread-safe. - -* Library error handling no longer uses a static cell to store the last - error code registered; that made the library thread-unsafe. For functions - other than GIF file openers, the code is now put in an Error member of - the GifFileType structure. The GifError() amd GifLastError() functions - that referenced that static cell are gone, and the GifErrorString() - function introduced in the 4.2 release now takes an explicit error code - argument. -* GIF file openers - DGifOpenFileName(), DGifOpenFileHandle(), DGifOpen(), - EGifOpenFileName(), EGifOpenFileHandle(), and EGifOpen() - all now take - a final integer address argument. If non-null, this is used to pass - back an error code when the function returns NULL. - -Extensions -~~~~~~~~~~ -The ExtensionBlock API has been repaired, solving some problems with GIF89 -extension handling in earlier versions. - -* DGifSlurp() and EGifSpew() now preserve trailing extension blocks with - no following image file. -* Three documented functions - EGifPutExtensionFirst(), EGifPutExtensionNext(), - and EGifPutExtensionLast() - have been relaced by new functions - EGifPutExtensionLeader(), EGifPutExtensionBlock(), and - EGifPutExtensionTrailer(). See the Compatibility section of - the library API documentation for details. -* New functions DGifSavedExtensionToGCB() and EGifGCBToSavedExtension() - make it easy to read and edit GIF89 graphics control blocks in saved images. - -Namespacing -~~~~~~~~~~~ -All functions exported by giflib now have DGif, EGif, or Gif as a name prefix. - -* Three documented functions - MakeMapObject(), FreeMapObject(), and - UnionColorMap() - have been renamed to GifMakeMapObject(), - GifFreeMapObject(), and GifUnionColorMap() respectively. -* The library Draw* functions are now prefixed GifDraw*, and the - text-drawing ones are suffixed with "8x8". This fixes a conflict - with the Windows API and leaves the door open for more general text-drawing - functions with different font sizes. - -Other changes -~~~~~~~~~~~~~ -* DGifSlurp() and EGifSpew() now read and write interlaced images properly. -* The amazingly obscure colormap sort flag and pixel aspect ratio - features of GIF are now read and preserved, for whatever good that - may do. -* Six undocumented functions have been renamed; five of these take additional - or slightly different argument types. See the Compatibility section of - the library API documentation for details. -* There's now an EGifGetGifVersion() that computes the version EGifSpew() - will write. -* QuantizeBuffer() has been returned to the core library as GifQuantizeBuffer() - - turns out some important applications (notably mplayer) were using it. -* TRUE and FALSE macros are gone, also VoidPtr. No more namespace pollution. -* Various arguments have been made const where possible. - -Retirements ------------ -* The (undocumented) gifinfo utility is gone. Use giftool -f instead. -* The gifburst utility is gone. Everybody has image viewers that - can pan now, and removing it gets rid of a dependency on Perl. -* gifcompose is gone. It was a decent idea when I wrote it in 1989, - but I did the same thing better and cleaner a decade later with - PILdriver in the PIL package. Removing it gets rid of a dependency - on shell. -* gif2x11 gifasm, gifcomb, gifflip, gifovly, gifpos, gifresize, and gifrotate - are all gone. The ImageMagick display(1)/convert(1) utilities and PILdriver - do these things better and in a format-independent way. -* Lennie Araki's Windows C++ wrapper is gone. It's eight years old, - unmaintained, he has dropped out of sight, and a better one needs to - be written to use the high-level GIFLIB API and GIF89 graphics - control extension support. We'll carry such a wrapper when we have - a maintainer for it. -* EGifSetVersion(), introduced in 4.2, is gone. The library always - writes GIF87 or GIF89 as required by the data. This change helps - with thread safety. - -Utilities ---------- -* Several utilities have been renamed to (a) fix last-century's habit - of arbitarily smashing vowels out of names to make them just one or two - characters shorter, (b) ensure that every utility in this set has 'gif' - as a name prefix. Here's the list: - - giffiltr -> giffilter - gifspnge -> gifsponge - icon2gif -> gifbuild - text2gif -> gifecho - raw2gif -> gif2raw - -* To go with its new name, gif2raw now dumps raw pixels from a GIF if the - (previously required) size option is missing. -* Standalone rgb2gif is gone; the same capability is now a mode of gif2rgb. -* giftext displays the parsed contents of GIF89 graphics control blocks. -* gifbuild handles GIF89 graphics control blocks and Netscape animation - loop blocks; it can can display and update either. -* gifrotate and other filter utilities now preserve extension blocks, - including the graphics control information for transparency and delay time. -* A new utility, giftool, supports a wide variety of filtering operations - on GIFs, including: setting background and transparency colors, changing - interlacing, setting image delays, setting the user-input flag, and setting - the aspect-ratio byte. It can sequence multiple operations. -* The test-pattern generators gifbg, gifcolor, gihisto and gifwedge and the - code templates giffilter and gifsponge are no longer installed by default. - -Documentation and polish ------------------------- -* The history.txt and build.txt and files from 4.2.0 now have .asc extensions - to indicate that they use asciidoc markup, contrasting with the txt - standards files from CompuServe. -* The documentation now includes "What's In A GIF", a very detailed narrative - description of the file format. -* The -A option of gifasm (for inserting a loop control block) is documented. -* The documentation directory includes a copy of the original GIF87 - specification as well as GIF89's. -* The project now has a logo. - -Version 4.2.0 -============= - -Now maintained by ESR again after handoff by Toshio Kuratomi. - -Code Fixes ----------- -* Code updated internally to C99 to enable more correctness checks by - the compiler. Compiles under GCC 4.6.1 without errors or warnings. -* A rare resource leak in the colormap-object maker was found with - Coverity and fixed. -* The code now audits clean under Coverity and cppcheck. -* splint cleanup begun, there's a lot of work still to do on this. - -New API Features ----------------- -* The default GIF version to write is now computed at write time from - the types of an image's extension blocks, but can be overridden with - EGifSetGifVersion(). -* EGifSpew() is now thread-safe. -* Two new functions, GifError() and GifErrorString(), - return the error state in a form that can be used by programs. -* Two library functions - EGifOpenFileName() and EGifPutImageDesc() - - now have bool rather than int flag arguments. Since bool is a - typedef of int and TRUE/FALSE have been redefined to true/false, - both source and object compatibility with older library versions - should be preserved. -* GAGetArgs(), used only in the utilities, now returns bool rather - than int. -* The undocumented GIF_LIB_VERSION symbol is gone from the library header. - It has been replaced with three documented symbols: GIFLIB_MAJOR, - GIFLIB_MINOR, and GIFLIB_RELEASE. - -Retirements ------------ -* The gif2epsn and gif2iris utilities are gone. They were full of - platform dependencies for platforms long dead. There are enough - platform-independent GIF viewers in the world that these weren't - adding any value. Removing these gets rid of a dependency on GL. -* The rle2gif, gif2rle, and gif2ps utilities are also gone. There are enough - multiformat image converters in the world that these weren't adding - any value either. Removing them reduces the codebase's dependencies. -* The undocumented DumpScreen2Gif() is gone from the library. The - only non-obsolete capture mode it supported was through X, and that - probably hasn't been used in years and is replaceable by any number - of capture utilities. Dropping this code makes the library's - portability issues go away. -* QuantizeBuffer(), GifQprintf(), PrintGifError(), GIF_ERROR() - and GIF_MESSAGE() have been removed from the core library. - They were used only by the utilities. QuantizeBuffer() has been - inlined where it was used and the latter three are now part of the - utility support library. -* The Game Boy Advanced test code is gone. The platform was discontinued - in 2008; more to the point, nobody ever documented the code's assumptions - or expected results. -* The Changelog file is now retained for archival purposes only, and because - autotools throws a hissy fit if there isn't one. The single point of - truth about changes and the reasons for them is the repository history. - -Behavior changes ----------------- -* The -q option of the utilities is replaced by an opposite -v (verbose) - option; the default is now quiet for all platforms. Defaulting to chattiness - on MSDOS made sense in a world of slow text consoles, but not today. - -Testing -------- -* There is now a proper regression-test suite; run 'make' in tests/. - The old test-unx script is now tests/visual-check and can be run - occasionally for a check with the Mark One Eyeball. - -Documentation -------------- -* Build instructions now live in build.txt -* An overview of the giflib API now lives in api.txt. -* Documentation is now in DocBook-XML, so either HTML or man pages can - be generated from it. - -Version 4.1.6 -============= -Brown paper bag release. Fix a problem with header inclusion that could -prevent the library from building on some platforms. - -Version 4.1.5 -============= -This version has some important fixes for segfaults when working with corrupt -files. All users are strongly encouraged to upgrade. - -Code Fixes ----------- -* Fix segfault in utilities due to referencing ColorMaps in GifFiles that had - no ColorMap present. -* Fix gif2x11 to work on 24 bit displays. -* Fix for giftext segfault when the GifFile does not store a global colormap. -* Checks to fail gracefully when an image contains improper LZ codes. -* Close file handles on failure in DGifOpenFileHandle() -* Checks to operate on files in binary mode on WIN32 as well as MSDOS. - -Building --------- -* Add checks to make building on Win32 easier. -* Allow turning off gl_s, rle, and X11 support from the configure command line. -* Fix for finding a 32 bit integer type on some platforms. -* Only enable -Wall if we're using gcc. - -Version 4.1.4 -============= -This version fixes some bugs with deallocating ColorMaps. Fix building on -several platforms. Fix x86_64 builds to not hang the encoder. - -* Fix several areas in decoding where we removed a ColorMap from our GifFile - but didn't set the pointer to NULL. This could lead to double free's of - the ColorMap. -* Fix a bug in dev2gif.c where we redefined some gl types incorrectly. -* Fix a bug in the gif LZW encoder that was triggered on modern 64 bit - platforms. -* Fix building on Windows. Note -- there has been one API changing event for - Windows (renaming DrawText to DrawGifText.) This should have conflicted with - Windows API and therefore caused the builds to fail previously. If you had - it working with DrawText before, apologies, you'll need to change to - DrawGifText in your code. This only affects Windows. -* Add support for building on The Game Boy Advance. Note: Due to the GBA's - limited memory, the API for the GBA uses short's in many places where the - other platforms use ints. This shouldn't affect anyone unless you've - been able to get an older version of the code to run on GBA and want to - start using this version instead. A recompile of your dependent code - will be necessary in this case. - -Version 4.1.3 -============= -This version fixes some bugs in the Extension writing code in -EGifPutExtensionFirst, Next, and Last. Using these functions, it is possible -to output extensions that contain multiple subblocks. Additionally, library -code has been updated to use these functions, making it safe to output -long Comments, and multi-block extensions read in from another file. - -* giflib is now hosted on sourceforge with libungif: - http://sourceforge.net/projects/libungif -* Make the EGifPutExtension{First,Next,Last} family of functions use WRITE - so user defined WRITE methods will output them correctly. -* Modify EGifSpew and EGifPutComment to use EGifPutExtension{First,Next,Last} - so we won't output broken GIFs when dealing with GIFs with multiple - subblocks. -* More -Wall fixes revealed while testing on Solaris and FreeBSD. -* Updated the gif_lib.html documentation to not use EGifPutExtension when - dealing with multiple subblocks. Use EGifPutExtension{First,Next,Last} - instead. -* Some Windows code from the old CVS repository now available in the windows - subdirectory. I don't have a Windows environment to test and maintain this - but maybe someone out there will find it useful. Caveat hacker. - -Version 4.1.2 -============= -* Numerous bug fixes from people on the old libungif mailing list. -* GIF_ERROR and GIF_MESSAGE are on the deprecation list as they are also - utility helper functions rather than essential to the functioning of the - library. -* Complete deprecation list is now in the README file -* Audited the sources with gcc -Wall. Everything detectable has now been fixed. -* Ran the library code through indent. - -Version 4.1.1 -============= -* Merge in many bug fixes that were sent in while I was hiking the - Appalachian Trail. -* The qprintf methods of the library are now deprecated. Do not use - GifQuietPrint or GifQprintf. These should have been pushed out into the - utility helper library instead of sitting around in the library proper at - the same time as the getarg functions were moved out. Getting rid of these - will let us get rid of our dependence on stdarg.h/varargs.h (Which a Gif - reading library has no business requiring.) - -Version 4.1.0 -============= -* Several minor memory leaks in error conditions have been plugged. -* New Function EGifOpen(void *userData, OutputFunc writeFunc) allows user - specified gif writing functions. -* Old copyright notices in a few source files have been updated. All library - copyrights should now reflect the copyright notice in the COPYING file. - -Version 4.0.0 -- giflib -======================= -This version of the giflib library merges Eric Raymond's giflib-3.0 release -with the libungif-4.0 release to give people a binary compatible choice -between the two libraries and gives me the chance to add bugfixes to giflib -that have been incorporated in libungif. - -PLEASE READ THE FILE PATENT_PROBLEMS BEFORE USING THIS LIBRARY! - -Version 4.0.0 -============= -Major fixes have been made to the code that handles Extensions. -Unfortunately, this causes binary incompatibility with giflib-3.0 and -libungif-3.x. However, the API is still intact. I am, however, deprecating -the use of saveImage[x].Function. Use -saveImage[x].ExtensionBlocks[y].Function instead. - -Version 3.1.1 -============= - The following bugs which caused SegFaults have been fixed: - * When reading gif files with extensions, DGifSlurp would violate memory. - * When closing a gif that had a local colormap, DGifCloseFile would attempt - to free the colormap twice. - * Fix a potential memory leak in DGifSlurp. - * New function DGifOpen to allow specifying a user definable gif reading - function. - -Version 3.1.0 -============= - * Add a new function: - GifFileType *DGifOpen(void * userData, InputFunc readFunc) - to read the gif image from a user defined input function. - * A few bugfixes. - -Version 3.0 -=========== - -Changes from Eric Raymond's libgif ----------------------------------- -* A new gif encoder that makes uncompressed gifs rather than standard, - LZW-compressed gifs. This is actually the major motivating factor behind - libungif; to provide third-party distributors a means to provide a gif - library without the patented LZW encoder. -* A new configure script to make compilation of the library on multiple - platforms easier. The package should now build shared libraries on all - platforms supported by GNU libtool. -* Removed the getarg functions from libgif. These were not part of the - public API and only used by the tools in the utils directory so I separated - them from the rest of the library. -* Fixed a few bugs in the tools in the utils directory. - -Version 3.0 -=========== - -New features ------------- -* Incorporated Sirtaj Kang's changes to make both static and shared libs. -* All the utility and library docs are HTML now. -* The library and relevant utilities are now fully GIF89-aware. -* Functions for drawing text and boxes on saved images are documented. -* The distribution is now issued under a simple X-Consortium-style license. -* Can now generate package RPMs and LSM automatically. -* Home page with Web-acessible documentation at http://www.ccil.org/~esr/giflib - -Bug fixes ---------- -* Fix giftext to not core dump on a null extension record. -* Incorporate Philip VanBaren's change to prevent a core dump in gifasm. - -Version 2.3 -=========== -* Fixed a core-dump bug in gifcomb revealed by ELF environment in Linux 1.2.13. - -Version 2.2b -============ -* Added gifburst tool. - -Version 2.2 -=========== -* Linux is supported. - -Version 2.1 -=========== -* Added the gifovly tool, which supports making a composite from several GIF - images. -* Used gifovly to implement a full-fledged pasteup program in shell. It's - called gifcompose and lives in the util directory. -* Added a copy of the GIF89 standard to the doc directory (gif89.txt); - also a description of the preferred compression method (lzgif.txt). - -Version 2.0 -=========== - With this version, development was taken over from Gershon Elber by Eric -S. Raymond . Note that I, esr, have pretty much -adhered to Gershon's coding style, even though it's quite baroque and DOS- -headed by my standards. - -Library Improvements --------------------- -* New DGifSlurp() and EGifSpew() library entry points allow all GIF-bashing - to be done in core on machines with sufficient memory. Writing code to - slice'n'dice multiple GIFs in non-sequential ways is now much easier (send - kudos and brickbats to esr, small unmarked bills preferred). -* The interface has changed somewhat. Members in the GifFileType structure - have been renamed and regrouped. This was required for support of the - SavedImages member (which enables the new functions mentioned in 1). Also, - there is a new data type for allocated color maps and routines to handle - it conveniently. -* Some minor bugs have been fixed. Most notably, the DGif code now correctly - handles the possibility of more than one code block per extension record, - as per the GIF spec. It's not clear, however, that anyone ever has or - ever will use this feature for anything... - -New Tools and Options ---------------------- -* A brand new, ultra-spiffy tool `icon2gif' is included. It assembles named - GIFs with editable text color map & icon raster representations to produce - multi-image GIFs usable as graphical resource files. It can also dump most - GIFs in the same text-only form it parses. This makes it easy to edit GIFs - even if you don't have a graphics editor. -* The gifclip utility supports a new `-c' (complement) option that allows you - to perform an `inverse clip', removing horizontal or vertical bands from an - image. -* The gifclrmp utility supports a new `-t' switch for shuffling color index - values. -* A new tool `gifcolor' generates test pattern from colormap input. - -New Documentation and Examples ------------------------------- -* The documentation has been overhauled completely and translated out of the - dialect spoken by the estimable Mr. Elber into something like standard - English :-). -* Two source code files gifspnge.c and giffiltr.c have been added to the - util directory. These are GIF copiers that exercise the I/O routines, - provided as skeletons for your applications. Read the comments in them - for more info. -* The util Makefile for UNIX has been improved. It now uses the cc/gcc -s - option rather than strip(1). There are now separate install productions, - so you can test new versions in util before installation for production - (the top-level make script still does an install). - -Version 1.2 -=========== -* GIFFIX - a new tool to attempt and fix broken GIF images. Currently fix - images that has EOF prematurely by padding with the darkest color. -* Make GIF2BGI display as much as it can considering the mem. avail. -* Add -q flag to all tools for quite running scan line number mode. -* Fix a (minor!?) bug in the GIF decoder when encountering code 4095. -* New tools (RGB2GIF and GIF2RGB) to convert GIF to/from 24 bits RGB images. -* New tool GIFROTAT to rotate a gif image by an arbitrary angle. -* GifRSize was updated to resize by an arbitrary factor. - -Version 1.1 -=========== -* GIF2BGI - a new utility to display GIF images using Borland's BGI drivers - (if you have one...) -* TEXT2GIF - Converts plain text into GIF images. -* GIF2IRIS - SGI4D display program for GIF images. -* GIF_LIB naming convension has been modified to make sure it has unique - names (see gif_lib.h). -* Support for SGI4D gl and X11 window grabbing has been added to the - library. SGI4D input is quantizied into 8 bits. - Also support for EGA/VGA devices has been added as well. - see Dev2gif.c module. -* Support for the new gif89a format has been added. - - - diff --git a/third_party/giflib/README b/third_party/giflib/README deleted file mode 100644 index 38a9233c0..000000000 --- a/third_party/giflib/README +++ /dev/null @@ -1,27 +0,0 @@ -= GIFLIB = - -This is the README file of GIFLIB, a library for manipulating GIF files. - -Latest versions of GIFLIB are currently hosted at: - http://sourceforge.net/projects/giflib - -== Overview == - -GIF is a legacy format; we recommend against generating new images in -it. For a cleaner, more extensible design with better color support -and compression, look up PNG. - -giflib provides code for reading GIF files and transforming them into -RGB bitmaps, and for writing RGB bitmaps as GIF files. - -The (permissive) open-source license is in the file COPYING. - -You will find build instructions in build.asc - -You will find full documentation of the API in doc/ and on the -project website. - -The project has a long and confusing history, described in history.asc - -The project to-do list is in TODO. - diff --git a/third_party/giflib/TODO b/third_party/giflib/TODO deleted file mode 100644 index 488a3307f..000000000 --- a/third_party/giflib/TODO +++ /dev/null @@ -1,3 +0,0 @@ -= GIFLIB TODO list = - -Currently empty. diff --git a/third_party/giflib/config.h.cmake b/third_party/giflib/config.h.cmake deleted file mode 100644 index 52741d64d..000000000 --- a/third_party/giflib/config.h.cmake +++ /dev/null @@ -1,124 +0,0 @@ -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_DLFCN_H ${HAVE_DLFCN_H} - -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ -#cmakedefine HAVE_DOPRNT ${HAVE_DOPRNT} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_FCNTL_H ${HAVE_FCNTL_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_GL_GL_H ${HAVE_GL_GL_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_INTTYPES_H ${HAVE_INTTYPES_H} - -/* Define if the gl_s library is installed (SGI GL library) */ -#cmakedefine HAVE_LIBGL_S ${HAVE_LIBGL_S} - -/* Define if the X11 library is installed */ -#cmakedefine HAVE_LIBX11 ${HAVE_LIBX11} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_RLE_H ${HAVE_RLE_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STDLIB_H ${HAVE_STDLIB_H} - -/* Define to 1 if you have the `strdup' function. */ -#cmakedefine HAVE_STRDUP ${HAVE_STRDUP} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_STRING_H ${HAVE_STRING_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_SYS_TYPES_H ${HAVE_SYS_TYPES_H} - -/* Define to 1 if the system has the type `uint32_t'. */ -#cmakedefine HAVE_UINT32_T ${HAVE_UINT32_T} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_UNISTD_H ${HAVE_UNISTD_H} - -/* Define to 1 if the system has the type `u_int32_t'. */ -#cmakedefine HAVE_U_INT32_T ${HAVE_U_INT32_T} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_VARARGS_H ${HAVE_VARARGS_H} - -/* Define to 1 if you have the `vprintf' function. */ -#cmakedefine HAVE_VPRINTF ${HAVE_VPRINTF} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_X11_XLIB_H ${HAVE_X11_XLIB_H} - -/* Define to 1 if you have the header file. */ -#cmakedefine HAVE_X11_XUTIL_H ${HAVE_X11_XUTIL_H} - -/* Define to 1 if your C compiler doesn't accept -c and -o together. */ -#cmakedefine NO_MINUS_C_MINUS_O ${NO_MINUS_C_MINUS_O} - -/* Name of package */ -#cmakedefine PACKAGE ${PACKAGE} - -/* Define to the address where bug reports for this package should be sent. */ -#cmakedefine PACKAGE_BUGREPORT ${PACKAGE_BUGREPORT} - -/* Define to the full name of this package. */ -#cmakedefine PACKAGE_NAME ${PACKAGE_NAME} - -/* Define to the full name and version of this package. */ -#cmakedefine PACKAGE_STRING ${PACKAGE_STRING} - -/* Define to the one symbol short name of this package. */ -#cmakedefine PACKAGE_TARNAME ${PACKAGE_TARNAME} - -/* Define to the version of this package. */ -#cmakedefine PACKAGE_VERSION ${PACKAGE_VERSION} - -/* Define to 1 if the C compiler supports function prototypes. */ -#cmakedefine PROTOTYPES ${PROTOTYPES} - -/* Define to 1 if the `setvbuf' function takes the buffering type as its - second argument and the buffer pointer as the third, as on System V before - release 3. */ -#cmakedefine SETVBUF_REVERSED ${SETVBUF_REVERSED} - -/* The size of `unsigned int', as computed by sizeof. */ -#cmakedefine SIZEOF_UNSIGNED_INT ${SIZEOF_UNSIGNED_INT} - -/* The size of `unsigned long', as computed by sizeof. */ -#cmakedefine SIZEOF_UNSIGNED_LONG ${SIZEOF_UNSIGNED_LONG} - -/* Define to 1 if you have the ANSI C header files. */ -#cmakedefine STDC_HEADERS ${STDC_HEADERS} - -/* Set to an unsigned 32 bit integer available on this system */ -#cmakedefine UINT32 ${UINT32} - -/* Version number of package */ -#cmakedefine VERSION ${VERSION} - -/* Define to 1 if the X Window System is missing or not being used. */ -#cmakedefine X_DISPLAY_MISSING ${X_DISPLAY_MISSING} - -/* Define like PROTOTYPES; this can be used by system headers. */ -#cmakedefine __PROTOTYPES ${__PROTOTYPES} - -/* Define to empty if `const' does not conform to ANSI C. */ -#cmakedefine const ${const} diff --git a/third_party/giflib/lib/dgif_lib.c b/third_party/giflib/lib/dgif_lib.c deleted file mode 100644 index 7639dbb54..000000000 --- a/third_party/giflib/lib/dgif_lib.c +++ /dev/null @@ -1,1170 +0,0 @@ -/****************************************************************************** - -dgif_lib.c - GIF decoding - -The functions here and in egif_lib.c are partitioned carefully so that -if you only require one of read and write capability, only one of these -two modules will be linked. Preserve this property! - -*****************************************************************************/ - -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 - #include - #define posix_open _open - #define posix_close _close - #define posix_fdopen _fdopen -#else - #include - #define posix_open open - #define posix_close close - #define posix_fdopen fdopen -#endif - -#include "gif_lib.h" -#include "gif_lib_private.h" - -/* compose unsigned little endian value */ -#define UNSIGNED_LITTLE_ENDIAN(lo, hi) ((lo) | ((hi) << 8)) - -/* avoid extra function call in case we use fread (TVT) */ -#define READ(_gif,_buf,_len) \ - (((GifFilePrivateType*)_gif->Private)->Read ? \ - ((GifFilePrivateType*)_gif->Private)->Read(_gif,_buf,_len) : \ - fread(_buf,1,_len,((GifFilePrivateType*)_gif->Private)->File)) - -static int DGifGetWord(GifFileType *GifFile, GifWord *Word); -static int DGifSetupDecompress(GifFileType *GifFile); -static int DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, - int LineLen); -static int DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode); -static int DGifDecompressInput(GifFileType *GifFile, int *Code); -static int DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, - GifByteType *NextByte); - -/****************************************************************************** - Open a new GIF file for read, given by its name. - Returns dynamically allocated GifFileType pointer which serves as the GIF - info record. -******************************************************************************/ -GifFileType * -DGifOpenFileName(const char *FileName, int *Error) -{ - int FileHandle; - GifFileType *GifFile; - - if ((FileHandle = posix_open(FileName, O_RDONLY)) == -1) { - if (Error != NULL) - *Error = D_GIF_ERR_OPEN_FAILED; - return NULL; - } - - GifFile = DGifOpenFileHandle(FileHandle, Error); - return GifFile; -} - -/****************************************************************************** - Update a new GIF file, given its file handle. - Returns dynamically allocated GifFileType pointer which serves as the GIF - info record. -******************************************************************************/ -GifFileType * -DGifOpenFileHandle(int FileHandle, int *Error) -{ - char Buf[GIF_STAMP_LEN + 1]; - GifFileType *GifFile; - GifFilePrivateType *Private; - FILE *f; - - GifFile = (GifFileType *)malloc(sizeof(GifFileType)); - if (GifFile == NULL) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_ENOUGH_MEM; - posix_close(FileHandle); - return NULL; - } - - /*@i1@*/memset(GifFile, '\0', sizeof(GifFileType)); - - /* Belt and suspenders, in case the null pointer isn't zero */ - GifFile->SavedImages = NULL; - GifFile->SColorMap = NULL; - - Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); - if (Private == NULL) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_ENOUGH_MEM; - posix_close(FileHandle); - free((char *)GifFile); - return NULL; - } -#ifdef _WIN32 - _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ -#endif /* _WIN32 */ - - f = posix_fdopen(FileHandle, "rb"); /* Make it into a stream: */ - - /*@-mustfreeonly@*/ - GifFile->Private = (void *)Private; - Private->FileHandle = FileHandle; - Private->File = f; - Private->FileState = FILE_STATE_READ; - Private->Read = NULL; /* don't use alternate input method (TVT) */ - GifFile->UserData = NULL; /* TVT */ - /*@=mustfreeonly@*/ - - /* Let's see if this is a GIF file: */ - if (READ(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) { - if (Error != NULL) - *Error = D_GIF_ERR_READ_FAILED; - (void)fclose(f); - free((char *)Private); - free((char *)GifFile); - return NULL; - } - - /* Check for GIF prefix at start of file */ - Buf[GIF_STAMP_LEN] = 0; - if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_GIF_FILE; - (void)fclose(f); - free((char *)Private); - free((char *)GifFile); - return NULL; - } - - if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { - (void)fclose(f); - free((char *)Private); - free((char *)GifFile); - return NULL; - } - - GifFile->Error = 0; - - /* What version of GIF? */ - Private->gif89 = (Buf[GIF_VERSION_POS] == '9'); - - return GifFile; -} - -/****************************************************************************** - GifFileType constructor with user supplied input function (TVT) -******************************************************************************/ -GifFileType * -DGifOpen(void *userData, InputFunc readFunc, int *Error) -{ - char Buf[GIF_STAMP_LEN + 1]; - GifFileType *GifFile; - GifFilePrivateType *Private; - - GifFile = (GifFileType *)malloc(sizeof(GifFileType)); - if (GifFile == NULL) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - - memset(GifFile, '\0', sizeof(GifFileType)); - - /* Belt and suspenders, in case the null pointer isn't zero */ - GifFile->SavedImages = NULL; - GifFile->SColorMap = NULL; - - Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); - if (!Private) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_ENOUGH_MEM; - free((char *)GifFile); - return NULL; - } - - GifFile->Private = (void *)Private; - Private->FileHandle = 0; - Private->File = NULL; - Private->FileState = FILE_STATE_READ; - - Private->Read = readFunc; /* TVT */ - GifFile->UserData = userData; /* TVT */ - - /* Lets see if this is a GIF file: */ - if (READ(GifFile, (unsigned char *)Buf, GIF_STAMP_LEN) != GIF_STAMP_LEN) { - if (Error != NULL) - *Error = D_GIF_ERR_READ_FAILED; - free((char *)Private); - free((char *)GifFile); - return NULL; - } - - /* Check for GIF prefix at start of file */ - Buf[GIF_STAMP_LEN] = '\0'; - if (strncmp(GIF_STAMP, Buf, GIF_VERSION_POS) != 0) { - if (Error != NULL) - *Error = D_GIF_ERR_NOT_GIF_FILE; - free((char *)Private); - free((char *)GifFile); - return NULL; - } - - if (DGifGetScreenDesc(GifFile) == GIF_ERROR) { - free((char *)Private); - free((char *)GifFile); - *Error = D_GIF_ERR_NO_SCRN_DSCR; - return NULL; - } - - GifFile->Error = 0; - - /* What version of GIF? */ - Private->gif89 = (Buf[GIF_VERSION_POS] == '9'); - - return GifFile; -} - -/****************************************************************************** - This routine should be called before any other DGif calls. Note that - this routine is called automatically from DGif file open routines. -******************************************************************************/ -int -DGifGetScreenDesc(GifFileType *GifFile) -{ - int BitsPerPixel; - GifBool SortFlag; - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - /* Put the screen descriptor into the file: */ - if (DGifGetWord(GifFile, &GifFile->SWidth) == GIF_ERROR || - DGifGetWord(GifFile, &GifFile->SHeight) == GIF_ERROR) - return GIF_ERROR; - - if (READ(GifFile, Buf, 3) != 3) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - GifFreeMapObject(GifFile->SColorMap); - GifFile->SColorMap = NULL; - return GIF_ERROR; - } - GifFile->SColorResolution = (((Buf[0] & 0x70) + 1) >> 4) + 1; - SortFlag = (Buf[0] & 0x08) != 0; - BitsPerPixel = (Buf[0] & 0x07) + 1; - GifFile->SBackGroundColor = Buf[1]; - GifFile->AspectByte = Buf[2]; - if (Buf[0] & 0x80) { /* Do we have global color map? */ - int i; - - GifFile->SColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL); - if (GifFile->SColorMap == NULL) { - GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - - /* Get the global color map: */ - GifFile->SColorMap->SortFlag = SortFlag; - for (i = 0; i < GifFile->SColorMap->ColorCount; i++) { - if (READ(GifFile, Buf, 3) != 3) { - GifFreeMapObject(GifFile->SColorMap); - GifFile->SColorMap = NULL; - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - GifFile->SColorMap->Colors[i].Red = Buf[0]; - GifFile->SColorMap->Colors[i].Green = Buf[1]; - GifFile->SColorMap->Colors[i].Blue = Buf[2]; - } - } else { - GifFile->SColorMap = NULL; - } - - return GIF_OK; -} - -/****************************************************************************** - This routine should be called before any attempt to read an image. -******************************************************************************/ -int -DGifGetRecordType(GifFileType *GifFile, GifRecordType* Type) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - if (READ(GifFile, &Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - - switch (Buf) { - case DESCRIPTOR_INTRODUCER: - *Type = IMAGE_DESC_RECORD_TYPE; - break; - case EXTENSION_INTRODUCER: - *Type = EXTENSION_RECORD_TYPE; - break; - case TERMINATOR_INTRODUCER: - *Type = TERMINATE_RECORD_TYPE; - break; - default: - *Type = UNDEFINED_RECORD_TYPE; - GifFile->Error = D_GIF_ERR_WRONG_RECORD; - return GIF_ERROR; - } - - return GIF_OK; -} - -/****************************************************************************** - This routine should be called before any attempt to read an image. - Note it is assumed the Image desc. header has been read. -******************************************************************************/ -int -DGifGetImageDesc(GifFileType *GifFile) -{ - unsigned int BitsPerPixel; - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - SavedImage *sp; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - if (DGifGetWord(GifFile, &GifFile->Image.Left) == GIF_ERROR || - DGifGetWord(GifFile, &GifFile->Image.Top) == GIF_ERROR || - DGifGetWord(GifFile, &GifFile->Image.Width) == GIF_ERROR || - DGifGetWord(GifFile, &GifFile->Image.Height) == GIF_ERROR) - return GIF_ERROR; - if (READ(GifFile, Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Image.ColorMap = NULL; - return GIF_ERROR; - } - BitsPerPixel = (Buf[0] & 0x07) + 1; - GifFile->Image.Interlace = (Buf[0] & 0x40) ? true : false; - - /* Setup the colormap */ - if (GifFile->Image.ColorMap) { - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Image.ColorMap = NULL; - } - /* Does this image have local color map? */ - if (Buf[0] & 0x80) { - unsigned int i; - - GifFile->Image.ColorMap = GifMakeMapObject(1 << BitsPerPixel, NULL); - if (GifFile->Image.ColorMap == NULL) { - GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - - /* Get the image local color map: */ - for (i = 0; i < (unsigned int)GifFile->Image.ColorMap->ColorCount; i++) { - if (READ(GifFile, Buf, 3) != 3) { - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Error = D_GIF_ERR_READ_FAILED; - GifFile->Image.ColorMap = NULL; - return GIF_ERROR; - } - GifFile->Image.ColorMap->Colors[i].Red = Buf[0]; - GifFile->Image.ColorMap->Colors[i].Green = Buf[1]; - GifFile->Image.ColorMap->Colors[i].Blue = Buf[2]; - } - } - - if (GifFile->SavedImages) { - if ((GifFile->SavedImages = (SavedImage *)realloc(GifFile->SavedImages, - sizeof(SavedImage) * - (GifFile->ImageCount + 1))) == NULL) { - GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - } else { - if ((GifFile->SavedImages = - (SavedImage *) malloc(sizeof(SavedImage))) == NULL) { - GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - } - - sp = &GifFile->SavedImages[GifFile->ImageCount]; - memcpy(&sp->ImageDesc, &GifFile->Image, sizeof(GifImageDesc)); - if (GifFile->Image.ColorMap != NULL) { - sp->ImageDesc.ColorMap = GifMakeMapObject( - GifFile->Image.ColorMap->ColorCount, - GifFile->Image.ColorMap->Colors); - if (sp->ImageDesc.ColorMap == NULL) { - GifFile->Error = D_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - } - sp->RasterBits = (unsigned char *)NULL; - sp->ExtensionBlockCount = 0; - sp->ExtensionBlocks = (ExtensionBlock *) NULL; - - GifFile->ImageCount++; - - Private->PixelCount = (long)GifFile->Image.Width * - (long)GifFile->Image.Height; - - /* Reset decompress algorithm parameters. */ - return DGifSetupDecompress(GifFile); -} - -/****************************************************************************** - Get one full scanned line (Line) of length LineLen from GIF file. -******************************************************************************/ -int -DGifGetLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) -{ - GifByteType *Dummy; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - if (!LineLen) - LineLen = GifFile->Image.Width; - - if ((Private->PixelCount -= LineLen) > 0xffff0000UL) { - GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; - return GIF_ERROR; - } - - if (DGifDecompressLine(GifFile, Line, LineLen) == GIF_OK) { - if (Private->PixelCount == 0) { - /* We probably won't be called any more, so let's clean up - * everything before we return: need to flush out all the - * rest of image until an empty block (size 0) - * detected. We use GetCodeNext. - */ - do - if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) - return GIF_ERROR; - while (Dummy != NULL) ; - } - return GIF_OK; - } else - return GIF_ERROR; -} - -/****************************************************************************** - Put one pixel (Pixel) into GIF file. -******************************************************************************/ -int -DGifGetPixel(GifFileType *GifFile, GifPixelType Pixel) -{ - GifByteType *Dummy; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - if (--Private->PixelCount > 0xffff0000UL) - { - GifFile->Error = D_GIF_ERR_DATA_TOO_BIG; - return GIF_ERROR; - } - - if (DGifDecompressLine(GifFile, &Pixel, 1) == GIF_OK) { - if (Private->PixelCount == 0) { - /* We probably won't be called any more, so let's clean up - * everything before we return: need to flush out all the - * rest of image until an empty block (size 0) - * detected. We use GetCodeNext. - */ - do - if (DGifGetCodeNext(GifFile, &Dummy) == GIF_ERROR) - return GIF_ERROR; - while (Dummy != NULL) ; - } - return GIF_OK; - } else - return GIF_ERROR; -} - -/****************************************************************************** - Get an extension block (see GIF manual) from GIF file. This routine only - returns the first data block, and DGifGetExtensionNext should be called - after this one until NULL extension is returned. - The Extension should NOT be freed by the user (not dynamically allocated). - Note it is assumed the Extension description header has been read. -******************************************************************************/ -int -DGifGetExtension(GifFileType *GifFile, int *ExtCode, GifByteType **Extension) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - if (READ(GifFile, &Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - *ExtCode = Buf; - - return DGifGetExtensionNext(GifFile, Extension); -} - -/****************************************************************************** - Get a following extension block (see GIF manual) from GIF file. This - routine should be called until NULL Extension is returned. - The Extension should NOT be freed by the user (not dynamically allocated). -******************************************************************************/ -int -DGifGetExtensionNext(GifFileType *GifFile, GifByteType ** Extension) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (READ(GifFile, &Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - if (Buf > 0) { - *Extension = Private->Buf; /* Use private unused buffer. */ - (*Extension)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ - /* coverity[tainted_data] */ - if (READ(GifFile, &((*Extension)[1]), Buf) != Buf) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - } else - *Extension = NULL; - - return GIF_OK; -} - -/****************************************************************************** - Extract a Graphics Control Block from raw extension data -******************************************************************************/ - -int DGifExtensionToGCB(const size_t GifExtensionLength, - const GifByteType *GifExtension, - GraphicsControlBlock *GCB) -{ - if (GifExtensionLength != 4) { - return GIF_ERROR; - } - - GCB->DisposalMode = (GifExtension[0] >> 2) & 0x07; - GCB->UserInputFlag = (GifExtension[0] & 0x02) != 0; - GCB->DelayTime = UNSIGNED_LITTLE_ENDIAN(GifExtension[1], GifExtension[2]); - if (GifExtension[0] & 0x01) - GCB->TransparentColor = (int)GifExtension[3]; - else - GCB->TransparentColor = NO_TRANSPARENT_COLOR; - - return GIF_OK; -} - -/****************************************************************************** - Extract the Graphics Control Block for a saved image, if it exists. -******************************************************************************/ - -int DGifSavedExtensionToGCB(GifFileType *GifFile, - int ImageIndex, GraphicsControlBlock *GCB) -{ - int i; - - if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) - return GIF_ERROR; - - GCB->DisposalMode = DISPOSAL_UNSPECIFIED; - GCB->UserInputFlag = false; - GCB->DelayTime = 0; - GCB->TransparentColor = NO_TRANSPARENT_COLOR; - - for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; i++) { - ExtensionBlock *ep = &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; - if (ep->Function == GRAPHICS_EXT_FUNC_CODE) - return DGifExtensionToGCB(ep->ByteCount, ep->Bytes, GCB); - } - - return GIF_ERROR; -} - -/****************************************************************************** - This routine should be called last, to close the GIF file. -******************************************************************************/ -int -DGifCloseFile(GifFileType *GifFile, int *ErrorCode) -{ - GifFilePrivateType *Private; - - if (GifFile == NULL || GifFile->Private == NULL) - return GIF_ERROR; - - if (GifFile->Image.ColorMap) { - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Image.ColorMap = NULL; - } - - if (GifFile->SColorMap) { - GifFreeMapObject(GifFile->SColorMap); - GifFile->SColorMap = NULL; - } - - if (GifFile->SavedImages) { - GifFreeSavedImages(GifFile); - GifFile->SavedImages = NULL; - } - - GifFreeExtensions(&GifFile->ExtensionBlockCount, &GifFile->ExtensionBlocks); - - Private = (GifFilePrivateType *) GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - if (ErrorCode != NULL) - *ErrorCode = D_GIF_ERR_NOT_READABLE; - free((char *)GifFile->Private); - free(GifFile); - return GIF_ERROR; - } - - if (Private->File && (fclose(Private->File) != 0)) { - if (ErrorCode != NULL) - *ErrorCode = D_GIF_ERR_CLOSE_FAILED; - free((char *)GifFile->Private); - free(GifFile); - return GIF_ERROR; - } - - free((char *)GifFile->Private); - free(GifFile); - if (ErrorCode != NULL) - *ErrorCode = D_GIF_SUCCEEDED; - return GIF_OK; -} - -/****************************************************************************** - Get 2 bytes (word) from the given file: -******************************************************************************/ -static int -DGifGetWord(GifFileType *GifFile, GifWord *Word) -{ - unsigned char c[2]; - - if (READ(GifFile, c, 2) != 2) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - - *Word = (GifWord)UNSIGNED_LITTLE_ENDIAN(c[0], c[1]); - return GIF_OK; -} - -/****************************************************************************** - Get the image code in compressed form. This routine can be called if the - information needed to be piped out as is. Obviously this is much faster - than decoding and encoding again. This routine should be followed by calls - to DGifGetCodeNext, until NULL block is returned. - The block should NOT be freed by the user (not dynamically allocated). -******************************************************************************/ -int -DGifGetCode(GifFileType *GifFile, int *CodeSize, GifByteType **CodeBlock) -{ - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - *CodeSize = Private->BitsPerPixel; - - return DGifGetCodeNext(GifFile, CodeBlock); -} - -/****************************************************************************** - Continue to get the image code in compressed form. This routine should be - called until NULL block is returned. - The block should NOT be freed by the user (not dynamically allocated). -******************************************************************************/ -int -DGifGetCodeNext(GifFileType *GifFile, GifByteType **CodeBlock) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - /* coverity[tainted_data_argument] */ - if (READ(GifFile, &Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - - /* coverity[lower_bounds] */ - if (Buf > 0) { - *CodeBlock = Private->Buf; /* Use private unused buffer. */ - (*CodeBlock)[0] = Buf; /* Pascal strings notation (pos. 0 is len.). */ - /* coverity[tainted_data] */ - if (READ(GifFile, &((*CodeBlock)[1]), Buf) != Buf) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - } else { - *CodeBlock = NULL; - Private->Buf[0] = 0; /* Make sure the buffer is empty! */ - Private->PixelCount = 0; /* And local info. indicate image read. */ - } - - return GIF_OK; -} - -/****************************************************************************** - Setup the LZ decompression for this image: -******************************************************************************/ -static int -DGifSetupDecompress(GifFileType *GifFile) -{ - int i, BitsPerPixel; - GifByteType CodeSize; - GifPrefixType *Prefix; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (READ(GifFile, &CodeSize, 1) < 1) { /* Read Code size from file. */ - return GIF_ERROR; /* Failed to read Code size. */ - } - BitsPerPixel = CodeSize; - - Private->Buf[0] = 0; /* Input Buffer empty. */ - Private->BitsPerPixel = BitsPerPixel; - Private->ClearCode = (1 << BitsPerPixel); - Private->EOFCode = Private->ClearCode + 1; - Private->RunningCode = Private->EOFCode + 1; - Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ - Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */ - Private->StackPtr = 0; /* No pixels on the pixel stack. */ - Private->LastCode = NO_SUCH_CODE; - Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */ - Private->CrntShiftDWord = 0; - - Prefix = Private->Prefix; - for (i = 0; i <= LZ_MAX_CODE; i++) - Prefix[i] = NO_SUCH_CODE; - - return GIF_OK; -} - -/****************************************************************************** - The LZ decompression routine: - This version decompress the given GIF file into Line of length LineLen. - This routine can be called few times (one per scan line, for example), in - order the complete the whole image. -******************************************************************************/ -static int -DGifDecompressLine(GifFileType *GifFile, GifPixelType *Line, int LineLen) -{ - int i = 0; - int j, CrntCode, EOFCode, ClearCode, CrntPrefix, LastCode, StackPtr; - GifByteType *Stack, *Suffix; - GifPrefixType *Prefix; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - StackPtr = Private->StackPtr; - Prefix = Private->Prefix; - Suffix = Private->Suffix; - Stack = Private->Stack; - EOFCode = Private->EOFCode; - ClearCode = Private->ClearCode; - LastCode = Private->LastCode; - - if (StackPtr > LZ_MAX_CODE) { - return GIF_ERROR; - } - - if (StackPtr != 0) { - /* Let pop the stack off before continueing to read the GIF file: */ - while (StackPtr != 0 && i < LineLen) - Line[i++] = Stack[--StackPtr]; - } - - while (i < LineLen) { /* Decode LineLen items. */ - if (DGifDecompressInput(GifFile, &CrntCode) == GIF_ERROR) - return GIF_ERROR; - - if (CrntCode == EOFCode) { - /* Note however that usually we will not be here as we will stop - * decoding as soon as we got all the pixel, or EOF code will - * not be read at all, and DGifGetLine/Pixel clean everything. */ - GifFile->Error = D_GIF_ERR_EOF_TOO_SOON; - return GIF_ERROR; - } else if (CrntCode == ClearCode) { - /* We need to start over again: */ - for (j = 0; j <= LZ_MAX_CODE; j++) - Prefix[j] = NO_SUCH_CODE; - Private->RunningCode = Private->EOFCode + 1; - Private->RunningBits = Private->BitsPerPixel + 1; - Private->MaxCode1 = 1 << Private->RunningBits; - LastCode = Private->LastCode = NO_SUCH_CODE; - } else { - /* Its regular code - if in pixel range simply add it to output - * stream, otherwise trace to codes linked list until the prefix - * is in pixel range: */ - if (CrntCode < ClearCode) { - /* This is simple - its pixel scalar, so add it to output: */ - Line[i++] = CrntCode; - } else { - /* Its a code to needed to be traced: trace the linked list - * until the prefix is a pixel, while pushing the suffix - * pixels on our stack. If we done, pop the stack in reverse - * (thats what stack is good for!) order to output. */ - if (Prefix[CrntCode] == NO_SUCH_CODE) { - CrntPrefix = LastCode; - - /* Only allowed if CrntCode is exactly the running code: - * In that case CrntCode = XXXCode, CrntCode or the - * prefix code is last code and the suffix char is - * exactly the prefix of last code! */ - if (CrntCode == Private->RunningCode - 2) { - Suffix[Private->RunningCode - 2] = - Stack[StackPtr++] = DGifGetPrefixChar(Prefix, - LastCode, - ClearCode); - } else { - Suffix[Private->RunningCode - 2] = - Stack[StackPtr++] = DGifGetPrefixChar(Prefix, - CrntCode, - ClearCode); - } - } else - CrntPrefix = CrntCode; - - /* Now (if image is O.K.) we should not get a NO_SUCH_CODE - * during the trace. As we might loop forever, in case of - * defective image, we use StackPtr as loop counter and stop - * before overflowing Stack[]. */ - while (StackPtr < LZ_MAX_CODE && - CrntPrefix > ClearCode && CrntPrefix <= LZ_MAX_CODE) { - Stack[StackPtr++] = Suffix[CrntPrefix]; - CrntPrefix = Prefix[CrntPrefix]; - } - if (StackPtr >= LZ_MAX_CODE || CrntPrefix > LZ_MAX_CODE) { - GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; - return GIF_ERROR; - } - /* Push the last character on stack: */ - Stack[StackPtr++] = CrntPrefix; - - /* Now lets pop all the stack into output: */ - while (StackPtr != 0 && i < LineLen) - Line[i++] = Stack[--StackPtr]; - } - if (LastCode != NO_SUCH_CODE && Prefix[Private->RunningCode - 2] == NO_SUCH_CODE) { - Prefix[Private->RunningCode - 2] = LastCode; - - if (CrntCode == Private->RunningCode - 2) { - /* Only allowed if CrntCode is exactly the running code: - * In that case CrntCode = XXXCode, CrntCode or the - * prefix code is last code and the suffix char is - * exactly the prefix of last code! */ - Suffix[Private->RunningCode - 2] = - DGifGetPrefixChar(Prefix, LastCode, ClearCode); - } else { - Suffix[Private->RunningCode - 2] = - DGifGetPrefixChar(Prefix, CrntCode, ClearCode); - } - } - LastCode = CrntCode; - } - } - - Private->LastCode = LastCode; - Private->StackPtr = StackPtr; - - return GIF_OK; -} - -/****************************************************************************** - Routine to trace the Prefixes linked list until we get a prefix which is - not code, but a pixel value (less than ClearCode). Returns that pixel value. - If image is defective, we might loop here forever, so we limit the loops to - the maximum possible if image O.k. - LZ_MAX_CODE times. -******************************************************************************/ -static int -DGifGetPrefixChar(GifPrefixType *Prefix, int Code, int ClearCode) -{ - int i = 0; - - while (Code > ClearCode && i++ <= LZ_MAX_CODE) { - if (Code > LZ_MAX_CODE) { - return NO_SUCH_CODE; - } - Code = Prefix[Code]; - } - return Code; -} - -/****************************************************************************** - Interface for accessing the LZ codes directly. Set Code to the real code - (12bits), or to -1 if EOF code is returned. -******************************************************************************/ -int -DGifGetLZCodes(GifFileType *GifFile, int *Code) -{ - GifByteType *CodeBlock; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_READABLE(Private)) { - /* This file was NOT open for reading: */ - GifFile->Error = D_GIF_ERR_NOT_READABLE; - return GIF_ERROR; - } - - if (DGifDecompressInput(GifFile, Code) == GIF_ERROR) - return GIF_ERROR; - - if (*Code == Private->EOFCode) { - /* Skip rest of codes (hopefully only NULL terminating block): */ - do { - if (DGifGetCodeNext(GifFile, &CodeBlock) == GIF_ERROR) - return GIF_ERROR; - } while (CodeBlock != NULL) ; - - *Code = -1; - } else if (*Code == Private->ClearCode) { - /* We need to start over again: */ - Private->RunningCode = Private->EOFCode + 1; - Private->RunningBits = Private->BitsPerPixel + 1; - Private->MaxCode1 = 1 << Private->RunningBits; - } - - return GIF_OK; -} - -/****************************************************************************** - The LZ decompression input routine: - This routine is responsable for the decompression of the bit stream from - 8 bits (bytes) packets, into the real codes. - Returns GIF_OK if read successfully. -******************************************************************************/ -static int -DGifDecompressInput(GifFileType *GifFile, int *Code) -{ - static const unsigned short CodeMasks[] = { - 0x0000, 0x0001, 0x0003, 0x0007, - 0x000f, 0x001f, 0x003f, 0x007f, - 0x00ff, 0x01ff, 0x03ff, 0x07ff, - 0x0fff - }; - - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - GifByteType NextByte; - - /* The image can't contain more than LZ_BITS per code. */ - if (Private->RunningBits > LZ_BITS) { - GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; - return GIF_ERROR; - } - - while (Private->CrntShiftState < Private->RunningBits) { - /* Needs to get more bytes from input stream for next code: */ - if (DGifBufferedInput(GifFile, Private->Buf, &NextByte) == GIF_ERROR) { - return GIF_ERROR; - } - Private->CrntShiftDWord |= - ((unsigned long)NextByte) << Private->CrntShiftState; - Private->CrntShiftState += 8; - } - *Code = Private->CrntShiftDWord & CodeMasks[Private->RunningBits]; - - Private->CrntShiftDWord >>= Private->RunningBits; - Private->CrntShiftState -= Private->RunningBits; - - /* If code cannot fit into RunningBits bits, must raise its size. Note - * however that codes above 4095 are used for special signaling. - * If we're using LZ_BITS bits already and we're at the max code, just - * keep using the table as it is, don't increment Private->RunningCode. - */ - if (Private->RunningCode < LZ_MAX_CODE + 2 && - ++Private->RunningCode > Private->MaxCode1 && - Private->RunningBits < LZ_BITS) { - Private->MaxCode1 <<= 1; - Private->RunningBits++; - } - return GIF_OK; -} - -/****************************************************************************** - This routines read one GIF data block at a time and buffers it internally - so that the decompression routine could access it. - The routine returns the next byte from its internal buffer (or read next - block in if buffer empty) and returns GIF_OK if succesful. -******************************************************************************/ -static int -DGifBufferedInput(GifFileType *GifFile, GifByteType *Buf, GifByteType *NextByte) -{ - if (Buf[0] == 0) { - /* Needs to read the next buffer - this one is empty: */ - if (READ(GifFile, Buf, 1) != 1) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - /* There shouldn't be any empty data blocks here as the LZW spec - * says the LZW termination code should come first. Therefore we - * shouldn't be inside this routine at that point. - */ - if (Buf[0] == 0) { - GifFile->Error = D_GIF_ERR_IMAGE_DEFECT; - return GIF_ERROR; - } - if (READ(GifFile, &Buf[1], Buf[0]) != Buf[0]) { - GifFile->Error = D_GIF_ERR_READ_FAILED; - return GIF_ERROR; - } - *NextByte = Buf[1]; - Buf[1] = 2; /* We use now the second place as last char read! */ - Buf[0]--; - } else { - *NextByte = Buf[Buf[1]++]; - Buf[0]--; - } - - return GIF_OK; -} - -/****************************************************************************** - This routine reads an entire GIF into core, hanging all its state info off - the GifFileType pointer. Call DGifOpenFileName() or DGifOpenFileHandle() - first to initialize I/O. Its inverse is EGifSpew(). -*******************************************************************************/ -int -DGifSlurp(GifFileType *GifFile) -{ - size_t ImageSize; - GifRecordType RecordType; - SavedImage *sp; - GifByteType *ExtData; - int ExtFunction; - - GifFile->ExtensionBlocks = NULL; - GifFile->ExtensionBlockCount = 0; - - do { - if (DGifGetRecordType(GifFile, &RecordType) == GIF_ERROR) - return (GIF_ERROR); - - switch (RecordType) { - case IMAGE_DESC_RECORD_TYPE: - if (DGifGetImageDesc(GifFile) == GIF_ERROR) - return (GIF_ERROR); - - sp = &GifFile->SavedImages[GifFile->ImageCount - 1]; - /* Allocate memory for the image */ - if (sp->ImageDesc.Width < 0 && sp->ImageDesc.Height < 0 && - sp->ImageDesc.Width > (INT_MAX / sp->ImageDesc.Height)) { - return GIF_ERROR; - } - ImageSize = sp->ImageDesc.Width * sp->ImageDesc.Height; - - if (ImageSize > (SIZE_MAX / sizeof(GifPixelType))) { - return GIF_ERROR; - } - sp->RasterBits = (unsigned char *)malloc(ImageSize * - sizeof(GifPixelType)); - - if (sp->RasterBits == NULL) { - return GIF_ERROR; - } - - if (sp->ImageDesc.Interlace) { - int i, j; - /* - * The way an interlaced image should be read - - * offsets and jumps... - */ - int InterlacedOffset[] = { 0, 4, 2, 1 }; - int InterlacedJumps[] = { 8, 8, 4, 2 }; - /* Need to perform 4 passes on the image */ - for (i = 0; i < 4; i++) - for (j = InterlacedOffset[i]; - j < sp->ImageDesc.Height; - j += InterlacedJumps[i]) { - if (DGifGetLine(GifFile, - sp->RasterBits+j*sp->ImageDesc.Width, - sp->ImageDesc.Width) == GIF_ERROR) - return GIF_ERROR; - } - } - else { - if (DGifGetLine(GifFile,sp->RasterBits,ImageSize)==GIF_ERROR) - return (GIF_ERROR); - } - - if (GifFile->ExtensionBlocks) { - sp->ExtensionBlocks = GifFile->ExtensionBlocks; - sp->ExtensionBlockCount = GifFile->ExtensionBlockCount; - - GifFile->ExtensionBlocks = NULL; - GifFile->ExtensionBlockCount = 0; - } - break; - - case EXTENSION_RECORD_TYPE: - if (DGifGetExtension(GifFile,&ExtFunction,&ExtData) == GIF_ERROR) - return (GIF_ERROR); - /* Create an extension block with our data */ - if (ExtData != NULL) { - if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount, - &GifFile->ExtensionBlocks, - ExtFunction, ExtData[0], &ExtData[1]) - == GIF_ERROR) - return (GIF_ERROR); - } - while (ExtData != NULL) { - if (DGifGetExtensionNext(GifFile, &ExtData) == GIF_ERROR) - return (GIF_ERROR); - /* Continue the extension block */ - if (ExtData != NULL) - if (GifAddExtensionBlock(&GifFile->ExtensionBlockCount, - &GifFile->ExtensionBlocks, - CONTINUE_EXT_FUNC_CODE, - ExtData[0], &ExtData[1]) == GIF_ERROR) - return (GIF_ERROR); - } - break; - - case TERMINATE_RECORD_TYPE: - break; - - default: /* Should be trapped by DGifGetRecordType */ - break; - } - } while (RecordType != TERMINATE_RECORD_TYPE); - - return (GIF_OK); -} - -/* end */ diff --git a/third_party/giflib/lib/egif_lib.c b/third_party/giflib/lib/egif_lib.c deleted file mode 100644 index 6b6fa6598..000000000 --- a/third_party/giflib/lib/egif_lib.c +++ /dev/null @@ -1,1157 +0,0 @@ -/****************************************************************************** - -egif_lib.c - GIF encoding - -The functions here and in dgif_lib.c are partitioned carefully so that -if you only require one of read and write capability, only one of these -two modules will be linked. Preserve this property! - -*****************************************************************************/ - -#include -#include -#include -#include -#include - -#ifdef _WIN32 - #include - #define posix_open _open - #define posix_close _close - #define posix_fdopen _fdopen -#else - #include - #include - #define posix_open open - #define posix_close close - #define posix_fdopen fdopen -#endif -#include - -#include "gif_lib.h" -#include "gif_lib_private.h" - -/* Masks given codes to BitsPerPixel, to make sure all codes are in range: */ -/*@+charint@*/ -static const GifPixelType CodeMask[] = { - 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff -}; -/*@-charint@*/ - -static int EGifPutWord(int Word, GifFileType * GifFile); -static int EGifSetupCompress(GifFileType * GifFile); -static int EGifCompressLine(GifFileType * GifFile, GifPixelType * Line, - const int LineLen); -static int EGifCompressOutput(GifFileType * GifFile, const int Code); -static int EGifBufferedOutput(GifFileType * GifFile, GifByteType * Buf, - int c); - -/* extract bytes from an unsigned word */ -#define LOBYTE(x) ((x) & 0xff) -#define HIBYTE(x) (((x) >> 8) & 0xff) - -/****************************************************************************** - Open a new GIF file for write, specified by name. If TestExistance then - if the file exists this routines fails (returns NULL). - Returns a dynamically allocated GifFileType pointer which serves as the GIF - info record. The Error member is cleared if successful. -******************************************************************************/ -GifFileType * -EGifOpenFileName(const char *FileName, const GifBool TestExistence, int *Error) -{ - - int FileHandle; - GifFileType *GifFile; - - if (TestExistence) - FileHandle = posix_open(FileName, O_WRONLY | O_CREAT | O_EXCL, - S_IREAD | S_IWRITE); - else - FileHandle = posix_open(FileName, O_WRONLY | O_CREAT | O_TRUNC, - S_IREAD | S_IWRITE); - - if (FileHandle == -1) { - if (Error != NULL) - *Error = E_GIF_ERR_OPEN_FAILED; - return NULL; - } - GifFile = EGifOpenFileHandle(FileHandle, Error); - if (GifFile == (GifFileType *) NULL) - (void)posix_close(FileHandle); - return GifFile; -} - -/****************************************************************************** - Update a new GIF file, given its file handle, which must be opened for - write in binary mode. - Returns dynamically allocated a GifFileType pointer which serves as the GIF - info record. - Only fails on a memory allocation error. -******************************************************************************/ -GifFileType * -EGifOpenFileHandle(const int FileHandle, int *Error) -{ - GifFileType *GifFile; - GifFilePrivateType *Private; - FILE *f; - - GifFile = (GifFileType *) malloc(sizeof(GifFileType)); - if (GifFile == NULL) { - return NULL; - } - - memset(GifFile, '\0', sizeof(GifFileType)); - - Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); - if (Private == NULL) { - free(GifFile); - if (Error != NULL) - *Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - if ((Private->HashTable = _InitHashTable()) == NULL) { - free(GifFile); - free(Private); - if (Error != NULL) - *Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - -#ifdef _WIN32 - _setmode(FileHandle, O_BINARY); /* Make sure it is in binary mode. */ -#endif /* _WIN32 */ - - f = posix_fdopen(FileHandle, "wb"); /* Make it into a stream: */ - - GifFile->Private = (void *)Private; - Private->FileHandle = FileHandle; - Private->File = f; - Private->FileState = FILE_STATE_WRITE; - - Private->Write = (OutputFunc) 0; /* No user write routine (MRB) */ - GifFile->UserData = (void *)NULL; /* No user write handle (MRB) */ - - GifFile->Error = 0; - - return GifFile; -} - -/****************************************************************************** - Output constructor that takes user supplied output function. - Basically just a copy of EGifOpenFileHandle. (MRB) -******************************************************************************/ -GifFileType * -EGifOpen(void *userData, OutputFunc writeFunc, int *Error) -{ - GifFileType *GifFile; - GifFilePrivateType *Private; - - GifFile = (GifFileType *)malloc(sizeof(GifFileType)); - if (GifFile == NULL) { - if (Error != NULL) - *Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - - memset(GifFile, '\0', sizeof(GifFileType)); - - Private = (GifFilePrivateType *)malloc(sizeof(GifFilePrivateType)); - if (Private == NULL) { - free(GifFile); - if (Error != NULL) - *Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - - Private->HashTable = _InitHashTable(); - if (Private->HashTable == NULL) { - free (GifFile); - free (Private); - if (Error != NULL) - *Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return NULL; - } - - GifFile->Private = (void *)Private; - Private->FileHandle = 0; - Private->File = (FILE *) 0; - Private->FileState = FILE_STATE_WRITE; - - Private->Write = writeFunc; /* User write routine (MRB) */ - GifFile->UserData = userData; /* User write handle (MRB) */ - - Private->gif89 = false; /* initially, write GIF87 */ - - GifFile->Error = 0; - - return GifFile; -} - -/****************************************************************************** - Routine to compute the GIF version that will be written on output. -******************************************************************************/ -const char * -EGifGetGifVersion(GifFileType *GifFile) -{ - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - int i, j; - - /* - * Bulletproofing - always write GIF89 if we need to. - * Note, we don't clear the gif89 flag here because - * users of the sequential API might have called EGifSetGifVersion() - * in order to set that flag. - */ - for (i = 0; i < GifFile->ImageCount; i++) { - for (j = 0; j < GifFile->SavedImages[i].ExtensionBlockCount; j++) { - int function = - GifFile->SavedImages[i].ExtensionBlocks[j].Function; - - if (function == COMMENT_EXT_FUNC_CODE - || function == GRAPHICS_EXT_FUNC_CODE - || function == PLAINTEXT_EXT_FUNC_CODE - || function == APPLICATION_EXT_FUNC_CODE) - Private->gif89 = true; - } - } - for (i = 0; i < GifFile->ExtensionBlockCount; i++) { - int function = GifFile->ExtensionBlocks[i].Function; - - if (function == COMMENT_EXT_FUNC_CODE - || function == GRAPHICS_EXT_FUNC_CODE - || function == PLAINTEXT_EXT_FUNC_CODE - || function == APPLICATION_EXT_FUNC_CODE) - Private->gif89 = true; - } - - if (Private->gif89) - return GIF89_STAMP; - else - return GIF87_STAMP; -} - -/****************************************************************************** - Set the GIF version. In the extremely unlikely event that there is ever - another version, replace the bool argument with an enum in which the - GIF87 value is 0 (numerically the same as bool false) and the GIF89 value - is 1 (numerically the same as bool true). That way we'll even preserve - object-file compatibility! -******************************************************************************/ -void EGifSetGifVersion(GifFileType *GifFile, const GifBool gif89) -{ - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - Private->gif89 = gif89; -} - -/****************************************************************************** - All writes to the GIF should go through this. -******************************************************************************/ -static int InternalWrite(GifFileType *GifFileOut, - const unsigned char *buf, size_t len) -{ - GifFilePrivateType *Private = (GifFilePrivateType*)GifFileOut->Private; - if (Private->Write) - return Private->Write(GifFileOut,buf,len); - else - return fwrite(buf, 1, len, Private->File); -} - -/****************************************************************************** - This routine should be called before any other EGif calls, immediately - following the GIF file opening. -******************************************************************************/ -int -EGifPutScreenDesc(GifFileType *GifFile, - const int Width, - const int Height, - const int ColorRes, - const int BackGround, - const ColorMapObject *ColorMap) -{ - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - const char *write_version; - - if (Private->FileState & FILE_STATE_SCREEN) { - /* If already has screen descriptor - something is wrong! */ - GifFile->Error = E_GIF_ERR_HAS_SCRN_DSCR; - return GIF_ERROR; - } - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - write_version = EGifGetGifVersion(GifFile); - - /* First write the version prefix into the file. */ - if (InternalWrite(GifFile, (unsigned char *)write_version, - strlen(write_version)) != strlen(write_version)) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - - GifFile->SWidth = Width; - GifFile->SHeight = Height; - GifFile->SColorResolution = ColorRes; - GifFile->SBackGroundColor = BackGround; - if (ColorMap) { - GifFile->SColorMap = GifMakeMapObject(ColorMap->ColorCount, - ColorMap->Colors); - if (GifFile->SColorMap == NULL) { - GifFile->Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - } else - GifFile->SColorMap = NULL; - - /* - * Put the logical screen descriptor into the file: - */ - /* Logical Screen Descriptor: Dimensions */ - (void)EGifPutWord(Width, GifFile); - (void)EGifPutWord(Height, GifFile); - - /* Logical Screen Descriptor: Packed Fields */ - /* Note: We have actual size of the color table default to the largest - * possible size (7+1 == 8 bits) because the decoder can use it to decide - * how to display the files. - */ - Buf[0] = (ColorMap ? 0x80 : 0x00) | /* Yes/no global colormap */ - ((ColorRes - 1) << 4) | /* Bits allocated to each primary color */ - (ColorMap ? ColorMap->BitsPerPixel - 1 : 0x07 ); /* Actual size of the - color table. */ - if (ColorMap != NULL && ColorMap->SortFlag) - Buf[0] |= 0x08; - Buf[1] = BackGround; /* Index into the ColorTable for background color */ - Buf[2] = GifFile->AspectByte; /* Pixel Aspect Ratio */ - InternalWrite(GifFile, Buf, 3); - - /* If we have Global color map - dump it also: */ - if (ColorMap != NULL) { - int i; - for (i = 0; i < ColorMap->ColorCount; i++) { - /* Put the ColorMap out also: */ - Buf[0] = ColorMap->Colors[i].Red; - Buf[1] = ColorMap->Colors[i].Green; - Buf[2] = ColorMap->Colors[i].Blue; - if (InternalWrite(GifFile, Buf, 3) != 3) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - } - } - - /* Mark this file as has screen descriptor, and no pixel written yet: */ - Private->FileState |= FILE_STATE_SCREEN; - - return GIF_OK; -} - -/****************************************************************************** - This routine should be called before any attempt to dump an image - any - call to any of the pixel dump routines. -******************************************************************************/ -int -EGifPutImageDesc(GifFileType *GifFile, - const int Left, - const int Top, - const int Width, - const int Height, - const GifBool Interlace, - const ColorMapObject *ColorMap) -{ - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (Private->FileState & FILE_STATE_IMAGE && - Private->PixelCount > 0xffff0000UL) { - /* If already has active image descriptor - something is wrong! */ - GifFile->Error = E_GIF_ERR_HAS_IMAG_DSCR; - return GIF_ERROR; - } - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - GifFile->Image.Left = Left; - GifFile->Image.Top = Top; - GifFile->Image.Width = Width; - GifFile->Image.Height = Height; - GifFile->Image.Interlace = Interlace; - if (ColorMap) { - if (GifFile->Image.ColorMap != NULL) { - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Image.ColorMap = NULL; - } - GifFile->Image.ColorMap = GifMakeMapObject(ColorMap->ColorCount, - ColorMap->Colors); - if (GifFile->Image.ColorMap == NULL) { - GifFile->Error = E_GIF_ERR_NOT_ENOUGH_MEM; - return GIF_ERROR; - } - } else { - GifFile->Image.ColorMap = NULL; - } - - /* Put the image descriptor into the file: */ - Buf[0] = DESCRIPTOR_INTRODUCER; /* Image separator character. */ - InternalWrite(GifFile, Buf, 1); - (void)EGifPutWord(Left, GifFile); - (void)EGifPutWord(Top, GifFile); - (void)EGifPutWord(Width, GifFile); - (void)EGifPutWord(Height, GifFile); - Buf[0] = (ColorMap ? 0x80 : 0x00) | - (Interlace ? 0x40 : 0x00) | - (ColorMap ? ColorMap->BitsPerPixel - 1 : 0); - InternalWrite(GifFile, Buf, 1); - - /* If we have Global color map - dump it also: */ - if (ColorMap != NULL) { - int i; - for (i = 0; i < ColorMap->ColorCount; i++) { - /* Put the ColorMap out also: */ - Buf[0] = ColorMap->Colors[i].Red; - Buf[1] = ColorMap->Colors[i].Green; - Buf[2] = ColorMap->Colors[i].Blue; - if (InternalWrite(GifFile, Buf, 3) != 3) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - } - } - if (GifFile->SColorMap == NULL && GifFile->Image.ColorMap == NULL) { - GifFile->Error = E_GIF_ERR_NO_COLOR_MAP; - return GIF_ERROR; - } - - /* Mark this file as has screen descriptor: */ - Private->FileState |= FILE_STATE_IMAGE; - Private->PixelCount = (long)Width *(long)Height; - - /* Reset compress algorithm parameters. */ - (void)EGifSetupCompress(GifFile); - - return GIF_OK; -} - -/****************************************************************************** - Put one full scanned line (Line) of length LineLen into GIF file. -******************************************************************************/ -int -EGifPutLine(GifFileType * GifFile, GifPixelType *Line, int LineLen) -{ - int i; - GifPixelType Mask; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - if (!LineLen) - LineLen = GifFile->Image.Width; - if (Private->PixelCount < (unsigned)LineLen) { - GifFile->Error = E_GIF_ERR_DATA_TOO_BIG; - return GIF_ERROR; - } - Private->PixelCount -= LineLen; - - /* Make sure the codes are not out of bit range, as we might generate - * wrong code (because of overflow when we combine them) in this case: */ - Mask = CodeMask[Private->BitsPerPixel]; - for (i = 0; i < LineLen; i++) - Line[i] &= Mask; - - return EGifCompressLine(GifFile, Line, LineLen); -} - -/****************************************************************************** - Put one pixel (Pixel) into GIF file. -******************************************************************************/ -int -EGifPutPixel(GifFileType *GifFile, const GifPixelType _Pixel) -{ - GifPixelType Pixel = _Pixel; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - if (Private->PixelCount == 0) { - GifFile->Error = E_GIF_ERR_DATA_TOO_BIG; - return GIF_ERROR; - } - --Private->PixelCount; - - /* Make sure the code is not out of bit range, as we might generate - * wrong code (because of overflow when we combine them) in this case: */ - Pixel &= CodeMask[Private->BitsPerPixel]; - - return EGifCompressLine(GifFile, &Pixel, 1); -} - -/****************************************************************************** - Put a comment into GIF file using the GIF89 comment extension block. -******************************************************************************/ -int -EGifPutComment(GifFileType *GifFile, const char *Comment) -{ - unsigned int length; - char *buf; - - length = strlen(Comment); - if (length <= 255) { - return EGifPutExtension(GifFile, COMMENT_EXT_FUNC_CODE, - length, Comment); - } else { - buf = (char *)Comment; - if (EGifPutExtensionLeader(GifFile, COMMENT_EXT_FUNC_CODE) - == GIF_ERROR) { - return GIF_ERROR; - } - - /* Break the comment into 255 byte sub blocks */ - while (length > 255) { - if (EGifPutExtensionBlock(GifFile, 255, buf) == GIF_ERROR) { - return GIF_ERROR; - } - buf = buf + 255; - length -= 255; - } - /* Output any partial block and the clear code. */ - if (length > 0) { - if (EGifPutExtensionBlock(GifFile, length, buf) == GIF_ERROR) { - return GIF_ERROR; - } - } - if (EGifPutExtensionTrailer(GifFile) == GIF_ERROR) { - return GIF_ERROR; - } - } - return GIF_OK; -} - -/****************************************************************************** - Begin an extension block (see GIF manual). More - extensions can be dumped using EGifPutExtensionBlock until - EGifPutExtensionTrailer is invoked. -******************************************************************************/ -int -EGifPutExtensionLeader(GifFileType *GifFile, const int ExtCode) -{ - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - Buf[0] = EXTENSION_INTRODUCER; - Buf[1] = ExtCode; - InternalWrite(GifFile, Buf, 2); - - return GIF_OK; -} - -/****************************************************************************** - Put extension block data (see GIF manual) into a GIF file. -******************************************************************************/ -int -EGifPutExtensionBlock(GifFileType *GifFile, - const int ExtLen, - const void *Extension) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - Buf = ExtLen; - InternalWrite(GifFile, &Buf, 1); - InternalWrite(GifFile, Extension, ExtLen); - - return GIF_OK; -} - -/****************************************************************************** - Put a terminating block (see GIF manual) into a GIF file. -******************************************************************************/ -int -EGifPutExtensionTrailer(GifFileType *GifFile) { - - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - /* Write the block terminator */ - Buf = 0; - InternalWrite(GifFile, &Buf, 1); - - return GIF_OK; -} - -/****************************************************************************** - Put an extension block (see GIF manual) into a GIF file. - Warning: This function is only useful for Extension blocks that have at - most one subblock. Extensions with more than one subblock need to use the - EGifPutExtension{Leader,Block,Trailer} functions instead. -******************************************************************************/ -int -EGifPutExtension(GifFileType *GifFile, - const int ExtCode, - const int ExtLen, - const void *Extension) { - - GifByteType Buf[3]; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - if (ExtCode == 0) - InternalWrite(GifFile, (GifByteType *)&ExtLen, 1); - else { - Buf[0] = EXTENSION_INTRODUCER; - Buf[1] = ExtCode; /* Extension Label */ - Buf[2] = ExtLen; /* Extension length */ - InternalWrite(GifFile, Buf, 3); - } - InternalWrite(GifFile, Extension, ExtLen); - Buf[0] = 0; - InternalWrite(GifFile, Buf, 1); - - return GIF_OK; -} - -/****************************************************************************** - Render a Graphics Control Block as raw extension data -******************************************************************************/ - -size_t EGifGCBToExtension(const GraphicsControlBlock *GCB, - GifByteType *GifExtension) -{ - GifExtension[0] = 0; - GifExtension[0] |= (GCB->TransparentColor == NO_TRANSPARENT_COLOR) ? 0x00 : 0x01; - GifExtension[0] |= GCB->UserInputFlag ? 0x02 : 0x00; - GifExtension[0] |= ((GCB->DisposalMode & 0x07) << 2); - GifExtension[1] = LOBYTE(GCB->DelayTime); - GifExtension[2] = HIBYTE(GCB->DelayTime); - GifExtension[3] = (char)GCB->TransparentColor; - return 4; -} - -/****************************************************************************** - Replace the Graphics Control Block for a saved image, if it exists. -******************************************************************************/ - -int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB, - GifFileType *GifFile, int ImageIndex) -{ - int i; - size_t Len; - GifByteType buf[sizeof(GraphicsControlBlock)]; /* a bit dodgy... */ - - if (ImageIndex < 0 || ImageIndex > GifFile->ImageCount - 1) - return GIF_ERROR; - - for (i = 0; i < GifFile->SavedImages[ImageIndex].ExtensionBlockCount; i++) { - ExtensionBlock *ep = &GifFile->SavedImages[ImageIndex].ExtensionBlocks[i]; - if (ep->Function == GRAPHICS_EXT_FUNC_CODE) { - EGifGCBToExtension(GCB, ep->Bytes); - return GIF_OK; - } - } - - Len = EGifGCBToExtension(GCB, (GifByteType *)buf); - if (GifAddExtensionBlock(&GifFile->SavedImages[ImageIndex].ExtensionBlockCount, - &GifFile->SavedImages[ImageIndex].ExtensionBlocks, - GRAPHICS_EXT_FUNC_CODE, - Len, - (unsigned char *)buf) == GIF_ERROR) - return (GIF_ERROR); - - return (GIF_OK); -} - -/****************************************************************************** - Put the image code in compressed form. This routine can be called if the - information needed to be piped out as is. Obviously this is much faster - than decoding and encoding again. This routine should be followed by calls - to EGifPutCodeNext, until NULL block is given. - The block should NOT be freed by the user (not dynamically allocated). -******************************************************************************/ -int -EGifPutCode(GifFileType *GifFile, int CodeSize, const GifByteType *CodeBlock) -{ - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - GifFile->Error = E_GIF_ERR_NOT_WRITEABLE; - return GIF_ERROR; - } - - /* No need to dump code size as Compression set up does any for us: */ - /* - * Buf = CodeSize; - * if (InternalWrite(GifFile, &Buf, 1) != 1) { - * GifFile->Error = E_GIF_ERR_WRITE_FAILED; - * return GIF_ERROR; - * } - */ - - return EGifPutCodeNext(GifFile, CodeBlock); -} - -/****************************************************************************** - Continue to put the image code in compressed form. This routine should be - called with blocks of code as read via DGifGetCode/DGifGetCodeNext. If - given buffer pointer is NULL, empty block is written to mark end of code. -******************************************************************************/ -int -EGifPutCodeNext(GifFileType *GifFile, const GifByteType *CodeBlock) -{ - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *)GifFile->Private; - - if (CodeBlock != NULL) { - if (InternalWrite(GifFile, CodeBlock, CodeBlock[0] + 1) - != (unsigned)(CodeBlock[0] + 1)) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - } else { - Buf = 0; - if (InternalWrite(GifFile, &Buf, 1) != 1) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - Private->PixelCount = 0; /* And local info. indicate image read. */ - } - - return GIF_OK; -} - -/****************************************************************************** - This routine should be called last, to close the GIF file. -******************************************************************************/ -int -EGifCloseFile(GifFileType *GifFile, int *ErrorCode) -{ - GifByteType Buf; - GifFilePrivateType *Private; - FILE *File; - - if (GifFile == NULL) - return GIF_ERROR; - - Private = (GifFilePrivateType *) GifFile->Private; - if (Private == NULL) - return GIF_ERROR; - if (!IS_WRITEABLE(Private)) { - /* This file was NOT open for writing: */ - if (ErrorCode != NULL) - *ErrorCode = E_GIF_ERR_NOT_WRITEABLE; - free(GifFile); - return GIF_ERROR; - } - - File = Private->File; - - Buf = TERMINATOR_INTRODUCER; - InternalWrite(GifFile, &Buf, 1); - - if (GifFile->Image.ColorMap) { - GifFreeMapObject(GifFile->Image.ColorMap); - GifFile->Image.ColorMap = NULL; - } - if (GifFile->SColorMap) { - GifFreeMapObject(GifFile->SColorMap); - GifFile->SColorMap = NULL; - } - if (Private) { - if (Private->HashTable) { - free((char *) Private->HashTable); - } - free((char *) Private); - } - - if (File && fclose(File) != 0) { - if (ErrorCode != NULL) - *ErrorCode = E_GIF_ERR_CLOSE_FAILED; - free(GifFile); - return GIF_ERROR; - } - - free(GifFile); - if (ErrorCode != NULL) - *ErrorCode = E_GIF_SUCCEEDED; - return GIF_OK; -} - -/****************************************************************************** - Put 2 bytes (a word) into the given file in little-endian order: -******************************************************************************/ -static int -EGifPutWord(int Word, GifFileType *GifFile) -{ - unsigned char c[2]; - - c[0] = LOBYTE(Word); - c[1] = HIBYTE(Word); - if (InternalWrite(GifFile, c, 2) == 2) - return GIF_OK; - else - return GIF_ERROR; -} - -/****************************************************************************** - Setup the LZ compression for this image: -******************************************************************************/ -static int -EGifSetupCompress(GifFileType *GifFile) -{ - int BitsPerPixel; - GifByteType Buf; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - /* Test and see what color map to use, and from it # bits per pixel: */ - if (GifFile->Image.ColorMap) - BitsPerPixel = GifFile->Image.ColorMap->BitsPerPixel; - else if (GifFile->SColorMap) - BitsPerPixel = GifFile->SColorMap->BitsPerPixel; - else { - GifFile->Error = E_GIF_ERR_NO_COLOR_MAP; - return GIF_ERROR; - } - - Buf = BitsPerPixel = (BitsPerPixel < 2 ? 2 : BitsPerPixel); - InternalWrite(GifFile, &Buf, 1); /* Write the Code size to file. */ - - Private->Buf[0] = 0; /* Nothing was output yet. */ - Private->BitsPerPixel = BitsPerPixel; - Private->ClearCode = (1 << BitsPerPixel); - Private->EOFCode = Private->ClearCode + 1; - Private->RunningCode = Private->EOFCode + 1; - Private->RunningBits = BitsPerPixel + 1; /* Number of bits per code. */ - Private->MaxCode1 = 1 << Private->RunningBits; /* Max. code + 1. */ - Private->CrntCode = FIRST_CODE; /* Signal that this is first one! */ - Private->CrntShiftState = 0; /* No information in CrntShiftDWord. */ - Private->CrntShiftDWord = 0; - - /* Clear hash table and send Clear to make sure the decoder do the same. */ - _ClearHashTable(Private->HashTable); - - if (EGifCompressOutput(GifFile, Private->ClearCode) == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - return GIF_OK; -} - -/****************************************************************************** - The LZ compression routine: - This version compresses the given buffer Line of length LineLen. - This routine can be called a few times (one per scan line, for example), in - order to complete the whole image. -******************************************************************************/ -static int -EGifCompressLine(GifFileType *GifFile, - GifPixelType *Line, - const int LineLen) -{ - int i = 0, CrntCode, NewCode; - unsigned long NewKey; - GifPixelType Pixel; - GifHashTableType *HashTable; - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - - HashTable = Private->HashTable; - - if (Private->CrntCode == FIRST_CODE) /* Its first time! */ - CrntCode = Line[i++]; - else - CrntCode = Private->CrntCode; /* Get last code in compression. */ - - while (i < LineLen) { /* Decode LineLen items. */ - Pixel = Line[i++]; /* Get next pixel from stream. */ - /* Form a new unique key to search hash table for the code combines - * CrntCode as Prefix string with Pixel as postfix char. - */ - NewKey = (((uint32_t) CrntCode) << 8) + Pixel; - if ((NewCode = _ExistsHashTable(HashTable, NewKey)) >= 0) { - /* This Key is already there, or the string is old one, so - * simple take new code as our CrntCode: - */ - CrntCode = NewCode; - } else { - /* Put it in hash table, output the prefix code, and make our - * CrntCode equal to Pixel. - */ - if (EGifCompressOutput(GifFile, CrntCode) == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - CrntCode = Pixel; - - /* If however the HashTable if full, we send a clear first and - * Clear the hash table. - */ - if (Private->RunningCode >= LZ_MAX_CODE) { - /* Time to do some clearance: */ - if (EGifCompressOutput(GifFile, Private->ClearCode) - == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - Private->RunningCode = Private->EOFCode + 1; - Private->RunningBits = Private->BitsPerPixel + 1; - Private->MaxCode1 = 1 << Private->RunningBits; - _ClearHashTable(HashTable); - } else { - /* Put this unique key with its relative Code in hash table: */ - _InsertHashTable(HashTable, NewKey, Private->RunningCode++); - } - } - - } - - /* Preserve the current state of the compression algorithm: */ - Private->CrntCode = CrntCode; - - if (Private->PixelCount == 0) { - /* We are done - output last Code and flush output buffers: */ - if (EGifCompressOutput(GifFile, CrntCode) == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - if (EGifCompressOutput(GifFile, Private->EOFCode) == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - if (EGifCompressOutput(GifFile, FLUSH_OUTPUT) == GIF_ERROR) { - GifFile->Error = E_GIF_ERR_DISK_IS_FULL; - return GIF_ERROR; - } - } - - return GIF_OK; -} - -/****************************************************************************** - The LZ compression output routine: - This routine is responsible for the compression of the bit stream into - 8 bits (bytes) packets. - Returns GIF_OK if written successfully. -******************************************************************************/ -static int -EGifCompressOutput(GifFileType *GifFile, - const int Code) -{ - GifFilePrivateType *Private = (GifFilePrivateType *) GifFile->Private; - int retval = GIF_OK; - - if (Code == FLUSH_OUTPUT) { - while (Private->CrntShiftState > 0) { - /* Get Rid of what is left in DWord, and flush it. */ - if (EGifBufferedOutput(GifFile, Private->Buf, - Private->CrntShiftDWord & 0xff) == GIF_ERROR) - retval = GIF_ERROR; - Private->CrntShiftDWord >>= 8; - Private->CrntShiftState -= 8; - } - Private->CrntShiftState = 0; /* For next time. */ - if (EGifBufferedOutput(GifFile, Private->Buf, - FLUSH_OUTPUT) == GIF_ERROR) - retval = GIF_ERROR; - } else { - Private->CrntShiftDWord |= ((long)Code) << Private->CrntShiftState; - Private->CrntShiftState += Private->RunningBits; - while (Private->CrntShiftState >= 8) { - /* Dump out full bytes: */ - if (EGifBufferedOutput(GifFile, Private->Buf, - Private->CrntShiftDWord & 0xff) == GIF_ERROR) - retval = GIF_ERROR; - Private->CrntShiftDWord >>= 8; - Private->CrntShiftState -= 8; - } - } - - /* If code cannt fit into RunningBits bits, must raise its size. Note */ - /* however that codes above 4095 are used for special signaling. */ - if (Private->RunningCode >= Private->MaxCode1 && Code <= 4095) { - Private->MaxCode1 = 1 << ++Private->RunningBits; - } - - return retval; -} - -/****************************************************************************** - This routines buffers the given characters until 255 characters are ready - to be output. If Code is equal to -1 the buffer is flushed (EOF). - The buffer is Dumped with first byte as its size, as GIF format requires. - Returns GIF_OK if written successfully. -******************************************************************************/ -static int -EGifBufferedOutput(GifFileType *GifFile, - GifByteType *Buf, - int c) -{ - if (c == FLUSH_OUTPUT) { - /* Flush everything out. */ - if (Buf[0] != 0 - && InternalWrite(GifFile, Buf, Buf[0] + 1) != (unsigned)(Buf[0] + 1)) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - /* Mark end of compressed data, by an empty block (see GIF doc): */ - Buf[0] = 0; - if (InternalWrite(GifFile, Buf, 1) != 1) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - } else { - if (Buf[0] == 255) { - /* Dump out this buffer - it is full: */ - if (InternalWrite(GifFile, Buf, Buf[0] + 1) != (unsigned)(Buf[0] + 1)) { - GifFile->Error = E_GIF_ERR_WRITE_FAILED; - return GIF_ERROR; - } - Buf[0] = 0; - } - Buf[++Buf[0]] = c; - } - - return GIF_OK; -} - -/****************************************************************************** - This routine writes to disk an in-core representation of a GIF previously - created by DGifSlurp(). -******************************************************************************/ - -static int -EGifWriteExtensions(GifFileType *GifFileOut, - ExtensionBlock *ExtensionBlocks, - int ExtensionBlockCount) -{ - if (ExtensionBlocks) { - ExtensionBlock *ep; - int j; - - for (j = 0; j < ExtensionBlockCount; j++) { - ep = &ExtensionBlocks[j]; - if (ep->Function != CONTINUE_EXT_FUNC_CODE) - if (EGifPutExtensionLeader(GifFileOut, ep->Function) == GIF_ERROR) - return (GIF_ERROR); - if (EGifPutExtensionBlock(GifFileOut, ep->ByteCount, ep->Bytes) == GIF_ERROR) - return (GIF_ERROR); - if (j == ExtensionBlockCount - 1 || (ep+1)->Function != CONTINUE_EXT_FUNC_CODE) - if (EGifPutExtensionTrailer(GifFileOut) == GIF_ERROR) - return (GIF_ERROR); - } - } - - return (GIF_OK); -} - -int -EGifSpew(GifFileType *GifFileOut) -{ - int i, j; - - if (EGifPutScreenDesc(GifFileOut, - GifFileOut->SWidth, - GifFileOut->SHeight, - GifFileOut->SColorResolution, - GifFileOut->SBackGroundColor, - GifFileOut->SColorMap) == GIF_ERROR) { - return (GIF_ERROR); - } - - for (i = 0; i < GifFileOut->ImageCount; i++) { - SavedImage *sp = &GifFileOut->SavedImages[i]; - int SavedHeight = sp->ImageDesc.Height; - int SavedWidth = sp->ImageDesc.Width; - - /* this allows us to delete images by nuking their rasters */ - if (sp->RasterBits == NULL) - continue; - - if (EGifWriteExtensions(GifFileOut, - sp->ExtensionBlocks, - sp->ExtensionBlockCount) == GIF_ERROR) - return (GIF_ERROR); - - if (EGifPutImageDesc(GifFileOut, - sp->ImageDesc.Left, - sp->ImageDesc.Top, - SavedWidth, - SavedHeight, - sp->ImageDesc.Interlace, - sp->ImageDesc.ColorMap) == GIF_ERROR) - return (GIF_ERROR); - - if (sp->ImageDesc.Interlace) { - /* - * The way an interlaced image should be written - - * offsets and jumps... - */ - int InterlacedOffset[] = { 0, 4, 2, 1 }; - int InterlacedJumps[] = { 8, 8, 4, 2 }; - int k; - /* Need to perform 4 passes on the images: */ - for (k = 0; k < 4; k++) - for (j = InterlacedOffset[k]; - j < SavedHeight; - j += InterlacedJumps[k]) { - if (EGifPutLine(GifFileOut, - sp->RasterBits + j * SavedWidth, - SavedWidth) == GIF_ERROR) - return (GIF_ERROR); - } - } else { - for (j = 0; j < SavedHeight; j++) { - if (EGifPutLine(GifFileOut, - sp->RasterBits + j * SavedWidth, - SavedWidth) == GIF_ERROR) - return (GIF_ERROR); - } - } - } - - if (EGifWriteExtensions(GifFileOut, - GifFileOut->ExtensionBlocks, - GifFileOut->ExtensionBlockCount) == GIF_ERROR) - return (GIF_ERROR); - - if (EGifCloseFile(GifFileOut, NULL) == GIF_ERROR) - return (GIF_ERROR); - - return (GIF_OK); -} - -/* end */ diff --git a/third_party/giflib/lib/gif_err.c b/third_party/giflib/lib/gif_err.c deleted file mode 100644 index 3ec2a56f8..000000000 --- a/third_party/giflib/lib/gif_err.c +++ /dev/null @@ -1,97 +0,0 @@ -/***************************************************************************** - -gif_err.c - handle error reporting for the GIF library. - -****************************************************************************/ - -#include - -#include "gif_lib.h" -#include "gif_lib_private.h" - -/***************************************************************************** - Return a string description of the last GIF error -*****************************************************************************/ -const char * -GifErrorString(int ErrorCode) -{ - const char *Err; - - switch (ErrorCode) { - case E_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case E_GIF_ERR_WRITE_FAILED: - Err = "Failed to write to given file"; - break; - case E_GIF_ERR_HAS_SCRN_DSCR: - Err = "Screen descriptor has already been set"; - break; - case E_GIF_ERR_HAS_IMAG_DSCR: - Err = "Image descriptor is still active"; - break; - case E_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case E_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case E_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case E_GIF_ERR_DISK_IS_FULL: - Err = "Write failed (disk full?)"; - break; - case E_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case E_GIF_ERR_NOT_WRITEABLE: - Err = "Given file was not opened for write"; - break; - case D_GIF_ERR_OPEN_FAILED: - Err = "Failed to open given file"; - break; - case D_GIF_ERR_READ_FAILED: - Err = "Failed to read from given file"; - break; - case D_GIF_ERR_NOT_GIF_FILE: - Err = "Data is not in GIF format"; - break; - case D_GIF_ERR_NO_SCRN_DSCR: - Err = "No screen descriptor detected"; - break; - case D_GIF_ERR_NO_IMAG_DSCR: - Err = "No Image Descriptor detected"; - break; - case D_GIF_ERR_NO_COLOR_MAP: - Err = "Neither global nor local color map"; - break; - case D_GIF_ERR_WRONG_RECORD: - Err = "Wrong record type detected"; - break; - case D_GIF_ERR_DATA_TOO_BIG: - Err = "Number of pixels bigger than width * height"; - break; - case D_GIF_ERR_NOT_ENOUGH_MEM: - Err = "Failed to allocate required memory"; - break; - case D_GIF_ERR_CLOSE_FAILED: - Err = "Failed to close given file"; - break; - case D_GIF_ERR_NOT_READABLE: - Err = "Given file was not opened for read"; - break; - case D_GIF_ERR_IMAGE_DEFECT: - Err = "Image is defective, decoding aborted"; - break; - case D_GIF_ERR_EOF_TOO_SOON: - Err = "Image EOF detected before image complete"; - break; - default: - Err = NULL; - break; - } - return Err; -} - -/* end */ diff --git a/third_party/giflib/lib/gif_font.c b/third_party/giflib/lib/gif_font.c deleted file mode 100644 index ba47b29e8..000000000 --- a/third_party/giflib/lib/gif_font.c +++ /dev/null @@ -1,252 +0,0 @@ -/***************************************************************************** - -gif_font.c - utility font handling and simple drawing for the GIF library - -****************************************************************************/ - -#include - -#include "gif_lib.h" - -/***************************************************************************** - Ascii 8 by 8 regular font - only first 128 characters are supported. -*****************************************************************************/ - -/* - * Each array entry holds the bits for 8 horizontal scan lines, topmost - * first. The most significant bit of each constant is the leftmost bit of - * the scan line. - */ -/*@+charint@*/ -const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH] = { - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* Ascii 0 */ - {0x3c, 0x42, 0xa5, 0x81, 0xbd, 0x42, 0x3c, 0x00}, /* Ascii 1 */ - {0x3c, 0x7e, 0xdb, 0xff, 0xc3, 0x7e, 0x3c, 0x00}, /* Ascii 2 */ - {0x00, 0xee, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x00}, /* Ascii 3 */ - {0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x00}, /* Ascii 4 */ - {0x00, 0x3c, 0x18, 0xff, 0xff, 0x08, 0x18, 0x00}, /* Ascii 5 */ - {0x10, 0x38, 0x7c, 0xfe, 0xfe, 0x10, 0x38, 0x00}, /* Ascii 6 */ - {0x00, 0x00, 0x18, 0x3c, 0x18, 0x00, 0x00, 0x00}, /* Ascii 7 */ - {0xff, 0xff, 0xe7, 0xc3, 0xe7, 0xff, 0xff, 0xff}, /* Ascii 8 */ - {0x00, 0x3c, 0x42, 0x81, 0x81, 0x42, 0x3c, 0x00}, /* Ascii 9 */ - {0xff, 0xc3, 0xbd, 0x7e, 0x7e, 0xbd, 0xc3, 0xff}, /* Ascii 10 */ - {0x1f, 0x07, 0x0d, 0x7c, 0xc6, 0xc6, 0x7c, 0x00}, /* Ascii 11 */ - {0x00, 0x7e, 0xc3, 0xc3, 0x7e, 0x18, 0x7e, 0x18}, /* Ascii 12 */ - {0x04, 0x06, 0x07, 0x04, 0x04, 0xfc, 0xf8, 0x00}, /* Ascii 13 */ - {0x0c, 0x0a, 0x0d, 0x0b, 0xf9, 0xf9, 0x1f, 0x1f}, /* Ascii 14 */ - {0x00, 0x92, 0x7c, 0x44, 0xc6, 0x7c, 0x92, 0x00}, /* Ascii 15 */ - {0x00, 0x00, 0x60, 0x78, 0x7e, 0x78, 0x60, 0x00}, /* Ascii 16 */ - {0x00, 0x00, 0x06, 0x1e, 0x7e, 0x1e, 0x06, 0x00}, /* Ascii 17 */ - {0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x18}, /* Ascii 18 */ - {0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00}, /* Ascii 19 */ - {0xff, 0xb6, 0x76, 0x36, 0x36, 0x36, 0x36, 0x00}, /* Ascii 20 */ - {0x7e, 0xc1, 0xdc, 0x22, 0x22, 0x1f, 0x83, 0x7e}, /* Ascii 21 */ - {0x00, 0x00, 0x00, 0x7e, 0x7e, 0x00, 0x00, 0x00}, /* Ascii 22 */ - {0x18, 0x7e, 0x18, 0x18, 0x7e, 0x18, 0x00, 0xff}, /* Ascii 23 */ - {0x18, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00}, /* Ascii 24 */ - {0x18, 0x18, 0x18, 0x18, 0x18, 0x7e, 0x18, 0x00}, /* Ascii 25 */ - {0x00, 0x04, 0x06, 0xff, 0x06, 0x04, 0x00, 0x00}, /* Ascii 26 */ - {0x00, 0x20, 0x60, 0xff, 0x60, 0x20, 0x00, 0x00}, /* Ascii 27 */ - {0x00, 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xff, 0x00}, /* Ascii 28 */ - {0x00, 0x24, 0x66, 0xff, 0x66, 0x24, 0x00, 0x00}, /* Ascii 29 */ - {0x00, 0x00, 0x10, 0x38, 0x7c, 0xfe, 0x00, 0x00}, /* Ascii 30 */ - {0x00, 0x00, 0x00, 0xfe, 0x7c, 0x38, 0x10, 0x00}, /* Ascii 31 */ - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* */ - {0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0x30, 0x00}, /* ! */ - {0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* " */ - {0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x00}, /* # */ - {0x10, 0x7c, 0xd2, 0x7c, 0x86, 0x7c, 0x10, 0x00}, /* $ */ - {0xf0, 0x96, 0xfc, 0x18, 0x3e, 0x72, 0xde, 0x00}, /* % */ - {0x30, 0x48, 0x30, 0x78, 0xce, 0xcc, 0x78, 0x00}, /* & */ - {0x0c, 0x0c, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, /* ' */ - {0x10, 0x60, 0xc0, 0xc0, 0xc0, 0x60, 0x10, 0x00}, /* ( */ - {0x10, 0x0c, 0x06, 0x06, 0x06, 0x0c, 0x10, 0x00}, /* ) */ - {0x00, 0x54, 0x38, 0xfe, 0x38, 0x54, 0x00, 0x00}, /* * */ - {0x00, 0x18, 0x18, 0x7e, 0x18, 0x18, 0x00, 0x00}, /* + */ - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x70}, /* , */ - {0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00}, /* - */ - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00}, /* . */ - {0x02, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x00}, /* / */ - {0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00}, /* 0 */ - {0x18, 0x38, 0x78, 0x18, 0x18, 0x18, 0x3c, 0x00}, /* 1 */ - {0x7c, 0xc6, 0x06, 0x0c, 0x30, 0x60, 0xfe, 0x00}, /* 2 */ - {0x7c, 0xc6, 0x06, 0x3c, 0x06, 0xc6, 0x7c, 0x00}, /* 3 */ - {0x0e, 0x1e, 0x36, 0x66, 0xfe, 0x06, 0x06, 0x00}, /* 4 */ - {0xfe, 0xc0, 0xc0, 0xfc, 0x06, 0x06, 0xfc, 0x00}, /* 5 */ - {0x7c, 0xc6, 0xc0, 0xfc, 0xc6, 0xc6, 0x7c, 0x00}, /* 6 */ - {0xfe, 0x06, 0x0c, 0x18, 0x30, 0x60, 0x60, 0x00}, /* 7 */ - {0x7c, 0xc6, 0xc6, 0x7c, 0xc6, 0xc6, 0x7c, 0x00}, /* 8 */ - {0x7c, 0xc6, 0xc6, 0x7e, 0x06, 0xc6, 0x7c, 0x00}, /* 9 */ - {0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00}, /* : */ - {0x00, 0x30, 0x00, 0x00, 0x00, 0x30, 0x20, 0x00}, /* }, */ - {0x00, 0x1c, 0x30, 0x60, 0x30, 0x1c, 0x00, 0x00}, /* < */ - {0x00, 0x00, 0x7e, 0x00, 0x7e, 0x00, 0x00, 0x00}, /* = */ - {0x00, 0x70, 0x18, 0x0c, 0x18, 0x70, 0x00, 0x00}, /* > */ - {0x7c, 0xc6, 0x0c, 0x18, 0x30, 0x00, 0x30, 0x00}, /* ? */ - {0x7c, 0x82, 0x9a, 0xaa, 0xaa, 0x9e, 0x7c, 0x00}, /* @ */ - {0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0x00}, /* A */ - {0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xfc, 0x00}, /* B */ - {0x7c, 0xc6, 0xc6, 0xc0, 0xc0, 0xc6, 0x7c, 0x00}, /* C */ - {0xf8, 0xcc, 0xc6, 0xc6, 0xc6, 0xcc, 0xf8, 0x00}, /* D */ - {0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xfe, 0x00}, /* E */ - {0xfe, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0x00}, /* F */ - {0x7c, 0xc6, 0xc0, 0xce, 0xc6, 0xc6, 0x7e, 0x00}, /* G */ - {0xc6, 0xc6, 0xc6, 0xfe, 0xc6, 0xc6, 0xc6, 0x00}, /* H */ - {0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x00}, /* I */ - {0x1e, 0x06, 0x06, 0x06, 0xc6, 0xc6, 0x7c, 0x00}, /* J */ - {0xc6, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0xc6, 0x00}, /* K */ - {0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0x00}, /* L */ - {0xc6, 0xee, 0xfe, 0xd6, 0xc6, 0xc6, 0xc6, 0x00}, /* M */ - {0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x00}, /* N */ - {0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00}, /* O */ - {0xfc, 0xc6, 0xc6, 0xfc, 0xc0, 0xc0, 0xc0, 0x00}, /* P */ - {0x7c, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x06}, /* Q */ - {0xfc, 0xc6, 0xc6, 0xfc, 0xc6, 0xc6, 0xc6, 0x00}, /* R */ - {0x78, 0xcc, 0x60, 0x30, 0x18, 0xcc, 0x78, 0x00}, /* S */ - {0xfc, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00}, /* T */ - {0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x7c, 0x00}, /* U */ - {0xc6, 0xc6, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00}, /* V */ - {0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x00}, /* W */ - {0xc6, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0xc6, 0x00}, /* X */ - {0xc3, 0xc3, 0x66, 0x3c, 0x18, 0x18, 0x18, 0x00}, /* Y */ - {0xfe, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0xfe, 0x00}, /* Z */ - {0x3c, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3c, 0x00}, /* [ */ - {0xc0, 0x60, 0x30, 0x18, 0x0c, 0x06, 0x03, 0x00}, /* \ */ - {0x3c, 0x0c, 0x0c, 0x0c, 0x0c, 0x0c, 0x3c, 0x00}, /* ] */ - {0x00, 0x38, 0x6c, 0xc6, 0x00, 0x00, 0x00, 0x00}, /* ^ */ - {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff}, /* _ */ - {0x30, 0x30, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, /* ` */ - {0x00, 0x00, 0x7c, 0x06, 0x7e, 0xc6, 0x7e, 0x00}, /* a */ - {0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xe6, 0xdc, 0x00}, /* b */ - {0x00, 0x00, 0x7c, 0xc6, 0xc0, 0xc0, 0x7e, 0x00}, /* c */ - {0x06, 0x06, 0x7e, 0xc6, 0xc6, 0xce, 0x76, 0x00}, /* d */ - {0x00, 0x00, 0x7c, 0xc6, 0xfe, 0xc0, 0x7e, 0x00}, /* e */ - {0x1e, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x30, 0x00}, /* f */ - {0x00, 0x00, 0x7e, 0xc6, 0xce, 0x76, 0x06, 0x7c}, /* g */ - {0xc0, 0xc0, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x00}, /* */ - {0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3c, 0x00}, /* i */ - {0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x18, 0xf0}, /* j */ - {0xc0, 0xc0, 0xcc, 0xd8, 0xf0, 0xd8, 0xcc, 0x00}, /* k */ - {0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x00}, /* l */ - {0x00, 0x00, 0xcc, 0xfe, 0xd6, 0xc6, 0xc6, 0x00}, /* m */ - {0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xc6, 0xc6, 0x00}, /* n */ - {0x00, 0x00, 0x7c, 0xc6, 0xc6, 0xc6, 0x7c, 0x00}, /* o */ - {0x00, 0x00, 0xfc, 0xc6, 0xc6, 0xe6, 0xdc, 0xc0}, /* p */ - {0x00, 0x00, 0x7e, 0xc6, 0xc6, 0xce, 0x76, 0x06}, /* q */ - {0x00, 0x00, 0x6e, 0x70, 0x60, 0x60, 0x60, 0x00}, /* r */ - {0x00, 0x00, 0x7c, 0xc0, 0x7c, 0x06, 0xfc, 0x00}, /* s */ - {0x30, 0x30, 0x7c, 0x30, 0x30, 0x30, 0x1c, 0x00}, /* t */ - {0x00, 0x00, 0xc6, 0xc6, 0xc6, 0xc6, 0x7e, 0x00}, /* u */ - {0x00, 0x00, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x00}, /* v */ - {0x00, 0x00, 0xc6, 0xc6, 0xd6, 0xfe, 0x6c, 0x00}, /* w */ - {0x00, 0x00, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x00}, /* x */ - {0x00, 0x00, 0xc6, 0xc6, 0xce, 0x76, 0x06, 0x7c}, /* y */ - {0x00, 0x00, 0xfc, 0x18, 0x30, 0x60, 0xfc, 0x00}, /* z */ - {0x0e, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0e, 0x00}, /* { */ - {0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, /* | */ - {0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x00}, /* } */ - {0x00, 0x00, 0x70, 0x9a, 0x0e, 0x00, 0x00, 0x00}, /* ~ */ - {0x00, 0x00, 0x18, 0x3c, 0x66, 0xff, 0x00, 0x00} /* Ascii 127 */ -}; -/*@=charint@*/ - -void -GifDrawText8x8(SavedImage *Image, - const int x, const int y, - const char *legend, - const int color) -{ - int i, j; - int base; - const char *cp; - - for (i = 0; i < GIF_FONT_HEIGHT; i++) { - base = Image->ImageDesc.Width * (y + i) + x; - - for (cp = legend; *cp; cp++) - for (j = 0; j < GIF_FONT_WIDTH; j++) { - if (GifAsciiTable8x8[(short)(*cp)][i] & (1 << (GIF_FONT_WIDTH - j))) - Image->RasterBits[base] = color; - base++; - } - } -} - -void -GifDrawBox(SavedImage *Image, - const int x, const int y, - const int w, const int d, - const int color) -{ - int j, base = Image->ImageDesc.Width * y + x; - - for (j = 0; j < w; j++) - Image->RasterBits[base + j] = - Image->RasterBits[base + (d * Image->ImageDesc.Width) + j] = color; - - for (j = 0; j < d; j++) - Image->RasterBits[base + j * Image->ImageDesc.Width] = - Image->RasterBits[base + j * Image->ImageDesc.Width + w] = color; -} - -void -GifDrawRectangle(SavedImage *Image, - const int x, const int y, - const int w, const int d, - const int color) -{ - unsigned char *bp = Image->RasterBits + Image->ImageDesc.Width * y + x; - int i; - - for (i = 0; i < d; i++) - memset(bp + (i * Image->ImageDesc.Width), color, (size_t)w); -} - -void -GifDrawBoxedText8x8(SavedImage *Image, - const int x, const int y, - const char *legend, - const int border, - const int bg, const int fg) -{ - int i, j = 0, LineCount = 0, TextWidth = 0; - const char *cp; - - /* compute size of text to box */ - for (cp = legend; *cp; cp++) - if (*cp == '\r') { - if (j > TextWidth) - TextWidth = j; - j = 0; - LineCount++; - } else if (*cp != '\t') - ++j; - LineCount++; /* count last line */ - if (j > TextWidth) /* last line might be longer than any previous */ - TextWidth = j; - - /* fill the box */ - GifDrawRectangle(Image, x + 1, y + 1, - border + TextWidth * GIF_FONT_WIDTH + border - 1, - border + LineCount * GIF_FONT_HEIGHT + border - 1, bg); - - /* draw the text */ - i = 0; - cp = strtok((char *)legend, "\r\n"); - do { - int leadspace = 0; - - if (cp[0] == '\t') - leadspace = (TextWidth - strlen(++cp)) / 2; - - GifDrawText8x8(Image, x + border + (leadspace * GIF_FONT_WIDTH), - y + border + (GIF_FONT_HEIGHT * i++), cp, fg); - cp = strtok((char *)NULL, "\r\n"); - } while (cp); - - /* outline the box */ - GifDrawBox(Image, x, y, border + TextWidth * GIF_FONT_WIDTH + border, - border + LineCount * GIF_FONT_HEIGHT + border, fg); -} - -/* end */ diff --git a/third_party/giflib/lib/gif_hash.c b/third_party/giflib/lib/gif_hash.c deleted file mode 100644 index be48486e8..000000000 --- a/third_party/giflib/lib/gif_hash.c +++ /dev/null @@ -1,134 +0,0 @@ -/***************************************************************************** - -gif_hash.c -- module to support the following operations: - -1. InitHashTable - initialize hash table. -2. ClearHashTable - clear the hash table to an empty state. -2. InsertHashTable - insert one item into data structure. -3. ExistsHashTable - test if item exists in data structure. - -This module is used to hash the GIF codes during encoding. - -*****************************************************************************/ - -#ifdef HAVE_UNISTD_H -#include -#endif -#include -#include -#include -#include -#include - -#include "gif_lib.h" -#include "gif_hash.h" -#include "gif_lib_private.h" - -/* #define DEBUG_HIT_RATE Debug number of misses per hash Insert/Exists. */ - -#ifdef DEBUG_HIT_RATE -static long NumberOfTests = 0, - NumberOfMisses = 0; -#endif /* DEBUG_HIT_RATE */ - -static int KeyItem(uint32_t Item); - -/****************************************************************************** - Initialize HashTable - allocate the memory needed and clear it. * -******************************************************************************/ -GifHashTableType *_InitHashTable(void) -{ - GifHashTableType *HashTable; - - if ((HashTable = (GifHashTableType *) malloc(sizeof(GifHashTableType))) - == NULL) - return NULL; - - _ClearHashTable(HashTable); - - return HashTable; -} - -/****************************************************************************** - Routine to clear the HashTable to an empty state. * - This part is a little machine depended. Use the commented part otherwise. * -******************************************************************************/ -void _ClearHashTable(GifHashTableType *HashTable) -{ - memset(HashTable -> HTable, 0xFF, HT_SIZE * sizeof(uint32_t)); -} - -/****************************************************************************** - Routine to insert a new Item into the HashTable. The data is assumed to be * - new one. * -******************************************************************************/ -void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code) -{ - int HKey = KeyItem(Key); - uint32_t *HTable = HashTable -> HTable; - -#ifdef DEBUG_HIT_RATE - NumberOfTests++; - NumberOfMisses++; -#endif /* DEBUG_HIT_RATE */ - - while (HT_GET_KEY(HTable[HKey]) != 0xFFFFFL) { -#ifdef DEBUG_HIT_RATE - NumberOfMisses++; -#endif /* DEBUG_HIT_RATE */ - HKey = (HKey + 1) & HT_KEY_MASK; - } - HTable[HKey] = HT_PUT_KEY(Key) | HT_PUT_CODE(Code); -} - -/****************************************************************************** - Routine to test if given Key exists in HashTable and if so returns its code * - Returns the Code if key was found, -1 if not. * -******************************************************************************/ -int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key) -{ - int HKey = KeyItem(Key); - uint32_t *HTable = HashTable -> HTable, HTKey; - -#ifdef DEBUG_HIT_RATE - NumberOfTests++; - NumberOfMisses++; -#endif /* DEBUG_HIT_RATE */ - - while ((HTKey = HT_GET_KEY(HTable[HKey])) != 0xFFFFFL) { -#ifdef DEBUG_HIT_RATE - NumberOfMisses++; -#endif /* DEBUG_HIT_RATE */ - if (Key == HTKey) return HT_GET_CODE(HTable[HKey]); - HKey = (HKey + 1) & HT_KEY_MASK; - } - - return -1; -} - -/****************************************************************************** - Routine to generate an HKey for the hashtable out of the given unique key. * - The given Key is assumed to be 20 bits as follows: lower 8 bits are the * - new postfix character, while the upper 12 bits are the prefix code. * - Because the average hit ratio is only 2 (2 hash references per entry), * - evaluating more complex keys (such as twin prime keys) does not worth it! * -******************************************************************************/ -static int KeyItem(uint32_t Item) -{ - return ((Item >> 12) ^ Item) & HT_KEY_MASK; -} - -#ifdef DEBUG_HIT_RATE -/****************************************************************************** - Debugging routine to print the hit ratio - number of times the hash table * - was tested per operation. This routine was used to test the KeyItem routine * -******************************************************************************/ -void HashTablePrintHitRatio(void) -{ - printf("Hash Table Hit Ratio is %ld/%ld = %ld%%.\n", - NumberOfMisses, NumberOfTests, - NumberOfMisses * 100 / NumberOfTests); -} -#endif /* DEBUG_HIT_RATE */ - -/* end */ diff --git a/third_party/giflib/lib/gif_hash.h b/third_party/giflib/lib/gif_hash.h deleted file mode 100644 index 800b4bbff..000000000 --- a/third_party/giflib/lib/gif_hash.h +++ /dev/null @@ -1,42 +0,0 @@ -/****************************************************************************** - -gif_hash.h - magfic constants and declarations for GIF LZW - -******************************************************************************/ - -#ifndef _GIF_HASH_H_ -#define _GIF_HASH_H_ - -#ifdef HAVE_UNISTD_H -#include -#endif - -#include - -#define HT_SIZE 8192 /* 12bits = 4096 or twice as big! */ -#define HT_KEY_MASK 0x1FFF /* 13bits keys */ -#define HT_KEY_NUM_BITS 13 /* 13bits keys */ -#define HT_MAX_KEY 8191 /* 13bits - 1, maximal code possible */ -#define HT_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ - -/* The 32 bits of the long are divided into two parts for the key & code: */ -/* 1. The code is 12 bits as our compression algorithm is limited to 12bits */ -/* 2. The key is 12 bits Prefix code + 8 bit new char or 20 bits. */ -/* The key is the upper 20 bits. The code is the lower 12. */ -#define HT_GET_KEY(l) (l >> 12) -#define HT_GET_CODE(l) (l & 0x0FFF) -#define HT_PUT_KEY(l) (l << 12) -#define HT_PUT_CODE(l) (l & 0x0FFF) - -typedef struct GifHashTableType { - uint32_t HTable[HT_SIZE]; -} GifHashTableType; - -GifHashTableType *_InitHashTable(void); -void _ClearHashTable(GifHashTableType *HashTable); -void _InsertHashTable(GifHashTableType *HashTable, uint32_t Key, int Code); -int _ExistsHashTable(GifHashTableType *HashTable, uint32_t Key); - -#endif /* _GIF_HASH_H_ */ - -/* end */ diff --git a/third_party/giflib/lib/gif_lib.h b/third_party/giflib/lib/gif_lib.h deleted file mode 100644 index b202485ca..000000000 --- a/third_party/giflib/lib/gif_lib.h +++ /dev/null @@ -1,316 +0,0 @@ -/****************************************************************************** - -gif_lib.h - service library for decoding and encoding GIF images - -*****************************************************************************/ - -#ifndef _GIF_LIB_H_ -#define _GIF_LIB_H_ 1 - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define GIFLIB_MAJOR 5 -#define GIFLIB_MINOR 1 -#define GIFLIB_RELEASE 0 - -#define GIF_ERROR 0 -#define GIF_OK 1 - -#include -#ifdef HAVE_STDBOOL_H - #include -#elif !defined __cplusplus - #define false 0 - #define true 1 -#endif - -typedef int GifBool; - -#define GIF_STAMP "GIFVER" /* First chars in file - GIF stamp. */ -#define GIF_STAMP_LEN sizeof(GIF_STAMP) - 1 -#define GIF_VERSION_POS 3 /* Version first character in stamp. */ -#define GIF87_STAMP "GIF87a" /* First chars in file - GIF stamp. */ -#define GIF89_STAMP "GIF89a" /* First chars in file - GIF stamp. */ - -typedef unsigned char GifPixelType; -typedef unsigned char *GifRowType; -typedef unsigned char GifByteType; -typedef unsigned int GifPrefixType; -typedef int GifWord; - -typedef struct GifColorType { - GifByteType Red, Green, Blue; -} GifColorType; - -typedef struct ColorMapObject { - int ColorCount; - int BitsPerPixel; - GifBool SortFlag; - GifColorType *Colors; /* on malloc(3) heap */ -} ColorMapObject; - -typedef struct GifImageDesc { - GifWord Left, Top, Width, Height; /* Current image dimensions. */ - GifBool Interlace; /* Sequential/Interlaced lines. */ - ColorMapObject *ColorMap; /* The local color map */ -} GifImageDesc; - -typedef struct ExtensionBlock { - int ByteCount; - GifByteType *Bytes; /* on malloc(3) heap */ - int Function; /* The block function code */ -#define CONTINUE_EXT_FUNC_CODE 0x00 /* continuation subblock */ -#define COMMENT_EXT_FUNC_CODE 0xfe /* comment */ -#define GRAPHICS_EXT_FUNC_CODE 0xf9 /* graphics control (GIF89) */ -#define PLAINTEXT_EXT_FUNC_CODE 0x01 /* plaintext */ -#define APPLICATION_EXT_FUNC_CODE 0xff /* application block */ -} ExtensionBlock; - -typedef struct SavedImage { - GifImageDesc ImageDesc; - GifByteType *RasterBits; /* on malloc(3) heap */ - int ExtensionBlockCount; /* Count of extensions before image */ - ExtensionBlock *ExtensionBlocks; /* Extensions before image */ -} SavedImage; - -typedef struct GifFileType { - GifWord SWidth, SHeight; /* Size of virtual canvas */ - GifWord SColorResolution; /* How many colors can we generate? */ - GifWord SBackGroundColor; /* Background color for virtual canvas */ - GifByteType AspectByte; /* Used to compute pixel aspect ratio */ - ColorMapObject *SColorMap; /* Global colormap, NULL if nonexistent. */ - int ImageCount; /* Number of current image (both APIs) */ - GifImageDesc Image; /* Current image (low-level API) */ - SavedImage *SavedImages; /* Image sequence (high-level API) */ - int ExtensionBlockCount; /* Count extensions past last image */ - ExtensionBlock *ExtensionBlocks; /* Extensions past last image */ - int Error; /* Last error condition reported */ - void *UserData; /* hook to attach user data (TVT) */ - void *Private; /* Don't mess with this! */ -} GifFileType; - -#define GIF_ASPECT_RATIO(n) ((n)+15.0/64.0) - -typedef enum { - UNDEFINED_RECORD_TYPE, - SCREEN_DESC_RECORD_TYPE, - IMAGE_DESC_RECORD_TYPE, /* Begin with ',' */ - EXTENSION_RECORD_TYPE, /* Begin with '!' */ - TERMINATE_RECORD_TYPE /* Begin with ';' */ -} GifRecordType; - -/* func type to read gif data from arbitrary sources (TVT) */ -typedef int (*InputFunc) (GifFileType *, GifByteType *, int); - -/* func type to write gif data to arbitrary targets. - * Returns count of bytes written. (MRB) - */ -typedef int (*OutputFunc) (GifFileType *, const GifByteType *, int); - -/****************************************************************************** - GIF89 structures -******************************************************************************/ - -typedef struct GraphicsControlBlock { - int DisposalMode; -#define DISPOSAL_UNSPECIFIED 0 /* No disposal specified. */ -#define DISPOSE_DO_NOT 1 /* Leave image in place */ -#define DISPOSE_BACKGROUND 2 /* Set area too background color */ -#define DISPOSE_PREVIOUS 3 /* Restore to previous content */ - GifBool UserInputFlag; /* User confirmation required before disposal */ - int DelayTime; /* pre-display delay in 0.01sec units */ - int TransparentColor; /* Palette index for transparency, -1 if none */ -#define NO_TRANSPARENT_COLOR -1 -} GraphicsControlBlock; - -/****************************************************************************** - GIF encoding routines -******************************************************************************/ - -/* Main entry points */ -GifFileType *EGifOpenFileName(const char *GifFileName, - const GifBool GifTestExistence, int *Error); -GifFileType *EGifOpenFileHandle(const int GifFileHandle, int *Error); -GifFileType *EGifOpen(void *userPtr, OutputFunc writeFunc, int *Error); -int EGifSpew(GifFileType * GifFile); -const char *EGifGetGifVersion(GifFileType *GifFile); /* new in 5.x */ -int EGifCloseFile(GifFileType *GifFile, int *ErrorCode); - -#define E_GIF_SUCCEEDED 0 -#define E_GIF_ERR_OPEN_FAILED 1 /* And EGif possible errors. */ -#define E_GIF_ERR_WRITE_FAILED 2 -#define E_GIF_ERR_HAS_SCRN_DSCR 3 -#define E_GIF_ERR_HAS_IMAG_DSCR 4 -#define E_GIF_ERR_NO_COLOR_MAP 5 -#define E_GIF_ERR_DATA_TOO_BIG 6 -#define E_GIF_ERR_NOT_ENOUGH_MEM 7 -#define E_GIF_ERR_DISK_IS_FULL 8 -#define E_GIF_ERR_CLOSE_FAILED 9 -#define E_GIF_ERR_NOT_WRITEABLE 10 - -/* These are legacy. You probably do not want to call them directly */ -int EGifPutScreenDesc(GifFileType *GifFile, - const int GifWidth, const int GifHeight, - const int GifColorRes, - const int GifBackGround, - const ColorMapObject *GifColorMap); -int EGifPutImageDesc(GifFileType *GifFile, - const int GifLeft, const int GifTop, - const int GifWidth, const int GifHeight, - const GifBool GifInterlace, - const ColorMapObject *GifColorMap); -void EGifSetGifVersion(GifFileType *GifFile, const GifBool gif89); -int EGifPutLine(GifFileType *GifFile, GifPixelType *GifLine, - int GifLineLen); -int EGifPutPixel(GifFileType *GifFile, const GifPixelType GifPixel); -int EGifPutComment(GifFileType *GifFile, const char *GifComment); -int EGifPutExtensionLeader(GifFileType *GifFile, const int GifExtCode); -int EGifPutExtensionBlock(GifFileType *GifFile, - const int GifExtLen, const void *GifExtension); -int EGifPutExtensionTrailer(GifFileType *GifFile); -int EGifPutExtension(GifFileType *GifFile, const int GifExtCode, - const int GifExtLen, - const void *GifExtension); -int EGifPutCode(GifFileType *GifFile, int GifCodeSize, - const GifByteType *GifCodeBlock); -int EGifPutCodeNext(GifFileType *GifFile, - const GifByteType *GifCodeBlock); - -/****************************************************************************** - GIF decoding routines -******************************************************************************/ - -/* Main entry points */ -GifFileType *DGifOpenFileName(const char *GifFileName, int *Error); -GifFileType *DGifOpenFileHandle(int GifFileHandle, int *Error); -int DGifSlurp(GifFileType * GifFile); -GifFileType *DGifOpen(void *userPtr, InputFunc readFunc, int *Error); /* new one (TVT) */ - int DGifCloseFile(GifFileType * GifFile, int *ErrorCode); - -#define D_GIF_SUCCEEDED 0 -#define D_GIF_ERR_OPEN_FAILED 101 /* And DGif possible errors. */ -#define D_GIF_ERR_READ_FAILED 102 -#define D_GIF_ERR_NOT_GIF_FILE 103 -#define D_GIF_ERR_NO_SCRN_DSCR 104 -#define D_GIF_ERR_NO_IMAG_DSCR 105 -#define D_GIF_ERR_NO_COLOR_MAP 106 -#define D_GIF_ERR_WRONG_RECORD 107 -#define D_GIF_ERR_DATA_TOO_BIG 108 -#define D_GIF_ERR_NOT_ENOUGH_MEM 109 -#define D_GIF_ERR_CLOSE_FAILED 110 -#define D_GIF_ERR_NOT_READABLE 111 -#define D_GIF_ERR_IMAGE_DEFECT 112 -#define D_GIF_ERR_EOF_TOO_SOON 113 - -/* These are legacy. You probably do not want to call them directly */ -int DGifGetScreenDesc(GifFileType *GifFile); -int DGifGetRecordType(GifFileType *GifFile, GifRecordType *GifType); -int DGifGetImageDesc(GifFileType *GifFile); -int DGifGetLine(GifFileType *GifFile, GifPixelType *GifLine, int GifLineLen); -int DGifGetPixel(GifFileType *GifFile, GifPixelType GifPixel); -int DGifGetComment(GifFileType *GifFile, char *GifComment); -int DGifGetExtension(GifFileType *GifFile, int *GifExtCode, - GifByteType **GifExtension); -int DGifGetExtensionNext(GifFileType *GifFile, GifByteType **GifExtension); -int DGifGetCode(GifFileType *GifFile, int *GifCodeSize, - GifByteType **GifCodeBlock); -int DGifGetCodeNext(GifFileType *GifFile, GifByteType **GifCodeBlock); -int DGifGetLZCodes(GifFileType *GifFile, int *GifCode); - - -/****************************************************************************** - Color table quantization (deprecated) -******************************************************************************/ -int GifQuantizeBuffer(unsigned int Width, unsigned int Height, - int *ColorMapSize, GifByteType * RedInput, - GifByteType * GreenInput, GifByteType * BlueInput, - GifByteType * OutputBuffer, - GifColorType * OutputColorMap); - -/****************************************************************************** - Error handling and reporting. -******************************************************************************/ -extern const char *GifErrorString(int ErrorCode); /* new in 2012 - ESR */ - -/***************************************************************************** - Everything below this point is new after version 1.2, supporting `slurp - mode' for doing I/O in two big belts with all the image-bashing in core. -******************************************************************************/ - -/****************************************************************************** - Color map handling from gif_alloc.c -******************************************************************************/ - -extern ColorMapObject *GifMakeMapObject(int ColorCount, - const GifColorType *ColorMap); -extern void GifFreeMapObject(ColorMapObject *Object); -extern ColorMapObject *GifUnionColorMap(const ColorMapObject *ColorIn1, - const ColorMapObject *ColorIn2, - GifPixelType ColorTransIn2[]); -extern int GifBitSize(int n); - -/****************************************************************************** - Support for the in-core structures allocation (slurp mode). -******************************************************************************/ - -extern void GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]); -extern int GifAddExtensionBlock(int *ExtensionBlock_Count, - ExtensionBlock **ExtensionBlocks, - int Function, - unsigned int Len, unsigned char ExtData[]); -extern void GifFreeExtensions(int *ExtensionBlock_Count, - ExtensionBlock **ExtensionBlocks); -extern SavedImage *GifMakeSavedImage(GifFileType *GifFile, - const SavedImage *CopyFrom); -extern void GifFreeSavedImages(GifFileType *GifFile); - -/****************************************************************************** - 5.x functions for GIF89 graphics control blocks -******************************************************************************/ - -int DGifExtensionToGCB(const size_t GifExtensionLength, - const GifByteType *GifExtension, - GraphicsControlBlock *GCB); -size_t EGifGCBToExtension(const GraphicsControlBlock *GCB, - GifByteType *GifExtension); - -int DGifSavedExtensionToGCB(GifFileType *GifFile, - int ImageIndex, - GraphicsControlBlock *GCB); -int EGifGCBToSavedExtension(const GraphicsControlBlock *GCB, - GifFileType *GifFile, - int ImageIndex); - -/****************************************************************************** - The library's internal utility font -******************************************************************************/ - -#define GIF_FONT_WIDTH 8 -#define GIF_FONT_HEIGHT 8 -extern const unsigned char GifAsciiTable8x8[][GIF_FONT_WIDTH]; - -extern void GifDrawText8x8(SavedImage *Image, - const int x, const int y, - const char *legend, const int color); - -extern void GifDrawBox(SavedImage *Image, - const int x, const int y, - const int w, const int d, const int color); - -extern void GifDrawRectangle(SavedImage *Image, - const int x, const int y, - const int w, const int d, const int color); - -extern void GifDrawBoxedText8x8(SavedImage *Image, - const int x, const int y, - const char *legend, - const int border, const int bg, const int fg); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ -#endif /* _GIF_LIB_H */ - -/* end */ diff --git a/third_party/giflib/lib/gif_lib_private.h b/third_party/giflib/lib/gif_lib_private.h deleted file mode 100644 index 1d4ae4b1b..000000000 --- a/third_party/giflib/lib/gif_lib_private.h +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** - -gif_lib_private.h - internal giflib routines and structures - -****************************************************************************/ - -#ifndef _GIF_LIB_PRIVATE_H -#define _GIF_LIB_PRIVATE_H - -#include "gif_lib.h" -#include "gif_hash.h" - -#define EXTENSION_INTRODUCER 0x21 -#define DESCRIPTOR_INTRODUCER 0x2c -#define TERMINATOR_INTRODUCER 0x3b - -#define LZ_MAX_CODE 4095 /* Biggest code possible in 12 bits. */ -#define LZ_BITS 12 - -#define FLUSH_OUTPUT 4096 /* Impossible code, to signal flush. */ -#define FIRST_CODE 4097 /* Impossible code, to signal first. */ -#define NO_SUCH_CODE 4098 /* Impossible code, to signal empty. */ - -#define FILE_STATE_WRITE 0x01 -#define FILE_STATE_SCREEN 0x02 -#define FILE_STATE_IMAGE 0x04 -#define FILE_STATE_READ 0x08 - -#define IS_READABLE(Private) (Private->FileState & FILE_STATE_READ) -#define IS_WRITEABLE(Private) (Private->FileState & FILE_STATE_WRITE) - -typedef struct GifFilePrivateType { - GifWord FileState, FileHandle, /* Where all this data goes to! */ - BitsPerPixel, /* Bits per pixel (Codes uses at least this + 1). */ - ClearCode, /* The CLEAR LZ code. */ - EOFCode, /* The EOF LZ code. */ - RunningCode, /* The next code algorithm can generate. */ - RunningBits, /* The number of bits required to represent RunningCode. */ - MaxCode1, /* 1 bigger than max. possible code, in RunningBits bits. */ - LastCode, /* The code before the current code. */ - CrntCode, /* Current algorithm code. */ - StackPtr, /* For character stack (see below). */ - CrntShiftState; /* Number of bits in CrntShiftDWord. */ - unsigned long CrntShiftDWord; /* For bytes decomposition into codes. */ - unsigned long PixelCount; /* Number of pixels in image. */ - FILE *File; /* File as stream. */ - InputFunc Read; /* function to read gif input (TVT) */ - OutputFunc Write; /* function to write gif output (MRB) */ - GifByteType Buf[256]; /* Compressed input is buffered here. */ - GifByteType Stack[LZ_MAX_CODE]; /* Decoded pixels are stacked here. */ - GifByteType Suffix[LZ_MAX_CODE + 1]; /* So we can trace the codes. */ - GifPrefixType Prefix[LZ_MAX_CODE + 1]; - GifHashTableType *HashTable; - GifBool gif89; -} GifFilePrivateType; - -#endif /* _GIF_LIB_PRIVATE_H */ - -/* end */ diff --git a/third_party/giflib/lib/gifalloc.c b/third_party/giflib/lib/gifalloc.c deleted file mode 100644 index 9fe3edf8c..000000000 --- a/third_party/giflib/lib/gifalloc.c +++ /dev/null @@ -1,401 +0,0 @@ -/***************************************************************************** - - GIF construction tools - -****************************************************************************/ - -#include -#include -#include - -#include "gif_lib.h" - -#define MAX(x, y) (((x) > (y)) ? (x) : (y)) - -/****************************************************************************** - Miscellaneous utility functions -******************************************************************************/ - -/* return smallest bitfield size n will fit in */ -int -GifBitSize(int n) -{ - register int i; - - for (i = 1; i <= 8; i++) - if ((1 << i) >= n) - break; - return (i); -} - -/****************************************************************************** - Color map object functions -******************************************************************************/ - -/* - * Allocate a color map of given size; initialize with contents of - * ColorMap if that pointer is non-NULL. - */ -ColorMapObject * -GifMakeMapObject(int ColorCount, const GifColorType *ColorMap) -{ - ColorMapObject *Object; - - /*** FIXME: Our ColorCount has to be a power of two. Is it necessary to - * make the user know that or should we automatically round up instead? */ - if (ColorCount != (1 << GifBitSize(ColorCount))) { - return ((ColorMapObject *) NULL); - } - - Object = (ColorMapObject *)malloc(sizeof(ColorMapObject)); - if (Object == (ColorMapObject *) NULL) { - return ((ColorMapObject *) NULL); - } - - Object->Colors = (GifColorType *)calloc(ColorCount, sizeof(GifColorType)); - if (Object->Colors == (GifColorType *) NULL) { - free(Object); - return ((ColorMapObject *) NULL); - } - - Object->ColorCount = ColorCount; - Object->BitsPerPixel = GifBitSize(ColorCount); - Object->SortFlag = false; - - if (ColorMap != NULL) { - memcpy((char *)Object->Colors, - (char *)ColorMap, ColorCount * sizeof(GifColorType)); - } - - return (Object); -} - -/******************************************************************************* -Free a color map object -*******************************************************************************/ -void -GifFreeMapObject(ColorMapObject *Object) -{ - if (Object != NULL) { - (void)free(Object->Colors); - (void)free(Object); - } -} - -#ifdef DEBUG -void -DumpColorMap(ColorMapObject *Object, - FILE * fp) -{ - if (Object != NULL) { - int i, j, Len = Object->ColorCount; - - for (i = 0; i < Len; i += 4) { - for (j = 0; j < 4 && j < Len; j++) { - (void)fprintf(fp, "%3d: %02x %02x %02x ", i + j, - Object->Colors[i + j].Red, - Object->Colors[i + j].Green, - Object->Colors[i + j].Blue); - } - (void)fprintf(fp, "\n"); - } - } -} -#endif /* DEBUG */ - -/******************************************************************************* - Compute the union of two given color maps and return it. If result can't - fit into 256 colors, NULL is returned, the allocated union otherwise. - ColorIn1 is copied as is to ColorUnion, while colors from ColorIn2 are - copied iff they didn't exist before. ColorTransIn2 maps the old - ColorIn2 into the ColorUnion color map table./ -*******************************************************************************/ -ColorMapObject * -GifUnionColorMap(const ColorMapObject *ColorIn1, - const ColorMapObject *ColorIn2, - GifPixelType ColorTransIn2[]) -{ - int i, j, CrntSlot, RoundUpTo, NewGifBitSize; - ColorMapObject *ColorUnion; - - /* - * We don't worry about duplicates within either color map; if - * the caller wants to resolve those, he can perform unions - * with an empty color map. - */ - - /* Allocate table which will hold the result for sure. */ - ColorUnion = GifMakeMapObject(MAX(ColorIn1->ColorCount, - ColorIn2->ColorCount) * 2, NULL); - - if (ColorUnion == NULL) - return (NULL); - - /* - * Copy ColorIn1 to ColorUnion. - */ - for (i = 0; i < ColorIn1->ColorCount; i++) - ColorUnion->Colors[i] = ColorIn1->Colors[i]; - CrntSlot = ColorIn1->ColorCount; - - /* - * Potentially obnoxious hack: - * - * Back CrntSlot down past all contiguous {0, 0, 0} slots at the end - * of table 1. This is very useful if your display is limited to - * 16 colors. - */ - while (ColorIn1->Colors[CrntSlot - 1].Red == 0 - && ColorIn1->Colors[CrntSlot - 1].Green == 0 - && ColorIn1->Colors[CrntSlot - 1].Blue == 0) - CrntSlot--; - - /* Copy ColorIn2 to ColorUnion (use old colors if they exist): */ - for (i = 0; i < ColorIn2->ColorCount && CrntSlot <= 256; i++) { - /* Let's see if this color already exists: */ - for (j = 0; j < ColorIn1->ColorCount; j++) - if (memcmp (&ColorIn1->Colors[j], &ColorIn2->Colors[i], - sizeof(GifColorType)) == 0) - break; - - if (j < ColorIn1->ColorCount) - ColorTransIn2[i] = j; /* color exists in Color1 */ - else { - /* Color is new - copy it to a new slot: */ - ColorUnion->Colors[CrntSlot] = ColorIn2->Colors[i]; - ColorTransIn2[i] = CrntSlot++; - } - } - - if (CrntSlot > 256) { - GifFreeMapObject(ColorUnion); - return ((ColorMapObject *) NULL); - } - - NewGifBitSize = GifBitSize(CrntSlot); - RoundUpTo = (1 << NewGifBitSize); - - if (RoundUpTo != ColorUnion->ColorCount) { - register GifColorType *Map = ColorUnion->Colors; - - /* - * Zero out slots up to next power of 2. - * We know these slots exist because of the way ColorUnion's - * start dimension was computed. - */ - for (j = CrntSlot; j < RoundUpTo; j++) - Map[j].Red = Map[j].Green = Map[j].Blue = 0; - - /* perhaps we can shrink the map? */ - if (RoundUpTo < ColorUnion->ColorCount) - ColorUnion->Colors = (GifColorType *)realloc(Map, - sizeof(GifColorType) * RoundUpTo); - } - - ColorUnion->ColorCount = RoundUpTo; - ColorUnion->BitsPerPixel = NewGifBitSize; - - return (ColorUnion); -} - -/******************************************************************************* - Apply a given color translation to the raster bits of an image -*******************************************************************************/ -void -GifApplyTranslation(SavedImage *Image, GifPixelType Translation[]) -{ - register int i; - register int RasterSize = Image->ImageDesc.Height * Image->ImageDesc.Width; - - for (i = 0; i < RasterSize; i++) - Image->RasterBits[i] = Translation[Image->RasterBits[i]]; -} - -/****************************************************************************** - Extension record functions -******************************************************************************/ -int -GifAddExtensionBlock(int *ExtensionBlockCount, - ExtensionBlock **ExtensionBlocks, - int Function, - unsigned int Len, - unsigned char ExtData[]) -{ - ExtensionBlock *ep; - - if (*ExtensionBlocks == NULL) - *ExtensionBlocks=(ExtensionBlock *)malloc(sizeof(ExtensionBlock)); - else - *ExtensionBlocks = (ExtensionBlock *)realloc(*ExtensionBlocks, - sizeof(ExtensionBlock) * - (*ExtensionBlockCount + 1)); - - if (*ExtensionBlocks == NULL) - return (GIF_ERROR); - - ep = &(*ExtensionBlocks)[(*ExtensionBlockCount)++]; - - ep->Function = Function; - ep->ByteCount=Len; - ep->Bytes = (GifByteType *)malloc(ep->ByteCount); - if (ep->Bytes == NULL) - return (GIF_ERROR); - - if (ExtData != NULL) { - memcpy(ep->Bytes, ExtData, Len); - } - - return (GIF_OK); -} - -void -GifFreeExtensions(int *ExtensionBlockCount, - ExtensionBlock **ExtensionBlocks) -{ - ExtensionBlock *ep; - - if (*ExtensionBlocks == NULL) - return; - - for (ep = *ExtensionBlocks; - ep < (*ExtensionBlocks + *ExtensionBlockCount); - ep++) - (void)free((char *)ep->Bytes); - (void)free((char *)*ExtensionBlocks); - *ExtensionBlocks = NULL; - *ExtensionBlockCount = 0; -} - -/****************************************************************************** - Image block allocation functions -******************************************************************************/ - -/* Private Function: - * Frees the last image in the GifFile->SavedImages array - */ -void -FreeLastSavedImage(GifFileType *GifFile) -{ - SavedImage *sp; - - if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) - return; - - /* Remove one SavedImage from the GifFile */ - GifFile->ImageCount--; - sp = &GifFile->SavedImages[GifFile->ImageCount]; - - /* Deallocate its Colormap */ - if (sp->ImageDesc.ColorMap != NULL) { - GifFreeMapObject(sp->ImageDesc.ColorMap); - sp->ImageDesc.ColorMap = NULL; - } - - /* Deallocate the image data */ - if (sp->RasterBits != NULL) - free((char *)sp->RasterBits); - - /* Deallocate any extensions */ - GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); - - /*** FIXME: We could realloc the GifFile->SavedImages structure but is - * there a point to it? Saves some memory but we'd have to do it every - * time. If this is used in GifFreeSavedImages then it would be inefficient - * (The whole array is going to be deallocated.) If we just use it when - * we want to free the last Image it's convenient to do it here. - */ -} - -/* - * Append an image block to the SavedImages array - */ -SavedImage * -GifMakeSavedImage(GifFileType *GifFile, const SavedImage *CopyFrom) -{ - if (GifFile->SavedImages == NULL) - GifFile->SavedImages = (SavedImage *)malloc(sizeof(SavedImage)); - else - GifFile->SavedImages = (SavedImage *)realloc(GifFile->SavedImages, - sizeof(SavedImage) * (GifFile->ImageCount + 1)); - - if (GifFile->SavedImages == NULL) - return ((SavedImage *)NULL); - else { - SavedImage *sp = &GifFile->SavedImages[GifFile->ImageCount++]; - memset((char *)sp, '\0', sizeof(SavedImage)); - - if (CopyFrom != NULL) { - memcpy((char *)sp, CopyFrom, sizeof(SavedImage)); - - /* - * Make our own allocated copies of the heap fields in the - * copied record. This guards against potential aliasing - * problems. - */ - - /* first, the local color map */ - if (sp->ImageDesc.ColorMap != NULL) { - sp->ImageDesc.ColorMap = GifMakeMapObject( - CopyFrom->ImageDesc.ColorMap->ColorCount, - CopyFrom->ImageDesc.ColorMap->Colors); - if (sp->ImageDesc.ColorMap == NULL) { - FreeLastSavedImage(GifFile); - return (SavedImage *)(NULL); - } - } - - /* next, the raster */ - sp->RasterBits = (unsigned char *)malloc(sizeof(GifPixelType) * - CopyFrom->ImageDesc.Height * - CopyFrom->ImageDesc.Width); - if (sp->RasterBits == NULL) { - FreeLastSavedImage(GifFile); - return (SavedImage *)(NULL); - } - memcpy(sp->RasterBits, CopyFrom->RasterBits, - sizeof(GifPixelType) * CopyFrom->ImageDesc.Height * - CopyFrom->ImageDesc.Width); - - /* finally, the extension blocks */ - if (sp->ExtensionBlocks != NULL) { - sp->ExtensionBlocks = (ExtensionBlock *)malloc( - sizeof(ExtensionBlock) * - CopyFrom->ExtensionBlockCount); - if (sp->ExtensionBlocks == NULL) { - FreeLastSavedImage(GifFile); - return (SavedImage *)(NULL); - } - memcpy(sp->ExtensionBlocks, CopyFrom->ExtensionBlocks, - sizeof(ExtensionBlock) * CopyFrom->ExtensionBlockCount); - } - } - - return (sp); - } -} - -void -GifFreeSavedImages(GifFileType *GifFile) -{ - SavedImage *sp; - - if ((GifFile == NULL) || (GifFile->SavedImages == NULL)) { - return; - } - for (sp = GifFile->SavedImages; - sp < GifFile->SavedImages + GifFile->ImageCount; sp++) { - if (sp->ImageDesc.ColorMap != NULL) { - GifFreeMapObject(sp->ImageDesc.ColorMap); - sp->ImageDesc.ColorMap = NULL; - } - - if (sp->RasterBits != NULL) - free((char *)sp->RasterBits); - - GifFreeExtensions(&sp->ExtensionBlockCount, &sp->ExtensionBlocks); - } - free((char *)GifFile->SavedImages); - GifFile->SavedImages = NULL; -} - -/* end */ diff --git a/third_party/giflib/lib/quantize.c b/third_party/giflib/lib/quantize.c deleted file mode 100644 index 56ab2924a..000000000 --- a/third_party/giflib/lib/quantize.c +++ /dev/null @@ -1,330 +0,0 @@ -/***************************************************************************** - - quantize.c - quantize a high resolution image into lower one - - Based on: "Color Image Quantization for frame buffer Display", by - Paul Heckbert SIGGRAPH 1982 page 297-307. - - This doesn't really belong in the core library, was undocumented, - and was removed in 4.2. Then it turned out some client apps were - actually using it, so it was restored in 5.0. - -******************************************************************************/ - -#include -#include -#include "gif_lib.h" -#include "gif_lib_private.h" - -#define ABS(x) ((x) > 0 ? (x) : (-(x))) - -#define COLOR_ARRAY_SIZE 32768 -#define BITS_PER_PRIM_COLOR 5 -#define MAX_PRIM_COLOR 0x1f - -static int SortRGBAxis; - -typedef struct QuantizedColorType { - GifByteType RGB[3]; - GifByteType NewColorIndex; - long Count; - struct QuantizedColorType *Pnext; -} QuantizedColorType; - -typedef struct NewColorMapType { - GifByteType RGBMin[3], RGBWidth[3]; - unsigned int NumEntries; /* # of QuantizedColorType in linked list below */ - unsigned long Count; /* Total number of pixels in all the entries */ - QuantizedColorType *QuantizedColors; -} NewColorMapType; - -static int SubdivColorMap(NewColorMapType * NewColorSubdiv, - unsigned int ColorMapSize, - unsigned int *NewColorMapSize); -static int SortCmpRtn(const void *Entry1, const void *Entry2); - -/****************************************************************************** - Quantize high resolution image into lower one. Input image consists of a - 2D array for each of the RGB colors with size Width by Height. There is no - Color map for the input. Output is a quantized image with 2D array of - indexes into the output color map. - Note input image can be 24 bits at the most (8 for red/green/blue) and - the output has 256 colors at the most (256 entries in the color map.). - ColorMapSize specifies size of color map up to 256 and will be updated to - real size before returning. - Also non of the parameter are allocated by this routine. - This function returns GIF_OK if successful, GIF_ERROR otherwise. -******************************************************************************/ -int -GifQuantizeBuffer(unsigned int Width, - unsigned int Height, - int *ColorMapSize, - GifByteType * RedInput, - GifByteType * GreenInput, - GifByteType * BlueInput, - GifByteType * OutputBuffer, - GifColorType * OutputColorMap) { - - unsigned int Index, NumOfEntries; - int i, j, MaxRGBError[3]; - unsigned int NewColorMapSize; - long Red, Green, Blue; - NewColorMapType NewColorSubdiv[256]; - QuantizedColorType *ColorArrayEntries, *QuantizedColor; - - ColorArrayEntries = (QuantizedColorType *)malloc( - sizeof(QuantizedColorType) * COLOR_ARRAY_SIZE); - if (ColorArrayEntries == NULL) { - return GIF_ERROR; - } - - for (i = 0; i < COLOR_ARRAY_SIZE; i++) { - ColorArrayEntries[i].RGB[0] = i >> (2 * BITS_PER_PRIM_COLOR); - ColorArrayEntries[i].RGB[1] = (i >> BITS_PER_PRIM_COLOR) & - MAX_PRIM_COLOR; - ColorArrayEntries[i].RGB[2] = i & MAX_PRIM_COLOR; - ColorArrayEntries[i].Count = 0; - } - - /* Sample the colors and their distribution: */ - for (i = 0; i < (int)(Width * Height); i++) { - Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) << - (2 * BITS_PER_PRIM_COLOR)) + - ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) << - BITS_PER_PRIM_COLOR) + - (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); - ColorArrayEntries[Index].Count++; - } - - /* Put all the colors in the first entry of the color map, and call the - * recursive subdivision process. */ - for (i = 0; i < 256; i++) { - NewColorSubdiv[i].QuantizedColors = NULL; - NewColorSubdiv[i].Count = NewColorSubdiv[i].NumEntries = 0; - for (j = 0; j < 3; j++) { - NewColorSubdiv[i].RGBMin[j] = 0; - NewColorSubdiv[i].RGBWidth[j] = 255; - } - } - - /* Find the non empty entries in the color table and chain them: */ - for (i = 0; i < COLOR_ARRAY_SIZE; i++) - if (ColorArrayEntries[i].Count > 0) - break; - QuantizedColor = NewColorSubdiv[0].QuantizedColors = &ColorArrayEntries[i]; - NumOfEntries = 1; - while (++i < COLOR_ARRAY_SIZE) - if (ColorArrayEntries[i].Count > 0) { - QuantizedColor->Pnext = &ColorArrayEntries[i]; - QuantizedColor = &ColorArrayEntries[i]; - NumOfEntries++; - } - QuantizedColor->Pnext = NULL; - - NewColorSubdiv[0].NumEntries = NumOfEntries; /* Different sampled colors */ - NewColorSubdiv[0].Count = ((long)Width) * Height; /* Pixels */ - NewColorMapSize = 1; - if (SubdivColorMap(NewColorSubdiv, *ColorMapSize, &NewColorMapSize) != - GIF_OK) { - free((char *)ColorArrayEntries); - return GIF_ERROR; - } - if ((int)NewColorMapSize < *ColorMapSize) { - /* And clear rest of color map: */ - for (i = NewColorMapSize; i < *ColorMapSize; i++) - OutputColorMap[i].Red = OutputColorMap[i].Green = - OutputColorMap[i].Blue = 0; - } - - /* Average the colors in each entry to be the color to be used in the - * output color map, and plug it into the output color map itself. */ - for (i = 0; i < (int)NewColorMapSize; i++) { - if ((j = NewColorSubdiv[i].NumEntries) > 0) { - QuantizedColor = NewColorSubdiv[i].QuantizedColors; - Red = Green = Blue = 0; - while (QuantizedColor) { - QuantizedColor->NewColorIndex = i; - Red += QuantizedColor->RGB[0]; - Green += QuantizedColor->RGB[1]; - Blue += QuantizedColor->RGB[2]; - QuantizedColor = QuantizedColor->Pnext; - } - OutputColorMap[i].Red = (GifByteType)((Red << (8 - BITS_PER_PRIM_COLOR)) / j); - OutputColorMap[i].Green = (GifByteType)((Green << (8 - BITS_PER_PRIM_COLOR)) / j); - OutputColorMap[i].Blue = (GifByteType)((Blue << (8 - BITS_PER_PRIM_COLOR)) / j); - } - } - - /* Finally scan the input buffer again and put the mapped index in the - * output buffer. */ - MaxRGBError[0] = MaxRGBError[1] = MaxRGBError[2] = 0; - for (i = 0; i < (int)(Width * Height); i++) { - Index = ((RedInput[i] >> (8 - BITS_PER_PRIM_COLOR)) << - (2 * BITS_PER_PRIM_COLOR)) + - ((GreenInput[i] >> (8 - BITS_PER_PRIM_COLOR)) << - BITS_PER_PRIM_COLOR) + - (BlueInput[i] >> (8 - BITS_PER_PRIM_COLOR)); - Index = ColorArrayEntries[Index].NewColorIndex; - OutputBuffer[i] = Index; - if (MaxRGBError[0] < ABS(OutputColorMap[Index].Red - RedInput[i])) - MaxRGBError[0] = ABS(OutputColorMap[Index].Red - RedInput[i]); - if (MaxRGBError[1] < ABS(OutputColorMap[Index].Green - GreenInput[i])) - MaxRGBError[1] = ABS(OutputColorMap[Index].Green - GreenInput[i]); - if (MaxRGBError[2] < ABS(OutputColorMap[Index].Blue - BlueInput[i])) - MaxRGBError[2] = ABS(OutputColorMap[Index].Blue - BlueInput[i]); - } - -#ifdef DEBUG - fprintf(stderr, - "Quantization L(0) errors: Red = %d, Green = %d, Blue = %d.\n", - MaxRGBError[0], MaxRGBError[1], MaxRGBError[2]); -#endif /* DEBUG */ - - free((char *)ColorArrayEntries); - - *ColorMapSize = NewColorMapSize; - - return GIF_OK; -} - -/****************************************************************************** - Routine to subdivide the RGB space recursively using median cut in each - axes alternatingly until ColorMapSize different cubes exists. - The biggest cube in one dimension is subdivide unless it has only one entry. - Returns GIF_ERROR if failed, otherwise GIF_OK. -*******************************************************************************/ -static int -SubdivColorMap(NewColorMapType * NewColorSubdiv, - unsigned int ColorMapSize, - unsigned int *NewColorMapSize) { - - int MaxSize; - unsigned int i, j, Index = 0, NumEntries, MinColor, MaxColor; - long Sum, Count; - QuantizedColorType *QuantizedColor, **SortArray; - - while (ColorMapSize > *NewColorMapSize) { - /* Find candidate for subdivision: */ - MaxSize = -1; - for (i = 0; i < *NewColorMapSize; i++) { - for (j = 0; j < 3; j++) { - if ((((int)NewColorSubdiv[i].RGBWidth[j]) > MaxSize) && - (NewColorSubdiv[i].NumEntries > 1)) { - MaxSize = NewColorSubdiv[i].RGBWidth[j]; - Index = i; - SortRGBAxis = j; - } - } - } - - if (MaxSize == -1) - return GIF_OK; - - /* Split the entry Index into two along the axis SortRGBAxis: */ - - /* Sort all elements in that entry along the given axis and split at - * the median. */ - SortArray = (QuantizedColorType **)malloc( - sizeof(QuantizedColorType *) * - NewColorSubdiv[Index].NumEntries); - if (SortArray == NULL) - return GIF_ERROR; - for (j = 0, QuantizedColor = NewColorSubdiv[Index].QuantizedColors; - j < NewColorSubdiv[Index].NumEntries && QuantizedColor != NULL; - j++, QuantizedColor = QuantizedColor->Pnext) - SortArray[j] = QuantizedColor; - - /* - * Because qsort isn't stable, this can produce differing - * results for the order of tuples depending on platform - * details of how qsort() is implemented. - * - * We mitigate this problem by sorting on all three axes rather - * than only the one specied by SortRGBAxis; that way the instability - * can only become an issue if there are multiple color indices - * referring to identical RGB tuples. Older versions of this - * sorted on only the one axis. - */ - qsort(SortArray, NewColorSubdiv[Index].NumEntries, - sizeof(QuantizedColorType *), SortCmpRtn); - - /* Relink the sorted list into one: */ - for (j = 0; j < NewColorSubdiv[Index].NumEntries - 1; j++) - SortArray[j]->Pnext = SortArray[j + 1]; - SortArray[NewColorSubdiv[Index].NumEntries - 1]->Pnext = NULL; - NewColorSubdiv[Index].QuantizedColors = QuantizedColor = SortArray[0]; - free((char *)SortArray); - - /* Now simply add the Counts until we have half of the Count: */ - Sum = NewColorSubdiv[Index].Count / 2 - QuantizedColor->Count; - NumEntries = 1; - Count = QuantizedColor->Count; - while (QuantizedColor->Pnext != NULL && - (Sum -= QuantizedColor->Pnext->Count) >= 0 && - QuantizedColor->Pnext->Pnext != NULL) { - QuantizedColor = QuantizedColor->Pnext; - NumEntries++; - Count += QuantizedColor->Count; - } - /* Save the values of the last color of the first half, and first - * of the second half so we can update the Bounding Boxes later. - * Also as the colors are quantized and the BBoxes are full 0..255, - * they need to be rescaled. - */ - MaxColor = QuantizedColor->RGB[SortRGBAxis]; /* Max. of first half */ - /* coverity[var_deref_op] */ - MinColor = QuantizedColor->Pnext->RGB[SortRGBAxis]; /* of second */ - MaxColor <<= (8 - BITS_PER_PRIM_COLOR); - MinColor <<= (8 - BITS_PER_PRIM_COLOR); - - /* Partition right here: */ - NewColorSubdiv[*NewColorMapSize].QuantizedColors = - QuantizedColor->Pnext; - QuantizedColor->Pnext = NULL; - NewColorSubdiv[*NewColorMapSize].Count = Count; - NewColorSubdiv[Index].Count -= Count; - NewColorSubdiv[*NewColorMapSize].NumEntries = - NewColorSubdiv[Index].NumEntries - NumEntries; - NewColorSubdiv[Index].NumEntries = NumEntries; - for (j = 0; j < 3; j++) { - NewColorSubdiv[*NewColorMapSize].RGBMin[j] = - NewColorSubdiv[Index].RGBMin[j]; - NewColorSubdiv[*NewColorMapSize].RGBWidth[j] = - NewColorSubdiv[Index].RGBWidth[j]; - } - NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] = - NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] + - NewColorSubdiv[*NewColorMapSize].RGBWidth[SortRGBAxis] - MinColor; - NewColorSubdiv[*NewColorMapSize].RGBMin[SortRGBAxis] = MinColor; - - NewColorSubdiv[Index].RGBWidth[SortRGBAxis] = - MaxColor - NewColorSubdiv[Index].RGBMin[SortRGBAxis]; - - (*NewColorMapSize)++; - } - - return GIF_OK; -} - -/**************************************************************************** - Routine called by qsort to compare two entries. -*****************************************************************************/ - -static int -SortCmpRtn(const void *Entry1, - const void *Entry2) { - QuantizedColorType *entry1 = (*((QuantizedColorType **) Entry1)); - QuantizedColorType *entry2 = (*((QuantizedColorType **) Entry2)); - - /* sort on all axes of the color space! */ - int hash1 = entry1->RGB[SortRGBAxis] * 256 * 256 - + entry1->RGB[(SortRGBAxis+1) % 3] * 256 - + entry1->RGB[(SortRGBAxis+2) % 3]; - int hash2 = entry2->RGB[SortRGBAxis] * 256 * 256 - + entry2->RGB[(SortRGBAxis+1) % 3] * 256 - + entry2->RGB[(SortRGBAxis+2) % 3]; - - return hash1 - hash2; -} - -/* end */