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