isbn 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. data/.gitignore +4 -0
  2. data/README +9 -0
  3. data/Rakefile +13 -0
  4. data/VERSION +1 -0
  5. data/isbn.gemspec +329 -0
  6. data/lib/isbn.rb +90 -0
  7. data/src/gocr-0.48/.cvsignore +6 -0
  8. data/src/gocr-0.48/AUTHORS +7 -0
  9. data/src/gocr-0.48/BUGS +55 -0
  10. data/src/gocr-0.48/CREDITS +17 -0
  11. data/src/gocr-0.48/HISTORY +243 -0
  12. data/src/gocr-0.48/INSTALL +83 -0
  13. data/src/gocr-0.48/Makefile +193 -0
  14. data/src/gocr-0.48/Makefile.in +193 -0
  15. data/src/gocr-0.48/README +165 -0
  16. data/src/gocr-0.48/READMEde.txt +80 -0
  17. data/src/gocr-0.48/REMARK.txt +18 -0
  18. data/src/gocr-0.48/REVIEW +538 -0
  19. data/src/gocr-0.48/TODO +65 -0
  20. data/src/gocr-0.48/bin/.cvsignore +2 -0
  21. data/src/gocr-0.48/bin/create_db +38 -0
  22. data/src/gocr-0.48/bin/gocr.tcl +527 -0
  23. data/src/gocr-0.48/bin/gocr_chk.sh +44 -0
  24. data/src/gocr-0.48/configure +4689 -0
  25. data/src/gocr-0.48/configure.in +71 -0
  26. data/src/gocr-0.48/doc/.#Makefile.1.6 +39 -0
  27. data/src/gocr-0.48/doc/.cvsignore +2 -0
  28. data/src/gocr-0.48/doc/Makefile +39 -0
  29. data/src/gocr-0.48/doc/Makefile.in +39 -0
  30. data/src/gocr-0.48/doc/example.dtd +53 -0
  31. data/src/gocr-0.48/doc/example.xml +21 -0
  32. data/src/gocr-0.48/doc/examples.txt +67 -0
  33. data/src/gocr-0.48/doc/gocr.html +578 -0
  34. data/src/gocr-0.48/doc/unicode.txt +57 -0
  35. data/src/gocr-0.48/examples/.#Makefile.1.22 +166 -0
  36. data/src/gocr-0.48/examples/4x6.png +0 -0
  37. data/src/gocr-0.48/examples/4x6.txt +2 -0
  38. data/src/gocr-0.48/examples/5x7.png +0 -0
  39. data/src/gocr-0.48/examples/5x7.png.txt +2 -0
  40. data/src/gocr-0.48/examples/5x8.png +0 -0
  41. data/src/gocr-0.48/examples/5x8.png.txt +2 -0
  42. data/src/gocr-0.48/examples/Makefile +166 -0
  43. data/src/gocr-0.48/examples/color.fig +20 -0
  44. data/src/gocr-0.48/examples/ex.fig +16 -0
  45. data/src/gocr-0.48/examples/font.tex +22 -0
  46. data/src/gocr-0.48/examples/font1.tex +46 -0
  47. data/src/gocr-0.48/examples/font2.fig +27 -0
  48. data/src/gocr-0.48/examples/font_nw.tex +24 -0
  49. data/src/gocr-0.48/examples/handwrt1.jpg +0 -0
  50. data/src/gocr-0.48/examples/handwrt1.txt +10 -0
  51. data/src/gocr-0.48/examples/inverse.fig +20 -0
  52. data/src/gocr-0.48/examples/matrix.jpg +0 -0
  53. data/src/gocr-0.48/examples/ocr-a-subset.png +0 -0
  54. data/src/gocr-0.48/examples/ocr-a-subset.png.txt +4 -0
  55. data/src/gocr-0.48/examples/ocr-a.png +0 -0
  56. data/src/gocr-0.48/examples/ocr-a.txt +6 -0
  57. data/src/gocr-0.48/examples/ocr-b.png +0 -0
  58. data/src/gocr-0.48/examples/ocr-b.png.txt +4 -0
  59. data/src/gocr-0.48/examples/polish.tex +28 -0
  60. data/src/gocr-0.48/examples/rotate45.fig +14 -0
  61. data/src/gocr-0.48/examples/score +36 -0
  62. data/src/gocr-0.48/examples/text.tex +28 -0
  63. data/src/gocr-0.48/gocr.spec +143 -0
  64. data/src/gocr-0.48/gpl.html +537 -0
  65. data/src/gocr-0.48/include/.cvsignore +2 -0
  66. data/src/gocr-0.48/include/config.h +36 -0
  67. data/src/gocr-0.48/include/config.h.in +36 -0
  68. data/src/gocr-0.48/include/version.h +2 -0
  69. data/src/gocr-0.48/install-sh +3 -0
  70. data/src/gocr-0.48/make.bat +57 -0
  71. data/src/gocr-0.48/man/.cvsignore +2 -0
  72. data/src/gocr-0.48/man/Makefile +29 -0
  73. data/src/gocr-0.48/man/Makefile.in +29 -0
  74. data/src/gocr-0.48/man/man1/gocr.1 +166 -0
  75. data/src/gocr-0.48/src/.cvsignore +4 -0
  76. data/src/gocr-0.48/src/Makefile +132 -0
  77. data/src/gocr-0.48/src/Makefile.in +132 -0
  78. data/src/gocr-0.48/src/amiga.h +31 -0
  79. data/src/gocr-0.48/src/barcode.c +846 -0
  80. data/src/gocr-0.48/src/barcode.c.orig +593 -0
  81. data/src/gocr-0.48/src/barcode.h +11 -0
  82. data/src/gocr-0.48/src/box.c +372 -0
  83. data/src/gocr-0.48/src/database.c +462 -0
  84. data/src/gocr-0.48/src/detect.c +943 -0
  85. data/src/gocr-0.48/src/gocr.c +373 -0
  86. data/src/gocr-0.48/src/gocr.h +288 -0
  87. data/src/gocr-0.48/src/jconv.c +168 -0
  88. data/src/gocr-0.48/src/job.c +84 -0
  89. data/src/gocr-0.48/src/lines.c +350 -0
  90. data/src/gocr-0.48/src/list.c +334 -0
  91. data/src/gocr-0.48/src/list.h +90 -0
  92. data/src/gocr-0.48/src/ocr0.c +6756 -0
  93. data/src/gocr-0.48/src/ocr0.h +63 -0
  94. data/src/gocr-0.48/src/ocr0n.c +1475 -0
  95. data/src/gocr-0.48/src/ocr1.c +85 -0
  96. data/src/gocr-0.48/src/ocr1.h +3 -0
  97. data/src/gocr-0.48/src/otsu.c +289 -0
  98. data/src/gocr-0.48/src/otsu.h +23 -0
  99. data/src/gocr-0.48/src/output.c +289 -0
  100. data/src/gocr-0.48/src/output.h +37 -0
  101. data/src/gocr-0.48/src/pcx.c +153 -0
  102. data/src/gocr-0.48/src/pcx.h +9 -0
  103. data/src/gocr-0.48/src/pgm2asc.c +2893 -0
  104. data/src/gocr-0.48/src/pgm2asc.h +105 -0
  105. data/src/gocr-0.48/src/pixel.c +537 -0
  106. data/src/gocr-0.48/src/pnm.c +533 -0
  107. data/src/gocr-0.48/src/pnm.h +35 -0
  108. data/src/gocr-0.48/src/progress.c +87 -0
  109. data/src/gocr-0.48/src/progress.h +42 -0
  110. data/src/gocr-0.48/src/remove.c +703 -0
  111. data/src/gocr-0.48/src/tga.c +87 -0
  112. data/src/gocr-0.48/src/tga.h +6 -0
  113. data/src/gocr-0.48/src/unicode.c +1314 -0
  114. data/src/gocr-0.48/src/unicode.h +1257 -0
  115. data/src/jpeg-7/Makefile.am +133 -0
  116. data/src/jpeg-7/Makefile.in +1089 -0
  117. data/src/jpeg-7/README +322 -0
  118. data/src/jpeg-7/aclocal.m4 +8990 -0
  119. data/src/jpeg-7/ansi2knr.1 +36 -0
  120. data/src/jpeg-7/ansi2knr.c +739 -0
  121. data/src/jpeg-7/cderror.h +132 -0
  122. data/src/jpeg-7/cdjpeg.c +181 -0
  123. data/src/jpeg-7/cdjpeg.h +187 -0
  124. data/src/jpeg-7/change.log +270 -0
  125. data/src/jpeg-7/cjpeg.1 +325 -0
  126. data/src/jpeg-7/cjpeg.c +616 -0
  127. data/src/jpeg-7/ckconfig.c +402 -0
  128. data/src/jpeg-7/coderules.txt +118 -0
  129. data/src/jpeg-7/config.guess +1561 -0
  130. data/src/jpeg-7/config.sub +1686 -0
  131. data/src/jpeg-7/configure +17139 -0
  132. data/src/jpeg-7/configure.ac +317 -0
  133. data/src/jpeg-7/depcomp +630 -0
  134. data/src/jpeg-7/djpeg.1 +251 -0
  135. data/src/jpeg-7/djpeg.c +617 -0
  136. data/src/jpeg-7/example.c +433 -0
  137. data/src/jpeg-7/filelist.txt +215 -0
  138. data/src/jpeg-7/install-sh +520 -0
  139. data/src/jpeg-7/install.txt +1097 -0
  140. data/src/jpeg-7/jaricom.c +148 -0
  141. data/src/jpeg-7/jcapimin.c +282 -0
  142. data/src/jpeg-7/jcapistd.c +161 -0
  143. data/src/jpeg-7/jcarith.c +921 -0
  144. data/src/jpeg-7/jccoefct.c +453 -0
  145. data/src/jpeg-7/jccolor.c +459 -0
  146. data/src/jpeg-7/jcdctmgr.c +482 -0
  147. data/src/jpeg-7/jchuff.c +1612 -0
  148. data/src/jpeg-7/jcinit.c +65 -0
  149. data/src/jpeg-7/jcmainct.c +293 -0
  150. data/src/jpeg-7/jcmarker.c +667 -0
  151. data/src/jpeg-7/jcmaster.c +770 -0
  152. data/src/jpeg-7/jcomapi.c +106 -0
  153. data/src/jpeg-7/jconfig.bcc +48 -0
  154. data/src/jpeg-7/jconfig.cfg +45 -0
  155. data/src/jpeg-7/jconfig.dj +38 -0
  156. data/src/jpeg-7/jconfig.mac +43 -0
  157. data/src/jpeg-7/jconfig.manx +43 -0
  158. data/src/jpeg-7/jconfig.mc6 +52 -0
  159. data/src/jpeg-7/jconfig.sas +43 -0
  160. data/src/jpeg-7/jconfig.st +42 -0
  161. data/src/jpeg-7/jconfig.txt +155 -0
  162. data/src/jpeg-7/jconfig.vc +45 -0
  163. data/src/jpeg-7/jconfig.vms +37 -0
  164. data/src/jpeg-7/jconfig.wat +38 -0
  165. data/src/jpeg-7/jcparam.c +632 -0
  166. data/src/jpeg-7/jcprepct.c +358 -0
  167. data/src/jpeg-7/jcsample.c +545 -0
  168. data/src/jpeg-7/jctrans.c +381 -0
  169. data/src/jpeg-7/jdapimin.c +396 -0
  170. data/src/jpeg-7/jdapistd.c +275 -0
  171. data/src/jpeg-7/jdarith.c +762 -0
  172. data/src/jpeg-7/jdatadst.c +151 -0
  173. data/src/jpeg-7/jdatasrc.c +212 -0
  174. data/src/jpeg-7/jdcoefct.c +736 -0
  175. data/src/jpeg-7/jdcolor.c +396 -0
  176. data/src/jpeg-7/jdct.h +393 -0
  177. data/src/jpeg-7/jddctmgr.c +382 -0
  178. data/src/jpeg-7/jdhuff.c +1309 -0
  179. data/src/jpeg-7/jdinput.c +384 -0
  180. data/src/jpeg-7/jdmainct.c +512 -0
  181. data/src/jpeg-7/jdmarker.c +1360 -0
  182. data/src/jpeg-7/jdmaster.c +663 -0
  183. data/src/jpeg-7/jdmerge.c +400 -0
  184. data/src/jpeg-7/jdpostct.c +290 -0
  185. data/src/jpeg-7/jdsample.c +361 -0
  186. data/src/jpeg-7/jdtrans.c +136 -0
  187. data/src/jpeg-7/jerror.c +252 -0
  188. data/src/jpeg-7/jerror.h +304 -0
  189. data/src/jpeg-7/jfdctflt.c +174 -0
  190. data/src/jpeg-7/jfdctfst.c +230 -0
  191. data/src/jpeg-7/jfdctint.c +4348 -0
  192. data/src/jpeg-7/jidctflt.c +242 -0
  193. data/src/jpeg-7/jidctfst.c +368 -0
  194. data/src/jpeg-7/jidctint.c +5137 -0
  195. data/src/jpeg-7/jinclude.h +91 -0
  196. data/src/jpeg-7/jmemansi.c +167 -0
  197. data/src/jpeg-7/jmemdos.c +638 -0
  198. data/src/jpeg-7/jmemdosa.asm +379 -0
  199. data/src/jpeg-7/jmemmac.c +289 -0
  200. data/src/jpeg-7/jmemmgr.c +1118 -0
  201. data/src/jpeg-7/jmemname.c +276 -0
  202. data/src/jpeg-7/jmemnobs.c +109 -0
  203. data/src/jpeg-7/jmemsys.h +198 -0
  204. data/src/jpeg-7/jmorecfg.h +369 -0
  205. data/src/jpeg-7/jpegint.h +395 -0
  206. data/src/jpeg-7/jpeglib.h +1135 -0
  207. data/src/jpeg-7/jpegtran.1 +272 -0
  208. data/src/jpeg-7/jpegtran.c +546 -0
  209. data/src/jpeg-7/jquant1.c +856 -0
  210. data/src/jpeg-7/jquant2.c +1310 -0
  211. data/src/jpeg-7/jutils.c +179 -0
  212. data/src/jpeg-7/jversion.h +14 -0
  213. data/src/jpeg-7/libjpeg.map +4 -0
  214. data/src/jpeg-7/libjpeg.txt +3067 -0
  215. data/src/jpeg-7/ltmain.sh +8406 -0
  216. data/src/jpeg-7/makcjpeg.st +36 -0
  217. data/src/jpeg-7/makdjpeg.st +36 -0
  218. data/src/jpeg-7/makeadsw.vc6 +77 -0
  219. data/src/jpeg-7/makeasln.vc9 +33 -0
  220. data/src/jpeg-7/makecdep.vc6 +82 -0
  221. data/src/jpeg-7/makecdsp.vc6 +130 -0
  222. data/src/jpeg-7/makecmak.vc6 +159 -0
  223. data/src/jpeg-7/makecvcp.vc9 +186 -0
  224. data/src/jpeg-7/makeddep.vc6 +82 -0
  225. data/src/jpeg-7/makeddsp.vc6 +130 -0
  226. data/src/jpeg-7/makedmak.vc6 +159 -0
  227. data/src/jpeg-7/makedvcp.vc9 +186 -0
  228. data/src/jpeg-7/makefile.ansi +220 -0
  229. data/src/jpeg-7/makefile.bcc +291 -0
  230. data/src/jpeg-7/makefile.dj +226 -0
  231. data/src/jpeg-7/makefile.manx +220 -0
  232. data/src/jpeg-7/makefile.mc6 +255 -0
  233. data/src/jpeg-7/makefile.mms +224 -0
  234. data/src/jpeg-7/makefile.sas +258 -0
  235. data/src/jpeg-7/makefile.unix +234 -0
  236. data/src/jpeg-7/makefile.vc +217 -0
  237. data/src/jpeg-7/makefile.vms +142 -0
  238. data/src/jpeg-7/makefile.wat +239 -0
  239. data/src/jpeg-7/makejdep.vc6 +423 -0
  240. data/src/jpeg-7/makejdsp.vc6 +285 -0
  241. data/src/jpeg-7/makejdsw.vc6 +29 -0
  242. data/src/jpeg-7/makejmak.vc6 +425 -0
  243. data/src/jpeg-7/makejsln.vc9 +17 -0
  244. data/src/jpeg-7/makejvcp.vc9 +328 -0
  245. data/src/jpeg-7/makeproj.mac +213 -0
  246. data/src/jpeg-7/makerdep.vc6 +6 -0
  247. data/src/jpeg-7/makerdsp.vc6 +78 -0
  248. data/src/jpeg-7/makermak.vc6 +110 -0
  249. data/src/jpeg-7/makervcp.vc9 +133 -0
  250. data/src/jpeg-7/maketdep.vc6 +43 -0
  251. data/src/jpeg-7/maketdsp.vc6 +122 -0
  252. data/src/jpeg-7/maketmak.vc6 +131 -0
  253. data/src/jpeg-7/maketvcp.vc9 +178 -0
  254. data/src/jpeg-7/makewdep.vc6 +6 -0
  255. data/src/jpeg-7/makewdsp.vc6 +78 -0
  256. data/src/jpeg-7/makewmak.vc6 +110 -0
  257. data/src/jpeg-7/makewvcp.vc9 +133 -0
  258. data/src/jpeg-7/makljpeg.st +68 -0
  259. data/src/jpeg-7/maktjpeg.st +30 -0
  260. data/src/jpeg-7/makvms.opt +4 -0
  261. data/src/jpeg-7/missing +376 -0
  262. data/src/jpeg-7/rdbmp.c +439 -0
  263. data/src/jpeg-7/rdcolmap.c +253 -0
  264. data/src/jpeg-7/rdgif.c +38 -0
  265. data/src/jpeg-7/rdjpgcom.1 +63 -0
  266. data/src/jpeg-7/rdjpgcom.c +515 -0
  267. data/src/jpeg-7/rdppm.c +459 -0
  268. data/src/jpeg-7/rdrle.c +387 -0
  269. data/src/jpeg-7/rdswitch.c +365 -0
  270. data/src/jpeg-7/rdtarga.c +500 -0
  271. data/src/jpeg-7/structure.txt +945 -0
  272. data/src/jpeg-7/testimg.bmp +0 -0
  273. data/src/jpeg-7/testimg.jpg +0 -0
  274. data/src/jpeg-7/testimg.ppm +4 -0
  275. data/src/jpeg-7/testimgp.jpg +0 -0
  276. data/src/jpeg-7/testorig.jpg +0 -0
  277. data/src/jpeg-7/testprog.jpg +0 -0
  278. data/src/jpeg-7/transupp.c +1533 -0
  279. data/src/jpeg-7/transupp.h +205 -0
  280. data/src/jpeg-7/usage.txt +605 -0
  281. data/src/jpeg-7/wizard.txt +211 -0
  282. data/src/jpeg-7/wrbmp.c +442 -0
  283. data/src/jpeg-7/wrgif.c +399 -0
  284. data/src/jpeg-7/wrjpgcom.1 +103 -0
  285. data/src/jpeg-7/wrjpgcom.c +583 -0
  286. data/src/jpeg-7/wrppm.c +269 -0
  287. data/src/jpeg-7/wrrle.c +305 -0
  288. data/src/jpeg-7/wrtarga.c +253 -0
  289. data/test/isbn_test.rb +7 -0
  290. data/test/test_helper.rb +7 -0
  291. metadata +345 -0
