Update giflib to a submodule

This commit is contained in:
David Capello 2017-10-02 12:24:56 -03:00
parent c3bc7acb4d
commit 6c79855e8c
22 changed files with 5 additions and 5480 deletions

3
.gitmodules vendored
View File

@ -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

View File

@ -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()

1
third_party/giflib vendored Submodule

@ -0,0 +1 @@
Subproject commit 39b32b876e42d627dce4c61c82b639028a8f11e0

View File

@ -1,36 +0,0 @@
Michael Brown <michael_brown_uk[AT]hotmail.com>
callbacks to write data via user defined function
Daniel Eisenbud <eisenbud[AT]google.com>
Fixes for crashes with invalid gif files and double freeing of
colormaps
Gershon Elber <gershon[AT]cs.technion.sc.il>
original giflib code
Marc Ewing <marc[AT]redhat.com>
spec file (for rpms) updates
Toshio Kuratomi <toshio[AT]tiki-lounge.com>
uncompressed gif writing code
autoconf/automake process
former maintainer
marek <marwaw[AT]users.sourceforge.net>
Gif initialization fix
windows build code
Peter Mehlitz <peter[AT]transvirtual.com>
callbacks to read data from arbitrary sources (like libjpeg/libpng)
Dick Porter <dick[AT]cymru.net>
int/pointer fixes for Alpha
Eric Raymond <esr[AT]snark.thyrsus.com>
current as well as long time former maintainer of giflib code
Petter Reinholdtsen <pere[AT]hungry.com>
Tru64 build fixs
Georg Schwarz <geos[AT]epost.de>
IRIX fixes

View File

@ -1,2 +0,0 @@
Please report BUGS to the bug tracker on sourceforge:
http://sourceforge.net/tracker/?group_id=102202

View File

@ -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)

View File

@ -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.

View File

@ -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 <toshio@tiki-lounge.com> - r94
* Sync with libungif r93.
* ChangeLog: Update to r92.
* NEWS: Update with combined libungif/giflib changes.
2005-10-09 Toshio Kuratomi <toshio@tiki-lounge.com> - r92
* lib/gif_lib.h: Change GifPrefixType to unsigned.
2005-10-09 Toshio Kuratomi <toshio@tiki-lounge.com> - r91
* ChangeLog: Update to r90.
* NEWS: Update on GBA and Windows fixes.
2005-10-06 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r86
* Sync with libungif r85.
2005-09-27 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r79
* gif2iris.c: Fixes from Georg Schwarz <geos[AT]epost.de>.
- stdlib.h is available and needs to be included on IRIX.
- ColorMapSize was being set from non-existent variables.
2004-05-29 Toshio Kuratomi <toshio@tiki-lounge.com> - r76
* Sync with libungif-4.1.3.
2004-05-29 Toshio Kuratomi <toshio@tiki-lounge.com> - r74
* ChangeLog, prop=lastlog: Sync with the subversion logs.
2004-05-29 Toshio Kuratomi <toshio@tiki-lounge.com> - r73
* test-unx: Add a test of extension code.
* lib/egif_lib.c: Remove a debugging statement
2004-05-29 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r71
* ChangeLog, prop=lastlog: Sync the ChangeLog for the release.
2004-05-29 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r67
* Clean up some typos.
2004-05-25 Toshio Kuratomi <toshio@tiki-lounge.com> - r66
* Sync with libungif-4.1.2.
2004-03-03 Toshio Kuratomi <toshio@tiki-lounge.com> - r64
Last minute updates to the release notes in various files.
2004-03-03 Toshio Kuratomi <toshio@tiki-lounge.com> - r63
* Set property lastlog to remind me when I last synced the ChangeLog
2004-03-03 Toshio Kuratomi <toshio@tiki-lounge.com> - r62
* ChangeLog: Update
2004-03-03 Toshio Kuratomi <toshio@tiki-lounge.com> - r61
* configure.ac: Bump version to 4.1.2
2004-02-22 Toshio Kuratomi <toshio@tiki-lounge.com> - r59
* configure.ac, lib/Makefile.am: Bump version. Forgot to do this for 4.1.1...
2004-02-22 Toshio Kuratomi <toshio@tiki-lounge.com> - r58
* TODO: Take out -Wall as that's all ready now.
2004-02-22 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r45
* README: add varargs to the deprecation list
2004-02-20 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r37
Deprecation notes
2004-02-19 Toshio Kuratomi <toshio@tiki-lounge.com> - r36
Add notes about security things to do and giflib syncing
2004-02-18 Toshio Kuratomi <toshio@tiki-lounge.com> - 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 <toshio@tiki-lounge.com> - r31
Add config.h include to gif_hash.c
2004-02-17 Toshio Kuratomi <toshio@tiki-lounge.com> - r30
Sync up with libungif 4.1.1
2004-02-17 Toshio Kuratomi <toshio@tiki-lounge.com> - r26
Updated ChangeLog
2004-02-17 Toshio Kuratomi <toshio@tiki-lounge.com>
* Updated libungif.spec to look more like fedora core spec
* Updated version numbers in all files
2004-02-17 Toshio Kuratomi <toshio@tiki-lounge.com>
* 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 <toshio@tiki-lounge.com>
* util/gif2iris.c, util/gif2rle.c, util/gifinfo.c: Fix problems with fprintf error statements in the utils
2004-02-16 Toshio Kuratomi <toshio@tiki-lounge.com>
Add DEVELOPERS file to the distribution.
2004-02-16 Toshio Kuratomi <toshio@tiki-lounge.com>
* 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 <toshio@tiki-lounge.com>
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 <toshio@tiki-lounge.com>
Added libgetarg.a to the ignore list.
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com>
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 <toshio@tiki-lounge.com>
* Remove INSTALL file as it's autogenerated.\n* Add stamp-h1 to ignored files
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com>
Additional adds and deletes to make version 4.1.0b1
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com>
Import of version 4.1.0b1
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r10
Import giflib 4.1.0
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r9
Copy the 4.1.0 libungif release to be the base of the 4.1.0 giflib release.
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r7
Release 4.1.0
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r6
Import of version 4.1.0
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r5
Set ignore patterns on the project directories.
2004-02-15 Toshio Kuratomi <toshio@tiki-lounge.com> - r3
Remove a Makefile.in that was left in in the first commit.
2004-02-14 Toshio Kuratomi <toshio@tiki-lounge.com> - r2
Commit revision 3.1.0 to subversion
2004-02-14 Toshio Kuratomi <toshio@tiki-lounge.com> - r1
Initial SVN Repository Layout
2000 6 Feb Toshio Kuratomi <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <michael@arrakeen.demon.co.uk>
* Lots of 'const' qualifiers added, thanks Alexis
Wilke for finding these.
1999 22 Mar Michael R Brown <michael@arrakeen.demon.co.uk>
* 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 <michael@arrakeen.demon.co.uk>
* 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 <michael@arrakeen.demon.co.uk>
* 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 <badger@prtr-13.ucsc.edu>
* Release 4.1.0
1999 09 Feb Toshio Kuratomi <badger@prtr-13.ucsc.edu>
* 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 <michael@arrakeen.demon.co.uk>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* lib/dgif_lib.c: (DGifSlurp) Fix a Seg Fault when an image contains
no extension blocks.
1998 14 Dec Toshio Kuratomi <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* test-unx: Add a test for DGifSlurp and EGifSpew
1998 14 Oct Toshio Kuratomi <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* libungif.spec: Fix wrong version in %files and %install section.
1998 8 Sep Toshio Kuratomi <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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 <badger@prtr-13.ucsc.edu>
* 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.

