123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- #include <u.h>
- #include <libc.h>
- #include <draw.h>
- #include <memdraw.h>
- #include <ctype.h>
- #include <bio.h>
- #include "imagefile.h"
- void
- usage(void)
- {
- fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
- exits("usage");
- }
- #define UNSET (-12345678)
- void
- main(int argc, char *argv[])
- {
- Biobuf bout;
- Memimage *i, *ni;
- int fd, j, dt, trans, loop;
- char buf[256];
- char *err, *comment, *s;
- comment = nil;
- dt = -1;
- trans = -1;
- loop = UNSET;
- ARGBEGIN{
- case 'l':
- s = ARGF();
- if(s==nil || (!isdigit(s[0]) && s[0]!='-'))
- usage();
- loop = atoi(s);
- break;
- case 'c':
- comment = ARGF();
- if(comment == nil)
- usage();
- break;
- case 'd':
- s = ARGF();
- if(s==nil || !isdigit(s[0]))
- usage();
- dt = atoi(s);
- break;
- case 't':
- s = ARGF();
- if(s==nil || !isdigit(s[0]))
- usage();
- trans = atoi(s);
- if(trans > 255)
- usage();
- break;
- default:
- usage();
- }ARGEND
- if(Binit(&bout, 1, OWRITE) < 0)
- sysfatal("Binit failed: %r");
- memimageinit();
- err = nil;
- if(argc == 0){
- i = readmemimage(0);
- if(i == nil)
- sysfatal("reading input: %r");
- ni = memonechan(i);
- if(ni == nil)
- sysfatal("converting image to RGBV: %r");
- if(i != ni){
- freememimage(i);
- i = ni;
- }
- err = memstartgif(&bout, i, -1);
- if(err == nil){
- if(comment)
- err = memwritegif(&bout, i, comment, dt, trans);
- else{
- snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
- err = memwritegif(&bout, i, buf, dt, trans);
- }
- }
- }else{
- if(loop == UNSET){
- if(argc == 1)
- loop = -1; /* no loop for single image */
- else
- loop = 0; /* the default case: 0 means infinite loop */
- }
- for(j=0; j<argc; j++){
- if(argv[j][0] == '-' && argv[j][1]=='d'){
- /* time change */
- if(argv[j][2] == '\0'){
- s = argv[++j];
- if(j == argc)
- usage();
- }else
- s = &argv[j][2];
- if(!isdigit(s[0]))
- usage();
- dt = atoi(s);
- if(j == argc-1) /* last argument must be file */
- usage();
- continue;
- }
- fd = open(argv[j], OREAD);
- if(fd < 0)
- sysfatal("can't open %s: %r", argv[j]);
- i = readmemimage(fd);
- if(i == nil)
- sysfatal("can't readimage %s: %r", argv[j]);
- close(fd);
- ni = memonechan(i);
- if(ni == nil)
- sysfatal("converting image to RGBV: %r");
- if(i != ni){
- freememimage(i);
- i = ni;
- }
- if(j == 0){
- err = memstartgif(&bout, i, loop);
- if(err != nil)
- break;
- }
- if(comment)
- err = memwritegif(&bout, i, comment, dt, trans);
- else{
- snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
- err = memwritegif(&bout, i, buf, dt, trans);
- }
- if(err != nil)
- break;
- freememimage(i);
- comment = nil;
- }
- }
- memendgif(&bout);
- if(err != nil)
- fprint(2, "togif: %s\n", err);
- exits(err);
- }
|