Author: Martin Gleeson, gleeson@unimelb.edu.au.
fly is a C program that creates GIF images on the fly from CGI and other programs. Using Thomas Boutell's gd graphics library for fast GIF creation, it provides a command-file interface for creating and modifying GIF images.
Current version: 1.6.3, 22nd October 1998
Please consult one of the Fly documents below if you either want a full version or be sure to look at the latest thing !!!
Australia: | <URL:http://www.unimelb.edu.au/fly/> [Home Site] |
USA (1): | <URL:http://www.ibrado.com/fly/> |
USA (2): | <URL:http://www.w3perl.com/fly/> |
Table of (reduced) Contents
Note that the command line arguments for v1.1 and later are different from v1.0 and earlier.
The standard manner used to invoke fly is:
fly -i <input file> -o <output file>
You can omit the input file, and fly takes its directives from stdin, and if you omit the output file, the output goes to stdout.
The command file uses a number of directives. It must start with one of the following lines:
After the initial command, any of the commands below may be used.
To create more than one image from a command file, use the directive end, followed by either
Note:
Creates a line from coordinates x1,y1 to coordinates x2,y2 of colour R,G,B.
Creates a dashed line from coordinates x1,y1 to coordinates x2,y2 of colour R,G,B.
Creates a rectangle from coordinates x1,y1 to coordinates x2,y2 with edging of colour R,G,B.
Creates a filled rectangle from coordinates x1,y1 to coordinates x2,y2 filled with colour R,G,B.
Creates a square qith the top left corner at coordinates x1,y1, with side s in length, with edge of colour R,G,B.
Creates a square qith the top left corner at coordinates x1,y1, with side s in length, filled with colour R,G,B.
Creates a polygon (has to be closed) through the points
x1,y1 to x2,y2 to ... to xn,yn,
of colour R,G,B.
Note that the colour values appear before the coordinates in this
directive.
Creates a polygon (has to be closed) through the points
x1,y1 to x2,y2 to ... to xn,yn,
filled with colour R,G,B.
Note that the colour values appear before the coordinates in this
directive.
Creates an arc of colour R,G,B centered at coordinates x1,y1, of width w and height h, starting at start degrees and finishing at finish degrees.
Creates an ellipse of colour R,G,B centered at coordinates x1,y1, of width w and height h.
Creates a circle centered at coordinates x1,y1, of diameter d, filled with colour R,G,B.
Creates a circle of colour R,G,B centered at coordinates x1,y1, of diameter d.
Flood fills with the colour R,G,B from the coordinates x,y to the edge of the area of the original color of x,y.
Flood fills with colour R2,G2,B2 from x,y to the border of colour R1,G1,B1.
Writes a string starting at x,y (in the colour R,G,B), of font size <size>, where size can be one of tiny (5x8), small (6x12), medium (7x13, bold), large (8x16) or giant (9x15, bold).
Writes a string vertically starting at x,y (in the colour R,G,B), of font size <size>, where size can be one of tiny, small, medium, large or giant. The string will go up from the coordinates supplied.
Copies region x1,y1 - x2,y2 of source-filename.gif
or the GIF output of command to the coordinates x,y
of the image being created/modified.
If x1,y1,x2,y2 are all -1, copy the entire image.
Copies region x1,y1 - x2,y2 of source-filename.gif
or the GIF output of command to the area dx1,dy1 -
dx2,dy2 of the image being created/modified, resizing the
image to fit.
If x1,y1,x2,y2 are all -1, copy
the entire image.
Gets the colour index of the point at x,y.
Sets the point at x,y to the colour R,G,B.
Changes all pixels of colour R1,G1,B1 to R2,G2,B2.
Sets the current "brush" to filename.gif. Subsequent directives of line, dline, rect, poly and arc will use the selected "brush" to draw their lines, until a call of killbrush.
Turns off the brush selection. Calls to line, dline, rect, poly and arc will then use the standard single-pixel width brush.
Sets the current "tile" to filename.gif. Subsequent directives of fill, and fpoly will use the selected "tile" as a fill pattern, until a call of killtile.
Turns off the tile selection. Calls to fill, filltoborder and fpoly will then use the specified colour for fills.
Various line calls can use a style, specified by one or more colour settings for each pixel, that is repeated for the length of the "line". All subsequent directives of line, dline, rect, poly and arc will use the selected "style" to draw their lines, until a call of killstyle.
Turns off the style selection. Calls to line, dline, rect, poly and arc will then use the standard single-pixel width brush.
Makes the colour R,G,B the transparent colour.
Returns the width of the image in pixels.
Returns the height of the image in pixels.
Rotates the GIF image deg degrees clockwise, where deg is 90, 180 or 270.
Makes the image output by fly an interlaced GIF.
At any point in the command file, you can insert a comment line starting with "#".
Example:
new size 256,256 # # start with a background fill fill 1,1,255,255,255 # # then a circle in the middle circle 128,128,180,0,0,0 # etc.
If you are using fly from within a CGI program, here are some examples:
#!/usr/local/bin/perl $flyprog = "/usr/local/bin/fly"; $outfile = "temp.gif"; open(FLY,"| $flyprog -o $outfile "); print FLY "new\n"; print FLY "size 256,256\n"; print FLY "fill 1,1,255,255,255\n"; print FLY "circle 128,128,180,0,0,0\n"; print FLY "fill 128,128,255,255,0\n"; print FLY "arc 128,128,120,120,0,180,0,0,0\n"; print FLY "circle 96,96,10,0,0,0\n"; print FLY "circle 160,96,10,0,0,0\n"; print FLY "fill 96,96,0,0,0\n"; print FLY "fill 160,96,0,0,0\n"; close(FLY);
#!/bin/csh # test out fly! cat > /tmp/fly.$$ <<EOD new size 256,256 fill 1,1,255,255,255 circle 128,128,180,0,0,0 fill 128,128,255,255,0 arc 128,128,120,120,0,180,0,0,0 circle 96,96,10,0,0,0 circle 160,96,10,0,0,0 fill 96,96,0,0,0 fill 160,96,0,0,0 EOD fly -i /tmp/fly.$$ -o test.gif
You can even create your own fly "scripts"!
#!/usr/local/bin/fly -q new size 256,256 fill 1,1,255,255,255 <etc>
Thanks to Andrew Finkenstadt <andyf@simutronics.com> for noting this unintentional feature of fly.
Can you guess what the above examples produce? Here's the answer!
I have created a Fly Tester CGI program that lets you test fly commands quickly in a convenient interface. The program is also included in the fly distribution.
Let me know if you're using fly - send email to gleeson@unimelb.edu.au.
If you experience any problems compiling or using fly, let me know, and please include a copy of the errors that appear on the screen.
If you'd like to see a particular feature included in fly that's not already there, just drop me a note with the details.
A selection of web sites using fly:
I've set up two mailing list for users of fly: fly-users is a general discussion list for users of fly, and fly-announce is for important announcements, including updates and new versions of fly.
To subscribe, send a message to majordomo@pixel.its.unimelb.edu.au with no subject, and one (or both) of the following lines in the body of the message:
subscribe fly-users
subscribe fly-announce
Searchable archives of these lists are available at: <URL:http://pixel.its.unimelb.edu.au/%7Egleeson/ma/fly/>.
I'm currently porting fly to the Macintosh. It will be an XCMD that can be used from Hypercard, MacPerl, Frontier (I think), and anything else that can use XCMDs or XFCNs.
If you're using fly with perl on Windows NT or Windows 95, this may be of interest to you: From: http://www.activestate.com/support/faqs/win32/perlwin32faq7.html
7.3. How do I return a graphics file from a CGI script? One of the big differences between UNIX and Win32 platforms is that on Win32 there's a difference between text or ASCII files and binary file. To return a graphics file, you need to specify that the file is a binary file, and that the standard output stream should accept binary data. Try something like this: $MY_FILE_NAME = 'Penelope.jpg'; $CHUNK_SIZE = 4096; open( MY_FILE, "<$MY_FILE_NAME" ) or die( "Can't open $MY_FILE_NAME: $!\n" ); print "Content-type: image/jpeg\r\n"; print "\r\n"; binmode( MY_FILE ); # These are crucial! binmode( STDOUT ); while ( $cb = read( MY_FILE, $data, $CHUNK_SIZE ) ) { print $data; } close( MY_FILE );
Claus Hofmann <claush@ipfr.bau-verm.uni-karlsruhe.de> - see release notes for v0.95b.
John Bowe <bowe@osf.org> - better Makefile, argument parsing, quiet mode, comment lines, and other suggestions.
Jean-Louis Damez <F1NZC@amsat.org> - Compilation of the Windows NT/95 version.
Laurent Domisse <domisse@credm.com> - Compilation of the RPC-SA version and hosting the European mirror.
Tam Siu Lung <sltam@sn1.speednet.net> - see release notes for v1.5.0.
Jukka Manner <jukka.manner@capgemini.fi> - Code improvements and bug fixes - see release notes for v1.5.0.
Alex Ibrado <alex@ibrado.com> - Compilation of the BSDI version and hosting the US mirror.
Eric Turenne <Eric.Turenne@cum.qc.ca> - Compilation of the Solaris 2.5.1 version.
Peter Fosseus <peter@quantum.co.za> - Compilation of the SCO version.
John Mitchell <johnm@magnet.com> - Bug fix for get_image routine.
Henrik S. Christensen <hc@dde.dk> - Bug fix for argument type to gdImageString and gdImageStringUp;
Igor Bilyi <igor@natali.cz> - Compilation of the OS/2 version.
Ariel Faigon <ariel@sgi.com> - Makefile correction.
Shoji Mori <mori@moriken.com> - Fix for Win32 binmode problem.
Geraint Edwards <gedge@inner.demon.co.uk> - Compilation of the FreeBSD version.
Minor additional feature: any pair of diametrically opposite vertices in any order will now be accepted for rect and frect.
Minor bug fix - some return codes in case of fatal errors were 0
when they should have been 1.
Addition of code for win32 binmode
problem. (thanks to Shoji Mori <mori@moriken.com>)
Minor bug fixes - get_image routine (thanks to John Mitchell <johnm@magnet.com>) and argument type to gdImageString and gdImageStringUp (thanks to Henrik S. Christensen <hc@dde.dk>)
New Commands:
ellipse - draw an ellipse, specifying origin, width and
height.
colourchange - change a colour in the GIF to another
colour.
rotate - rotate the GIF 90, 180 or 270 degrees.
Change: Now uses GD version 1.3. This fixes the long-standing filled polygon bug. GD 1.3 also includes a change to the method of GIF encoding (from LZW to Run Length Encoding) to avoid copyright problems with the LZW algorithm. The effect of this is that images produced by fly will be larger than they used to be. GD 1.3 also includes a number of other changes that won't affect fly users.
Bug fix: Wouldn't terminate if there was an 'end' directive at the very end of the input file (i.e. not followed by a 'new' or 'existing' directive). Thanks to Harold Kloosterhof <haroldkl@stack.nl> and Chris (PGP key ID 0xC0DED00D) for reporting this bug.
Bug fix: The 'copy' and 'copyresized' bug fix of version 1.5.0 had caused another bug - 'copy' was leaving a one-pixel-wide line along the left and bottom edges of the destination region.
Bug fix: Fly would hang if there was one space after a 'new' directive. Thanks to Mark Heath <mheath@netspace.net.au> for reporting this bug.
Bug fix: Problems with string commands on some platforms. Thanks to Rende Luitjes <Rende.Luitjes@digital.com> for reporting this bug.
Minor code changes: move some #defines to beginning of lines, some pointer naming changes, moving code to make verbose output more meaningful for string directives. Thanks to Rende Luitjes <Rende.Luitjes@digital.com> for suggesting the changes.
Bug fix: a line of code had gone MIA! Only affected the copy and copyresized functions.
Removed modification of opening stdout in binary mode as it didn't work on most operating systems.
New Feature:
With the copy and copyresized directives,
you can now use the output of a command instead of a filename
to import a GIF. For example:
copy 10,20,-1,-1,-1,-1,`ppmtogif image.ppm`
This feature kindly provided by Ian Reid <ian@robots.ox.ac.uk>
Modification: Open stdout in explicit binary mode when writing gif to stdout (for Windows NT/95 which stupidly defaults to ascii for stdout). Thanks to Andrew Rivett <andrew@infopreneur.net>
Bug fix: when using copy and copyresized, area would be one pixel short on right and bottom sides if not using the -1,-1,-1,-1 coordinates. Thanks to Tam Siu Lung <sltam@sn1.speednet.net> for reporting this bug.
Bug fix: was erroneously allowing filltoborder to be used with settile. Thanks to Jukka Manner <jukka.manner@capgemini.fi> for reporting this bug.
Bug fix: error when using copyresized with -1,-1,-1,-1 coordinates.
Bug fix: fixed fatal error on Solaris when sending output to stdout.
- Multiple GIFs from the one command file - use the new end
command
- New commands: getpixel returns the colour index of a pixel;
square and fsquare draw a square or filled square;
fcircle draws a filled circle;
- Some extra examples in the file examples/test.fly
- verbose output now goes to stderr rather than stdout only
when gif output goes to stdout.
Bug fix: fly -h wouldn't work due to uninitialised filehandle.
Addition of comment lines and bug fixes, both contributed by John Bowe
<bowe@osf.org>:
- verbose output now goes to stderr rather than stdout.
- bad first line caused core dump.
Addition of circle directive, and more examples (incl. CGI).
Bug fix: first string directive interpreted as stringup directive on some platforms.
Various bug fixes for platform-specific peculiarities (BSDI, SunOS, HP/UX).
Bugfix for quiet mode: copy and copyresized were talking when they shouldn't.
Release version, including support for 5 font sizes in string.
Better Makefile (thanks to John Bowe), takes into account if you already have gd installed.
Changed a calloc to a malloc due to BSDI problem.
Miscellaneous bug fixes.
Fixed major bug in polygon code.
Additions contributed by Claus Hofmann <claush@ipfr.bau-verm.uni-karlsruhe.de>
1. Added support for gdImageSX, gdImageSY. 2. Added support for gdSetBrush.
Added support for gdCopyResized, for copying and scaling.
1. Added support for gdImageString, to enable writing of strings, in
small or large fonts, onto GIFs created by fly.
2. Changed write out command to support OS/2
Thanks to Andreas Rudolf <rudolf@vnet.ibm.com>
Fixed problem reading from stdin
Thanks to Nick Kennedy <nbk@ariel.its.unimelb.edu.au>
First Release.
fly is copyright 1995-1998, The University of Melbourne. Permission is granted to copy and distribute this work provided that this notice remains intact. Credit for using this program must be given to both The University of Melbourne and the Quest Protein Database Center, Cold Spring Harbor Labs, in all derived works. This does not affect your ownership of the derived work itself, and the intent is to assure proper credit for The University of Melbourne and Quest, not to interfere with your use of fly or gd.
("Derived works" includes all programs that utilize fly or the gd library. Credit must be given in user-visible documentation.)
If you want to mirror this page, ask for my permission first.
Created: 21 June 1995 Last modified: 4 November 1998 Access: Unrestricted. Copyright © 1995-1998 The University of Melbourne. <URL:http://www.unimelb.edu.au/fly/fly.html>
Martin Gleeson, gleeson@unimelb.edu.au |