February 1998 Programmer's Challenge
Image Decoder
Mail solutions to:
progchallenge@mactech.com
Due Date: 11:59PM, ET, 1 February 1998
This month's Challenge is much easier to state than it will be to
implement. Your task this month is to write a decoder for Graphics
Interchange Format images. GIF is a data stream-oriented file format
used to define the transmission protocol of LZW-encoded bitmap data.
Your code will read a file containing a GIF and draw the image in an
offscreen graphics world. There are two versions of the GIF
specification; this Challenge includes only the earlier and more
common GIF87a format, not the GIF89a format. The format description
is too long to include here, but you can find the GIF87a
specification at:
<ftp://ftp.ncsa.uiuc.edu/misc/file.formats/graphics.formats/gif87a.doc>
Other useful information on graphics formats in general is
available at:
<http://www.cis.ohio-state.edu/hypertext/faq/usenet/graphics/fileformats-faq/top.html>
The prototype for the code you should write is:
#include <QDOffscreen.h>
#include <stdio.h>
GWorldPtr ReadImage(FILE *inputFile);
The inputFile will have been opened for you in binary mode by the
calling routine. ReadImage should read and parse the image, create a
GWorld with the appropriate color table, draw the image in the
GWorld, and return a GWorld pointer to the calling routine. The
solution that correctly decodes a variety of images in the least
amount of execution time will be the winner.
I thought for some time about the Compuserve / Unisys / LZW patent
controverty before selecting this topic for the Challenge. The LZW
algorithm used in GIF compression is patented by Unisys, and Unisys
requires that any commercial software product that uses this
algorithm, including software that reads GIF images, requires a
license from Unisys. Freely distributed software does not require a
license. Since the Challenge doesn't result in a software product,
much less a commercial product, I decided to go ahead with this
exploration of decoding efficiency.
This will be a native PowerPC Challenge, using the latest
CodeWarrior environment. Solutions must be coded in C, C++, or
Pascal. This Challenge was suggested by Peter Lewis, who earns 2
Challenge points for the suggestion.
|