Tk Handler for the GFP format
In a Tk programming project, I wanted to include a bitmap image. I
didn't want to depend on an external file (of which I also had to
be sure about its location), but wanted to read the image data from
a TCL string, which I could just include in the source file.
But as of Version 4.1, there is still no image handler able to
read its data from a string. Both the handlers for PPM an GIF files
only read from a file. In the latter case, this is further complicated
by the fact that GIF files use NUL bytes for encoding, which is
impossible in a TCL string (because a NUL terminates the string).
But still, I decided to go for the GIF format. It does not support
truecolor, but 256 colors are enough for usual applications and
especially for my purposes. And of course it has the major advantage
of being much smaller in size than PPM.
So I redefined the GIF format very slightly so that it could be handled
as a string (further details below), resulting in the GFP image
format. Then I patched the original GIF handler so that it was able to
handle my changes and read data from a string. I've also written a
little conversion program that simply reads a GIF file and produces a
TCL string definition (set image_string {...}
).
Compilation and Integration
Integration into the standard distribution
You will probably want to integrate the new code into the standard Tk
distribution files, so that a new wish will feature the the added
capabilities. But if your application has a C body anyway, you should
add the new code to your project instead, to avoid compatibility problems
if you forget about this addition and try to move your code into an
environment where Tk misses the new features. This possibility is
described below.
These steps describe the integration into the Unix version of tk4.1.
- Move the source file,
tkImgGFP.c
to the
generic
subdirectory of the Tk distribution
directory.
- Change to the Tk distribution root directory and apply the
patch:
patch -p1 < patch-tk4.1-GFP
- (re)run configure
- (re)run make
- (re)run make install
Integration into your own packages
Integrating GFP support into your own C applications, so that TCL/Tk
scripts from within your application can use the feature, is similarly
simple:
- Add the source file,
tkImgGFP.c
to your
project and its Makefile. You may have to edit its #include
files section to suit your project.
- In your initialization function, after Tk_Init has been called,
add the following declaration and statement (move the declaration
to the beginning of the function, of course):
extern Tk_PhotoImageFormat tkImgFmtGFP;
Tk_CreatePhtotoImageFormat (&tkImgFmtGFP);
Building as a loadable module
Should be possible.
Using the GIF to GFP converter
After compiling the standalone program gif2gfp
from its
source file gif2gfp.c
, use it as follows:
gif2gfp NameOfString < gif_file > tcl_file
This reads the given GIF file, converts it, and writes the output as a
TCL string definition to tcl_file
. You can now source this
file from your TCL code (or merge the file with your code, as I do);
this defines the TCL string NameOfString
.
Displaying GFP files
After sourcing the file (or after the definition has been executed
within your code), you can use the image create command to
read in the string. Afterwards, use the label widget (there
are also a few other widgets accepting images) to display it. This
sample reads the string created in the sample above and displays it
in the toplevel window.
image create photo NameOfImage -data $NameOfString
label .image -image NameOfImage
pack .image
License
I don't claim any copyrights for my changes to the code. All credit must
go to Reed Wade, the original author. Look at the top of the source file
for his license terms.
Hope you enjoy this piece of code. Oh yes, I almost forgot:
Here it is.
Note:
I have contributed this source code in a mail to Mr. Ousterhout.
I haven't got any response so far, so I believe it might take a
while until this code is integrated into the default Tk distribution,
if at all.
The GFP Image format
GFP files are nothing really new. It's just a slightly modified
GIF format, imagined solely for this purpose. There's no need whatsoever
to make graphics viewers accept this format :-) Here is a complete list
of differences:
- A Magic of GFP87a and GFP89a (instead of
GIF87a and GIF89a.
- All 000 (NUL) bytes are replaced by the sequence 001 001 (two
bytes)
- All 001 bytes are replaced by the sequence 001 002
- All 040 (space) bytes are replaced by the sequence 001 041
The latter is done so that you can break the string across multiple
lines for better "readability" (some editors might choke if they find
a single line of length 10000), and a line break (backslash-return) is
replaced by a space character.
In addition, the converter escapes certain characters.
If you edit the definition at the beginning of a gif2gfp
generated file, you could also include it into C code (where it would
require even less storage memory than in a TCL file) (caution: most
C compilers have an upper string length limit).
Frank Pilhofer
<fp -AT- fpx.de>
Back to the Homepage
Last modified: Fri Mar 15 11:06:22 1996