libgd 2.0 / HISTORY

990718 Thomas Boutell (TBB)

Incorporated Greg Roelofs' superior PNG read and write routines.

990715 Thomas Boutell (TBB)

Removed all GIF capability in favor of PNG
in order to remove any possible LZW patent concerns.

990701 Philip Warner (pjw) as documented by TBB

Implemented gdImageSink (missing in initial 1.5 release),
renamed all new source files to have a gd_ prefix.

990628 Thomas Boutell (TBB)

Removed all C++ style comments for broader compatibility.

990310 Philip Warner (pjw)
--------------------------

Broke gd.c into multiple files; gd.c now has graphics operations, and gd_<zzz> has specific
support for different formats (eg. GD, GD2, GIF).

Restructured I/O so that reading from files/streams/anything is now possible. All handled
through the IOCtx record which must define some basic I/O services. All services are defined
for files, but only some are defined for in-memory pointers. The in-memory pointer 
implementation is primarily for Perl compatibility. Changed basically involved writing some 
low level IO routines, and relpacing most FILE* variables with IOCtx*.

Added gdImageGdPtr, gdImageGd2Ptr, gdImageGifPtr, gdImageLzwPtr for Perl compatibility.

Broke up the GIF handling routines; gd_gif_in.c does all GIF input (this did not change when
support for LZW compression was removed). gd_gif_out.c not handles the miGif compression that
was introduced in version 1.3

Reinstated LZW support through the gdImageLzw function (defined in gd_lzw_out.c). 
This is NOT built by default, and the header file must be modified to include it in the build.

Added 'GD2' support. This is a zlib-compressed internal format useful for extracting portions
of images without having to read entire image files. Informal tests suggest it is only 30% slower
than the old GD format, and file space requirements are similar to GOF. The GD2 header fields 
now contain version information, so the format can probably be considered stable across versions.

Various other functions also added (see index.html).

Informal Tests
--------------

pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t064.gd2 100 3000 2000 400 300
Extracting 100 times from (3000, 2000), size is 400x300
23 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t128.gd2 100 3000 2000 400 300
Extracting 100 times from (3000, 2000), size is 400x300
19 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t256.gd2 100 3000 2000 400 300
Extracting 100 times from (3000, 2000), size is 400x300
33 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t512.gd2 100 3000 2000 400 300
Extracting 100 times from (3000, 2000), size is 400x300
65 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t064.gd2 100 3000 2000 200 100
Extracting 100 times from (3000, 2000), size is 200x100
8 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t128.gd2 100 3000 2000 200 100
Extracting 100 times from (3000, 2000), size is 200x100
8 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t256.gd2 100 3000 2000 200 100
Extracting 100 times from (3000, 2000), size is 200x100
16 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t512.gd2 100 3000 2000 200 100
Extracting 100 times from (3000, 2000), size is 200x100
59 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t064.gd2 100 3000 2000 800 600
Extracting 100 times from (3000, 2000), size is 800x600
71 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t128.gd2 100 3000 2000 800 600
Extracting 100 times from (3000, 2000), size is 800x600
70 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t256.gd2 100 3000 2000 800 600
Extracting 100 times from (3000, 2000), size is 800x600
86 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t512.gd2 100 3000 2000 800 600
Extracting 100 times from (3000, 2000), size is 800x600
160 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ls -lrt t*.gd2
-rw-r--r--   1 pjw      users     1363301 Mar 10 12:03 t512.gd2
-rw-r--r--   1 pjw      users     1339003 Mar 10 12:06 t256.gd2
-rw-r--r--   1 pjw      users     1323925 Mar 10 12:09 t128.gd2
-rw-r--r--   1 pjw      users     1492096 Mar 10 12:12 t064.gd2
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t064.gd2 100 3000 2000 50 25
Extracting 100 times from (3000, 2000), size is 50x25
4 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t128.gd2 100 3000 2000 50 25
Extracting 100 times from (3000, 2000), size is 50x25
2 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t256.gd2 100 3000 2000 50 25
Extracting 100 times from (3000, 2000), size is 50x25
4 seconds to extract (& destroy) 100 times
pjw@Acheron:/home/pjw/work/gd1.3pjw > ./gd2time t512.gd2 100 3000 2000 50 25
Extracting 100 times from (3000, 2000), size is 50x25
15 seconds to extract (& destroy) 100 times
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.