togif.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. #include <memdraw.h>
  5. #include <ctype.h>
  6. #include <bio.h>
  7. #include "imagefile.h"
  8. void
  9. usage(void)
  10. {
  11. fprint(2, "usage: togif [-l loopcount] [-c 'comment'] [-d Δt (ms)] [-t transparency-index] [file ... [-d Δt] file ...]\n");
  12. exits("usage");
  13. }
  14. #define UNSET (-12345678)
  15. void
  16. main(int argc, char *argv[])
  17. {
  18. Biobuf bout;
  19. Memimage *i, *ni;
  20. int fd, j, dt, trans, loop;
  21. char buf[256];
  22. char *err, *comment, *s;
  23. comment = nil;
  24. dt = -1;
  25. trans = -1;
  26. loop = UNSET;
  27. ARGBEGIN{
  28. case 'l':
  29. s = ARGF();
  30. if(s==nil || (!isdigit(s[0]) && s[0]!='-'))
  31. usage();
  32. loop = atoi(s);
  33. break;
  34. case 'c':
  35. comment = ARGF();
  36. if(comment == nil)
  37. usage();
  38. break;
  39. case 'd':
  40. s = ARGF();
  41. if(s==nil || !isdigit(s[0]))
  42. usage();
  43. dt = atoi(s);
  44. break;
  45. case 't':
  46. s = ARGF();
  47. if(s==nil || !isdigit(s[0]))
  48. usage();
  49. trans = atoi(s);
  50. if(trans > 255)
  51. usage();
  52. break;
  53. default:
  54. usage();
  55. }ARGEND
  56. if(Binit(&bout, 1, OWRITE) < 0)
  57. sysfatal("Binit failed: %r");
  58. memimageinit();
  59. err = nil;
  60. if(argc == 0){
  61. i = readmemimage(0);
  62. if(i == nil)
  63. sysfatal("reading input: %r");
  64. ni = memonechan(i);
  65. if(ni == nil)
  66. sysfatal("converting image to RGBV: %r");
  67. if(i != ni){
  68. freememimage(i);
  69. i = ni;
  70. }
  71. err = memstartgif(&bout, i, -1);
  72. if(err == nil){
  73. if(comment)
  74. err = memwritegif(&bout, i, comment, dt, trans);
  75. else{
  76. snprint(buf, sizeof buf, "Converted by Plan 9 from <stdin>");
  77. err = memwritegif(&bout, i, buf, dt, trans);
  78. }
  79. }
  80. }else{
  81. if(loop == UNSET){
  82. if(argc == 1)
  83. loop = -1; /* no loop for single image */
  84. else
  85. loop = 0; /* the default case: 0 means infinite loop */
  86. }
  87. for(j=0; j<argc; j++){
  88. if(argv[j][0] == '-' && argv[j][1]=='d'){
  89. /* time change */
  90. if(argv[j][2] == '\0'){
  91. s = argv[++j];
  92. if(j == argc)
  93. usage();
  94. }else
  95. s = &argv[j][2];
  96. if(!isdigit(s[0]))
  97. usage();
  98. dt = atoi(s);
  99. if(j == argc-1) /* last argument must be file */
  100. usage();
  101. continue;
  102. }
  103. fd = open(argv[j], OREAD);
  104. if(fd < 0)
  105. sysfatal("can't open %s: %r", argv[j]);
  106. i = readmemimage(fd);
  107. if(i == nil)
  108. sysfatal("can't readimage %s: %r", argv[j]);
  109. close(fd);
  110. ni = memonechan(i);
  111. if(ni == nil)
  112. sysfatal("converting image to RGBV: %r");
  113. if(i != ni){
  114. freememimage(i);
  115. i = ni;
  116. }
  117. if(j == 0){
  118. err = memstartgif(&bout, i, loop);
  119. if(err != nil)
  120. break;
  121. }
  122. if(comment)
  123. err = memwritegif(&bout, i, comment, dt, trans);
  124. else{
  125. snprint(buf, sizeof buf, "Converted by Plan 9 from %s", argv[j]);
  126. err = memwritegif(&bout, i, buf, dt, trans);
  127. }
  128. if(err != nil)
  129. break;
  130. freememimage(i);
  131. comment = nil;
  132. }
  133. }
  134. memendgif(&bout);
  135. if(err != nil)
  136. fprint(2, "togif: %s\n", err);
  137. exits(err);
  138. }