@@ -0,0 +1,399 @@
1
+ /*
2
+ * wrgif.c
3
+ *
4
+ * Copyright (C) 1991-1997, Thomas G. Lane.
5
+ * This file is part of the Independent JPEG Group's software.
6
+ * For conditions of distribution and use, see the accompanying README file.
7
+ *
8
+ * This file contains routines to write output images in GIF format.
9
+ *
10
+ **************************************************************************
11
+ * NOTE: to avoid entanglements with Unisys' patent on LZW compression, *
12
+ * this code has been modified to output "uncompressed GIF" files. *
13
+ * There is no trace of the LZW algorithm in this file. *
14
+ **************************************************************************
15
+ *
16
+ * These routines may need modification for non-Unix environments or
17
+ * specialized applications. As they stand, they assume output to
18
+ * an ordinary stdio stream.
19
+ */
20
+
21
+ /*
22
+ * This code is loosely based on ppmtogif from the PBMPLUS distribution
23
+ * of Feb. 1991. That file contains the following copyright notice:
24
+ * Based on GIFENCODE by David Rowley <mgardi@watdscu.waterloo.edu>.
25
+ * Lempel-Ziv compression based on "compress" by Spencer W. Thomas et al.
26
+ * Copyright (C) 1989 by Jef Poskanzer.
27
+ * Permission to use, copy, modify, and distribute this software and its
28
+ * documentation for any purpose and without fee is hereby granted, provided
29
+ * that the above copyright notice appear in all copies and that both that
30
+ * copyright notice and this permission notice appear in supporting
31
+ * documentation. This software is provided "as is" without express or
32
+ * implied warranty.
33
+ *
34
+ * We are also required to state that
35
+ * "The Graphics Interchange Format(c) is the Copyright property of
36
+ * CompuServe Incorporated. GIF(sm) is a Service Mark property of
37
+ * CompuServe Incorporated."
38
+ */
39
+
40
+ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
41
+
42
+ #ifdef GIF_SUPPORTED
43
+
44
+
45
+ /* Private version of data destination object */
46
+
47
+ typedef struct {
48
+ struct djpeg_dest_struct pub; /* public fields */
49
+
50
+ j_decompress_ptr cinfo; /* back link saves passing separate parm */
51
+
52
+ /* State for packing variable-width codes into a bitstream */
53
+ int n_bits; /* current number of bits/code */
54
+ int maxcode; /* maximum code, given n_bits */
55
+ INT32 cur_accum; /* holds bits not yet output */
56
+ int cur_bits; /* # of bits in cur_accum */
57
+
58
+ /* State for GIF code assignment */
59
+ int ClearCode; /* clear code (doesn't change) */
60
+ int EOFCode; /* EOF code (ditto) */
61
+ int code_counter; /* counts output symbols */
62
+
63
+ /* GIF data packet construction buffer */
64
+ int bytesinpkt; /* # of bytes in current packet */
65
+ char packetbuf[256]; /* workspace for accumulating packet */
66
+
67
+ } gif_dest_struct;
68
+
69
+ typedef gif_dest_struct * gif_dest_ptr;
70
+
71
+ /* Largest value that will fit in N bits */
72
+ #define MAXCODE(n_bits) ((1 << (n_bits)) - 1)
73
+
74
+
75
+ /*
76
+ * Routines to package finished data bytes into GIF data blocks.
77
+ * A data block consists of a count byte (1..255) and that many data bytes.
78
+ */
79
+
80
+ LOCAL(void)
81
+ flush_packet (gif_dest_ptr dinfo)
82
+ /* flush any accumulated data */
83
+ {
84
+ if (dinfo->bytesinpkt > 0) { /* never write zero-length packet */
85
+ dinfo->packetbuf[0] = (char) dinfo->bytesinpkt++;
86
+ if (JFWRITE(dinfo->pub.output_file, dinfo->packetbuf, dinfo->bytesinpkt)
87
+ != (size_t) dinfo->bytesinpkt)
88
+ ERREXIT(dinfo->cinfo, JERR_FILE_WRITE);
89
+ dinfo->bytesinpkt = 0;
90
+ }
91
+ }
92
+
93
+
94
+ /* Add a character to current packet; flush to disk if necessary */
95
+ #define CHAR_OUT(dinfo,c) \
96
+ { (dinfo)->packetbuf[++(dinfo)->bytesinpkt] = (char) (c); \
97
+ if ((dinfo)->bytesinpkt >= 255) \
98
+ flush_packet(dinfo); \
99
+ }
100
+
101
+
102
+ /* Routine to convert variable-width codes into a byte stream */
103
+
104
+ LOCAL(void)
105
+ output (gif_dest_ptr dinfo, int code)
106
+ /* Emit a code of n_bits bits */
107
+ /* Uses cur_accum and cur_bits to reblock into 8-bit bytes */
108
+ {
109
+ dinfo->cur_accum |= ((INT32) code) << dinfo->cur_bits;
110
+ dinfo->cur_bits += dinfo->n_bits;
111
+
112
+ while (dinfo->cur_bits >= 8) {
113
+ CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF);
114
+ dinfo->cur_accum >>= 8;
115
+ dinfo->cur_bits -= 8;
116
+ }
117
+ }
118
+
119
+
120
+ /* The pseudo-compression algorithm.
121
+ *
122
+ * In this module we simply output each pixel value as a separate symbol;
123
+ * thus, no compression occurs. In fact, there is expansion of one bit per
124
+ * pixel, because we use a symbol width one bit wider than the pixel width.
125
+ *
126
+ * GIF ordinarily uses variable-width symbols, and the decoder will expect
127
+ * to ratchet up the symbol width after a fixed number of symbols.
128
+ * To simplify the logic and keep the expansion penalty down, we emit a
129
+ * GIF Clear code to reset the decoder just before the width would ratchet up.
130
+ * Thus, all the symbols in the output file will have the same bit width.
131
+ * Note that emitting the Clear codes at the right times is a mere matter of
132
+ * counting output symbols and is in no way dependent on the LZW patent.
133
+ *
134
+ * With a small basic pixel width (low color count), Clear codes will be
135
+ * needed very frequently, causing the file to expand even more. So this
136
+ * simplistic approach wouldn't work too well on bilevel images, for example.
137
+ * But for output of JPEG conversions the pixel width will usually be 8 bits
138
+ * (129 to 256 colors), so the overhead added by Clear symbols is only about
139
+ * one symbol in every 256.
140
+ */
141
+
142
+ LOCAL(void)
143
+ compress_init (gif_dest_ptr dinfo, int i_bits)
144
+ /* Initialize pseudo-compressor */
145
+ {
146
+ /* init all the state variables */
147
+ dinfo->n_bits = i_bits;
148
+ dinfo->maxcode = MAXCODE(dinfo->n_bits);
149
+ dinfo->ClearCode = (1 << (i_bits - 1));
150
+ dinfo->EOFCode = dinfo->ClearCode + 1;
151
+ dinfo->code_counter = dinfo->ClearCode + 2;
152
+ /* init output buffering vars */
153
+ dinfo->bytesinpkt = 0;
154
+ dinfo->cur_accum = 0;
155
+ dinfo->cur_bits = 0;
156
+ /* GIF specifies an initial Clear code */
157
+ output(dinfo, dinfo->ClearCode);
158
+ }
159
+
160
+
161
+ LOCAL(void)
162
+ compress_pixel (gif_dest_ptr dinfo, int c)
163
+ /* Accept and "compress" one pixel value.
164
+ * The given value must be less than n_bits wide.
165
+ */
166
+ {
167
+ /* Output the given pixel value as a symbol. */
168
+ output(dinfo, c);
169
+ /* Issue Clear codes often enough to keep the reader from ratcheting up
170
+ * its symbol size.
171
+ */
172
+ if (dinfo->code_counter < dinfo->maxcode) {
173
+ dinfo->code_counter++;
174
+ } else {
175
+ output(dinfo, dinfo->ClearCode);
176
+ dinfo->code_counter = dinfo->ClearCode + 2; /* reset the counter */
177
+ }
178
+ }
179
+
180
+
181
+ LOCAL(void)
182
+ compress_term (gif_dest_ptr dinfo)
183
+ /* Clean up at end */
184
+ {
185
+ /* Send an EOF code */
186
+ output(dinfo, dinfo->EOFCode);
187
+ /* Flush the bit-packing buffer */
188
+ if (dinfo->cur_bits > 0) {
189
+ CHAR_OUT(dinfo, dinfo->cur_accum & 0xFF);
190
+ }
191
+ /* Flush the packet buffer */
192
+ flush_packet(dinfo);
193
+ }
194
+
195
+
196
+ /* GIF header construction */
197
+
198
+
199
+ LOCAL(void)
200
+ put_word (gif_dest_ptr dinfo, unsigned int w)
201
+ /* Emit a 16-bit word, LSB first */
202
+ {
203
+ putc(w & 0xFF, dinfo->pub.output_file);
204
+ putc((w >> 8) & 0xFF, dinfo->pub.output_file);
205
+ }
206
+
207
+
208
+ LOCAL(void)
209
+ put_3bytes (gif_dest_ptr dinfo, int val)
210
+ /* Emit 3 copies of same byte value --- handy subr for colormap construction */
211
+ {
212
+ putc(val, dinfo->pub.output_file);
213
+ putc(val, dinfo->pub.output_file);
214
+ putc(val, dinfo->pub.output_file);
215
+ }
216
+
217
+
218
+ LOCAL(void)
219
+ emit_header (gif_dest_ptr dinfo, int num_colors, JSAMPARRAY colormap)
220
+ /* Output the GIF file header, including color map */
221
+ /* If colormap==NULL, synthesize a gray-scale colormap */
222
+ {
223
+ int BitsPerPixel, ColorMapSize, InitCodeSize, FlagByte;
224
+ int cshift = dinfo->cinfo->data_precision - 8;
225
+ int i;
226
+
227
+ if (num_colors > 256)
228
+ ERREXIT1(dinfo->cinfo, JERR_TOO_MANY_COLORS, num_colors);
229
+ /* Compute bits/pixel and related values */
230
+ BitsPerPixel = 1;
231
+ while (num_colors > (1 << BitsPerPixel))
232
+ BitsPerPixel++;
233
+ ColorMapSize = 1 << BitsPerPixel;
234
+ if (BitsPerPixel <= 1)
235
+ InitCodeSize = 2;
236
+ else
237
+ InitCodeSize = BitsPerPixel;
238
+ /*
239
+ * Write the GIF header.
240
+ * Note that we generate a plain GIF87 header for maximum compatibility.
241
+ */
242
+ putc('G', dinfo->pub.output_file);
243
+ putc('I', dinfo->pub.output_file);
244
+ putc('F', dinfo->pub.output_file);
245
+ putc('8', dinfo->pub.output_file);
246
+ putc('7', dinfo->pub.output_file);
247
+ putc('a', dinfo->pub.output_file);
248
+ /* Write the Logical Screen Descriptor */
249
+ put_word(dinfo, (unsigned int) dinfo->cinfo->output_width);
250
+ put_word(dinfo, (unsigned int) dinfo->cinfo->output_height);
251
+ FlagByte = 0x80; /* Yes, there is a global color table */
252
+ FlagByte |= (BitsPerPixel-1) << 4; /* color resolution */
253
+ FlagByte |= (BitsPerPixel-1); /* size of global color table */
254
+ putc(FlagByte, dinfo->pub.output_file);
255
+ putc(0, dinfo->pub.output_file); /* Background color index */
256
+ putc(0, dinfo->pub.output_file); /* Reserved (aspect ratio in GIF89) */
257
+ /* Write the Global Color Map */
258
+ /* If the color map is more than 8 bits precision, */
259
+ /* we reduce it to 8 bits by shifting */
260
+ for (i=0; i < ColorMapSize; i++) {
261
+ if (i < num_colors) {
262
+ if (colormap != NULL) {
263
+ if (dinfo->cinfo->out_color_space == JCS_RGB) {
264
+ /* Normal case: RGB color map */
265
+ putc(GETJSAMPLE(colormap[0][i]) >> cshift, dinfo->pub.output_file);
266
+ putc(GETJSAMPLE(colormap[1][i]) >> cshift, dinfo->pub.output_file);
267
+ putc(GETJSAMPLE(colormap[2][i]) >> cshift, dinfo->pub.output_file);
268
+ } else {
269
+ /* Grayscale "color map": possible if quantizing grayscale image */
270
+ put_3bytes(dinfo, GETJSAMPLE(colormap[0][i]) >> cshift);
271
+ }
272
+ } else {
273
+ /* Create a gray-scale map of num_colors values, range 0..255 */
274
+ put_3bytes(dinfo, (i * 255 + (num_colors-1)/2) / (num_colors-1));
275
+ }
276
+ } else {
277
+ /* fill out the map to a power of 2 */
278
+ put_3bytes(dinfo, 0);
279
+ }
280
+ }
281
+ /* Write image separator and Image Descriptor */
282
+ putc(',', dinfo->pub.output_file); /* separator */
283
+ put_word(dinfo, 0); /* left/top offset */
284
+ put_word(dinfo, 0);
285
+ put_word(dinfo, (unsigned int) dinfo->cinfo->output_width); /* image size */
286
+ put_word(dinfo, (unsigned int) dinfo->cinfo->output_height);
287
+ /* flag byte: not interlaced, no local color map */
288
+ putc(0x00, dinfo->pub.output_file);
289
+ /* Write Initial Code Size byte */
290
+ putc(InitCodeSize, dinfo->pub.output_file);
291
+
292
+ /* Initialize for "compression" of image data */
293
+ compress_init(dinfo, InitCodeSize+1);
294
+ }
295
+
296
+
297
+ /*
298
+ * Startup: write the file header.
299
+ */
300
+
301
+ METHODDEF(void)
302
+ start_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
303
+ {
304
+ gif_dest_ptr dest = (gif_dest_ptr) dinfo;
305
+
306
+ if (cinfo->quantize_colors)
307
+ emit_header(dest, cinfo->actual_number_of_colors, cinfo->colormap);
308
+ else
309
+ emit_header(dest, 256, (JSAMPARRAY) NULL);
310
+ }
311
+
312
+
313
+ /*
314
+ * Write some pixel data.
315
+ * In this module rows_supplied will always be 1.
316
+ */
317
+
318
+ METHODDEF(void)
319
+ put_pixel_rows (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo,
320
+ JDIMENSION rows_supplied)
321
+ {
322
+ gif_dest_ptr dest = (gif_dest_ptr) dinfo;
323
+ register JSAMPROW ptr;
324
+ register JDIMENSION col;
325
+
326
+ ptr = dest->pub.buffer[0];
327
+ for (col = cinfo->output_width; col > 0; col--) {
328
+ compress_pixel(dest, GETJSAMPLE(*ptr++));
329
+ }
330
+ }
331
+
332
+
333
+ /*
334
+ * Finish up at the end of the file.
335
+ */
336
+
337
+ METHODDEF(void)
338
+ finish_output_gif (j_decompress_ptr cinfo, djpeg_dest_ptr dinfo)
339
+ {
340
+ gif_dest_ptr dest = (gif_dest_ptr) dinfo;
341
+
342
+ /* Flush "compression" mechanism */
343
+ compress_term(dest);
344
+ /* Write a zero-length data block to end the series */
345
+ putc(0, dest->pub.output_file);
346
+ /* Write the GIF terminator mark */
347
+ putc(';', dest->pub.output_file);
348
+ /* Make sure we wrote the output file OK */
349
+ fflush(dest->pub.output_file);
350
+ if (ferror(dest->pub.output_file))
351
+ ERREXIT(cinfo, JERR_FILE_WRITE);
352
+ }
353
+
354
+
355
+ /*
356
+ * The module selection routine for GIF format output.
357
+ */
358
+
359
+ GLOBAL(djpeg_dest_ptr)
360
+ jinit_write_gif (j_decompress_ptr cinfo)
361
+ {
362
+ gif_dest_ptr dest;
363
+
364
+ /* Create module interface object, fill in method pointers */
365
+ dest = (gif_dest_ptr)
366
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
367
+ SIZEOF(gif_dest_struct));
368
+ dest->cinfo = cinfo; /* make back link for subroutines */
369
+ dest->pub.start_output = start_output_gif;
370
+ dest->pub.put_pixel_rows = put_pixel_rows;
371
+ dest->pub.finish_output = finish_output_gif;
372
+
373
+ if (cinfo->out_color_space != JCS_GRAYSCALE &&
374
+ cinfo->out_color_space != JCS_RGB)
375
+ ERREXIT(cinfo, JERR_GIF_COLORSPACE);
376
+
377
+ /* Force quantization if color or if > 8 bits input */
378
+ if (cinfo->out_color_space != JCS_GRAYSCALE || cinfo->data_precision > 8) {
379
+ /* Force quantization to at most 256 colors */
380
+ cinfo->quantize_colors = TRUE;
381
+ if (cinfo->desired_number_of_colors > 256)
382
+ cinfo->desired_number_of_colors = 256;
383
+ }
384
+
385
+ /* Calculate output image dimensions so we can allocate space */
386
+ jpeg_calc_output_dimensions(cinfo);
387
+
388
+ if (cinfo->output_components != 1) /* safety check: just one component? */
389
+ ERREXIT(cinfo, JERR_GIF_BUG);
390
+
391
+ /* Create decompressor output buffer. */
392
+ dest->pub.buffer = (*cinfo->mem->alloc_sarray)
393
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, cinfo->output_width, (JDIMENSION) 1);
394
+ dest->pub.buffer_height = 1;
395
+
396
+ return (djpeg_dest_ptr) dest;
397
+ }
398
+
399
+ #endif /* GIF_SUPPORTED */
@@ -0,0 +1,103 @@
1
+ .TH WRJPGCOM 1 "15 June 1995"
2
+ .SH NAME
3
+ wrjpgcom \- insert text comments into a JPEG file
4
+ .SH SYNOPSIS
5
+ .B wrjpgcom
6
+ [
7
+ .B \-replace
8
+ ]
9
+ [
10
+ .BI \-comment " text"
11
+ ]
12
+ [
13
+ .BI \-cfile " name"
14
+ ]
15
+ [
16
+ .I filename
17
+ ]
18
+ .LP
19
+ .SH DESCRIPTION
20
+ .LP
21
+ .B wrjpgcom
22
+ reads the named JPEG/JFIF file, or the standard input if no file is named,
23
+ and generates a new JPEG/JFIF file on standard output. A comment block is
24
+ added to the file.
25
+ .PP
26
+ The JPEG standard allows "comment" (COM) blocks to occur within a JPEG file.
27
+ Although the standard doesn't actually define what COM blocks are for, they
28
+ are widely used to hold user-supplied text strings. This lets you add
29
+ annotations, titles, index terms, etc to your JPEG files, and later retrieve
30
+ them as text. COM blocks do not interfere with the image stored in the JPEG
31
+ file. The maximum size of a COM block is 64K, but you can have as many of
32
+ them as you like in one JPEG file.
33
+ .PP
34
+ .B wrjpgcom
35
+ adds a COM block, containing text you provide, to a JPEG file.
36
+ Ordinarily, the COM block is added after any existing COM blocks; but you
37
+ can delete the old COM blocks if you wish.
38
+ .SH OPTIONS
39
+ Switch names may be abbreviated, and are not case sensitive.
40
+ .TP
41
+ .B \-replace
42
+ Delete any existing COM blocks from the file.
43
+ .TP
44
+ .BI \-comment " text"
45
+ Supply text for new COM block on command line.
46
+ .TP
47
+ .BI \-cfile " name"
48
+ Read text for new COM block from named file.
49
+ .PP
50
+ If you have only one line of comment text to add, you can provide it on the
51
+ command line with
52
+ .BR \-comment .
53
+ The comment text must be surrounded with quotes so that it is treated as a
54
+ single argument. Longer comments can be read from a text file.
55
+ .PP
56
+ If you give neither
57
+ .B \-comment
58
+ nor
59
+ .BR \-cfile ,
60
+ then
61
+ .B wrjpgcom
62
+ will read the comment text from standard input. (In this case an input image
63
+ file name MUST be supplied, so that the source JPEG file comes from somewhere
64
+ else.) You can enter multiple lines, up to 64KB worth. Type an end-of-file
65
+ indicator (usually control-D) to terminate the comment text entry.
66
+ .PP
67
+ .B wrjpgcom
68
+ will not add a COM block if the provided comment string is empty. Therefore
69
+ \fB\-replace \-comment ""\fR can be used to delete all COM blocks from a file.
70
+ .SH EXAMPLES
71
+ .LP
72
+ Add a short comment to in.jpg, producing out.jpg:
73
+ .IP
74
+ .B wrjpgcom \-c
75
+ \fI"View of my back yard" in.jpg
76
+ .B >
77
+ .I out.jpg
78
+ .PP
79
+ Attach a long comment previously stored in comment.txt:
80
+ .IP
81
+ .B wrjpgcom
82
+ .I in.jpg
83
+ .B <
84
+ .I comment.txt
85
+ .B >
86
+ .I out.jpg
87
+ .PP
88
+ or equivalently
89
+ .IP
90
+ .B wrjpgcom
91
+ .B -cfile
92
+ .I comment.txt
93
+ .B <
94
+ .I in.jpg
95
+ .B >
96
+ .I out.jpg
97
+ .SH SEE ALSO
98
+ .BR cjpeg (1),
99
+ .BR djpeg (1),
100
+ .BR jpegtran (1),
101
+ .BR rdjpgcom (1)
102
+ .SH AUTHOR
103
+ Independent JPEG Group