View File

@ -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 <esr@snark.thyrsus.com>. 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.

View File

@ -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.

View File

@ -1,3 +0,0 @@
= GIFLIB TODO list =
Currently empty.

View File

@ -1,124 +0,0 @@
/* Define to 1 if you have the <dlfcn.h> 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 <fcntl.h> header file. */
#cmakedefine HAVE_FCNTL_H ${HAVE_FCNTL_H}
/* Define to 1 if you have the <gl/gl.h> header file. */
#cmakedefine HAVE_GL_GL_H ${HAVE_GL_GL_H}
/* Define to 1 if you have the <inttypes.h> 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 <memory.h> header file. */
#cmakedefine HAVE_MEMORY_H ${HAVE_MEMORY_H}
/* Define to 1 if you have the <rle.h> header file. */
#cmakedefine HAVE_RLE_H ${HAVE_RLE_H}
/* Define to 1 if you have the <stdarg.h> header file. */
#cmakedefine HAVE_STDARG_H ${HAVE_STDARG_H}
/* Define to 1 if you have the <stdint.h> header file. */
#cmakedefine HAVE_STDINT_H ${HAVE_STDINT_H}
/* Define to 1 if you have the <stdlib.h> 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 <strings.h> header file. */
#cmakedefine HAVE_STRINGS_H ${HAVE_STRINGS_H}
/* Define to 1 if you have the <string.h> header file. */
#cmakedefine HAVE_STRING_H ${HAVE_STRING_H}
/* Define to 1 if you have the <sys/stat.h> header file. */
#cmakedefine HAVE_SYS_STAT_H ${HAVE_SYS_STAT_H}
/* Define to 1 if you have the <sys/types.h> 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 <unistd.h> 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 <varargs.h> 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 <X11/Xlib.h> header file. */
#cmakedefine HAVE_X11_XLIB_H ${HAVE_X11_XLIB_H}
/* Define to 1 if you have the <X11/Xutil.h> 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}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,97 +0,0 @@
/*****************************************************************************
gif_err.c - handle error reporting for the GIF library.
****************************************************************************/
#include <stdio.h>
#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 */

View File

@ -1,252 +0,0 @@
/*****************************************************************************
gif_font.c - utility font handling and simple drawing for the GIF library
****************************************************************************/
#include <string.h>
#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 */

View File

@ -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 <unistd.h>
#endif
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#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 */

View File

@ -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 <unistd.h>
#endif
#include <stdint.h>
#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 */

View File

@ -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 <stddef.h>
#ifdef HAVE_STDBOOL_H
#include <stdbool.h>
#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 */

View File

@ -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 */

View File

@ -1,401 +0,0 @@
/*****************************************************************************
GIF construction tools
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#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 */

View File

@ -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 <stdlib.h>
#include <stdio.h>
#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 */