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,65 @@
1
+ /*
2
+ * jcinit.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 initialization logic for the JPEG compressor.
9
+ * This routine is in charge of selecting the modules to be executed and
10
+ * making an initialization call to each one.
11
+ *
12
+ * Logically, this code belongs in jcmaster.c. It's split out because
13
+ * linking this routine implies linking the entire compression library.
14
+ * For a transcoding-only application, we want to be able to use jcmaster.c
15
+ * without linking in the whole library.
16
+ */
17
+
18
+ #define JPEG_INTERNALS
19
+ #include "jinclude.h"
20
+ #include "jpeglib.h"
21
+
22
+
23
+ /*
24
+ * Master selection of compression modules.
25
+ * This is done once at the start of processing an image. We determine
26
+ * which modules will be used and give them appropriate initialization calls.
27
+ */
28
+
29
+ GLOBAL(void)
30
+ jinit_compress_master (j_compress_ptr cinfo)
31
+ {
32
+ /* Initialize master control (includes parameter checking/processing) */
33
+ jinit_c_master_control(cinfo, FALSE /* full compression */);
34
+
35
+ /* Preprocessing */
36
+ if (! cinfo->raw_data_in) {
37
+ jinit_color_converter(cinfo);
38
+ jinit_downsampler(cinfo);
39
+ jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
40
+ }
41
+ /* Forward DCT */
42
+ jinit_forward_dct(cinfo);
43
+ /* Entropy encoding: either Huffman or arithmetic coding. */
44
+ if (cinfo->arith_code)
45
+ jinit_arith_encoder(cinfo);
46
+ else {
47
+ jinit_huff_encoder(cinfo);
48
+ }
49
+
50
+ /* Need a full-image coefficient buffer in any multi-pass mode. */
51
+ jinit_c_coef_controller(cinfo,
52
+ (boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
53
+ jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
54
+
55
+ jinit_marker_writer(cinfo);
56
+
57
+ /* We can now tell the memory manager to allocate virtual arrays. */
58
+ (*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
59
+
60
+ /* Write the datastream header (SOI) immediately.
61
+ * Frame and scan headers are postponed till later.
62
+ * This lets application insert special markers after the SOI.
63
+ */
64
+ (*cinfo->marker->write_file_header) (cinfo);
65
+ }
@@ -0,0 +1,293 @@
1
+ /*
2
+ * jcmainct.c
3
+ *
4
+ * Copyright (C) 1994-1996, 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 the main buffer controller for compression.
9
+ * The main buffer lies between the pre-processor and the JPEG
10
+ * compressor proper; it holds downsampled data in the JPEG colorspace.
11
+ */
12
+
13
+ #define JPEG_INTERNALS
14
+ #include "jinclude.h"
15
+ #include "jpeglib.h"
16
+
17
+
18
+ /* Note: currently, there is no operating mode in which a full-image buffer
19
+ * is needed at this step. If there were, that mode could not be used with
20
+ * "raw data" input, since this module is bypassed in that case. However,
21
+ * we've left the code here for possible use in special applications.
22
+ */
23
+ #undef FULL_MAIN_BUFFER_SUPPORTED
24
+
25
+
26
+ /* Private buffer controller object */
27
+
28
+ typedef struct {
29
+ struct jpeg_c_main_controller pub; /* public fields */
30
+
31
+ JDIMENSION cur_iMCU_row; /* number of current iMCU row */
32
+ JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */
33
+ boolean suspended; /* remember if we suspended output */
34
+ J_BUF_MODE pass_mode; /* current operating mode */
35
+
36
+ /* If using just a strip buffer, this points to the entire set of buffers
37
+ * (we allocate one for each component). In the full-image case, this
38
+ * points to the currently accessible strips of the virtual arrays.
39
+ */
40
+ JSAMPARRAY buffer[MAX_COMPONENTS];
41
+
42
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
43
+ /* If using full-image storage, this array holds pointers to virtual-array
44
+ * control blocks for each component. Unused if not full-image storage.
45
+ */
46
+ jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
47
+ #endif
48
+ } my_main_controller;
49
+
50
+ typedef my_main_controller * my_main_ptr;
51
+
52
+
53
+ /* Forward declarations */
54
+ METHODDEF(void) process_data_simple_main
55
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
56
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
57
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
58
+ METHODDEF(void) process_data_buffer_main
59
+ JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
60
+ JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
61
+ #endif
62
+
63
+
64
+ /*
65
+ * Initialize for a processing pass.
66
+ */
67
+
68
+ METHODDEF(void)
69
+ start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
70
+ {
71
+ my_main_ptr main = (my_main_ptr) cinfo->main;
72
+
73
+ /* Do nothing in raw-data mode. */
74
+ if (cinfo->raw_data_in)
75
+ return;
76
+
77
+ main->cur_iMCU_row = 0; /* initialize counters */
78
+ main->rowgroup_ctr = 0;
79
+ main->suspended = FALSE;
80
+ main->pass_mode = pass_mode; /* save mode for use by process_data */
81
+
82
+ switch (pass_mode) {
83
+ case JBUF_PASS_THRU:
84
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
85
+ if (main->whole_image[0] != NULL)
86
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
87
+ #endif
88
+ main->pub.process_data = process_data_simple_main;
89
+ break;
90
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
91
+ case JBUF_SAVE_SOURCE:
92
+ case JBUF_CRANK_DEST:
93
+ case JBUF_SAVE_AND_PASS:
94
+ if (main->whole_image[0] == NULL)
95
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
96
+ main->pub.process_data = process_data_buffer_main;
97
+ break;
98
+ #endif
99
+ default:
100
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
101
+ break;
102
+ }
103
+ }
104
+
105
+
106
+ /*
107
+ * Process some data.
108
+ * This routine handles the simple pass-through mode,
109
+ * where we have only a strip buffer.
110
+ */
111
+
112
+ METHODDEF(void)
113
+ process_data_simple_main (j_compress_ptr cinfo,
114
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
115
+ JDIMENSION in_rows_avail)
116
+ {
117
+ my_main_ptr main = (my_main_ptr) cinfo->main;
118
+
119
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
120
+ /* Read input data if we haven't filled the main buffer yet */
121
+ if (main->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
122
+ (*cinfo->prep->pre_process_data) (cinfo,
123
+ input_buf, in_row_ctr, in_rows_avail,
124
+ main->buffer, &main->rowgroup_ctr,
125
+ (JDIMENSION) cinfo->min_DCT_v_scaled_size);
126
+
127
+ /* If we don't have a full iMCU row buffered, return to application for
128
+ * more data. Note that preprocessor will always pad to fill the iMCU row
129
+ * at the bottom of the image.
130
+ */
131
+ if (main->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
132
+ return;
133
+
134
+ /* Send the completed row to the compressor */
135
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
136
+ /* If compressor did not consume the whole row, then we must need to
137
+ * suspend processing and return to the application. In this situation
138
+ * we pretend we didn't yet consume the last input row; otherwise, if
139
+ * it happened to be the last row of the image, the application would
140
+ * think we were done.
141
+ */
142
+ if (! main->suspended) {
143
+ (*in_row_ctr)--;
144
+ main->suspended = TRUE;
145
+ }
146
+ return;
147
+ }
148
+ /* We did finish the row. Undo our little suspension hack if a previous
149
+ * call suspended; then mark the main buffer empty.
150
+ */
151
+ if (main->suspended) {
152
+ (*in_row_ctr)++;
153
+ main->suspended = FALSE;
154
+ }
155
+ main->rowgroup_ctr = 0;
156
+ main->cur_iMCU_row++;
157
+ }
158
+ }
159
+
160
+
161
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
162
+
163
+ /*
164
+ * Process some data.
165
+ * This routine handles all of the modes that use a full-size buffer.
166
+ */
167
+
168
+ METHODDEF(void)
169
+ process_data_buffer_main (j_compress_ptr cinfo,
170
+ JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
171
+ JDIMENSION in_rows_avail)
172
+ {
173
+ my_main_ptr main = (my_main_ptr) cinfo->main;
174
+ int ci;
175
+ jpeg_component_info *compptr;
176
+ boolean writing = (main->pass_mode != JBUF_CRANK_DEST);
177
+
178
+ while (main->cur_iMCU_row < cinfo->total_iMCU_rows) {
179
+ /* Realign the virtual buffers if at the start of an iMCU row. */
180
+ if (main->rowgroup_ctr == 0) {
181
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
182
+ ci++, compptr++) {
183
+ main->buffer[ci] = (*cinfo->mem->access_virt_sarray)
184
+ ((j_common_ptr) cinfo, main->whole_image[ci],
185
+ main->cur_iMCU_row * (compptr->v_samp_factor * DCTSIZE),
186
+ (JDIMENSION) (compptr->v_samp_factor * DCTSIZE), writing);
187
+ }
188
+ /* In a read pass, pretend we just read some source data. */
189
+ if (! writing) {
190
+ *in_row_ctr += cinfo->max_v_samp_factor * DCTSIZE;
191
+ main->rowgroup_ctr = DCTSIZE;
192
+ }
193
+ }
194
+
195
+ /* If a write pass, read input data until the current iMCU row is full. */
196
+ /* Note: preprocessor will pad if necessary to fill the last iMCU row. */
197
+ if (writing) {
198
+ (*cinfo->prep->pre_process_data) (cinfo,
199
+ input_buf, in_row_ctr, in_rows_avail,
200
+ main->buffer, &main->rowgroup_ctr,
201
+ (JDIMENSION) DCTSIZE);
202
+ /* Return to application if we need more data to fill the iMCU row. */
203
+ if (main->rowgroup_ctr < DCTSIZE)
204
+ return;
205
+ }
206
+
207
+ /* Emit data, unless this is a sink-only pass. */
208
+ if (main->pass_mode != JBUF_SAVE_SOURCE) {
209
+ if (! (*cinfo->coef->compress_data) (cinfo, main->buffer)) {
210
+ /* If compressor did not consume the whole row, then we must need to
211
+ * suspend processing and return to the application. In this situation
212
+ * we pretend we didn't yet consume the last input row; otherwise, if
213
+ * it happened to be the last row of the image, the application would
214
+ * think we were done.
215
+ */
216
+ if (! main->suspended) {
217
+ (*in_row_ctr)--;
218
+ main->suspended = TRUE;
219
+ }
220
+ return;
221
+ }
222
+ /* We did finish the row. Undo our little suspension hack if a previous
223
+ * call suspended; then mark the main buffer empty.
224
+ */
225
+ if (main->suspended) {
226
+ (*in_row_ctr)++;
227
+ main->suspended = FALSE;
228
+ }
229
+ }
230
+
231
+ /* If get here, we are done with this iMCU row. Mark buffer empty. */
232
+ main->rowgroup_ctr = 0;
233
+ main->cur_iMCU_row++;
234
+ }
235
+ }
236
+
237
+ #endif /* FULL_MAIN_BUFFER_SUPPORTED */
238
+
239
+
240
+ /*
241
+ * Initialize main buffer controller.
242
+ */
243
+
244
+ GLOBAL(void)
245
+ jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
246
+ {
247
+ my_main_ptr main;
248
+ int ci;
249
+ jpeg_component_info *compptr;
250
+
251
+ main = (my_main_ptr)
252
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
253
+ SIZEOF(my_main_controller));
254
+ cinfo->main = (struct jpeg_c_main_controller *) main;
255
+ main->pub.start_pass = start_pass_main;
256
+
257
+ /* We don't need to create a buffer in raw-data mode. */
258
+ if (cinfo->raw_data_in)
259
+ return;
260
+
261
+ /* Create the buffer. It holds downsampled data, so each component
262
+ * may be of a different size.
263
+ */
264
+ if (need_full_buffer) {
265
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
266
+ /* Allocate a full-image virtual array for each component */
267
+ /* Note we pad the bottom to a multiple of the iMCU height */
268
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
269
+ ci++, compptr++) {
270
+ main->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
271
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
272
+ compptr->width_in_blocks * compptr->DCT_h_scaled_size,
273
+ (JDIMENSION) jround_up((long) compptr->height_in_blocks,
274
+ (long) compptr->v_samp_factor) * DCTSIZE,
275
+ (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
276
+ }
277
+ #else
278
+ ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
279
+ #endif
280
+ } else {
281
+ #ifdef FULL_MAIN_BUFFER_SUPPORTED
282
+ main->whole_image[0] = NULL; /* flag for no virtual arrays */
283
+ #endif
284
+ /* Allocate a strip buffer for each component */
285
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
286
+ ci++, compptr++) {
287
+ main->buffer[ci] = (*cinfo->mem->alloc_sarray)
288
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
289
+ compptr->width_in_blocks * compptr->DCT_h_scaled_size,
290
+ (JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
291
+ }
292
+ }
293
+ }
@@ -0,0 +1,667 @@
1
+ /*
2
+ * jcmarker.c
3
+ *
4
+ * Copyright (C) 1991-1998, 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 JPEG datastream markers.
9
+ */
10
+
11
+ #define JPEG_INTERNALS
12
+ #include "jinclude.h"
13
+ #include "jpeglib.h"
14
+
15
+
16
+ typedef enum { /* JPEG marker codes */
17
+ M_SOF0 = 0xc0,
18
+ M_SOF1 = 0xc1,
19
+ M_SOF2 = 0xc2,
20
+ M_SOF3 = 0xc3,
21
+
22
+ M_SOF5 = 0xc5,
23
+ M_SOF6 = 0xc6,
24
+ M_SOF7 = 0xc7,
25
+
26
+ M_JPG = 0xc8,
27
+ M_SOF9 = 0xc9,
28
+ M_SOF10 = 0xca,
29
+ M_SOF11 = 0xcb,
30
+
31
+ M_SOF13 = 0xcd,
32
+ M_SOF14 = 0xce,
33
+ M_SOF15 = 0xcf,
34
+
35
+ M_DHT = 0xc4,
36
+
37
+ M_DAC = 0xcc,
38
+
39
+ M_RST0 = 0xd0,
40
+ M_RST1 = 0xd1,
41
+ M_RST2 = 0xd2,
42
+ M_RST3 = 0xd3,
43
+ M_RST4 = 0xd4,
44
+ M_RST5 = 0xd5,
45
+ M_RST6 = 0xd6,
46
+ M_RST7 = 0xd7,
47
+
48
+ M_SOI = 0xd8,
49
+ M_EOI = 0xd9,
50
+ M_SOS = 0xda,
51
+ M_DQT = 0xdb,
52
+ M_DNL = 0xdc,
53
+ M_DRI = 0xdd,
54
+ M_DHP = 0xde,
55
+ M_EXP = 0xdf,
56
+
57
+ M_APP0 = 0xe0,
58
+ M_APP1 = 0xe1,
59
+ M_APP2 = 0xe2,
60
+ M_APP3 = 0xe3,
61
+ M_APP4 = 0xe4,
62
+ M_APP5 = 0xe5,
63
+ M_APP6 = 0xe6,
64
+ M_APP7 = 0xe7,
65
+ M_APP8 = 0xe8,
66
+ M_APP9 = 0xe9,
67
+ M_APP10 = 0xea,
68
+ M_APP11 = 0xeb,
69
+ M_APP12 = 0xec,
70
+ M_APP13 = 0xed,
71
+ M_APP14 = 0xee,
72
+ M_APP15 = 0xef,
73
+
74
+ M_JPG0 = 0xf0,
75
+ M_JPG13 = 0xfd,
76
+ M_COM = 0xfe,
77
+
78
+ M_TEM = 0x01,
79
+
80
+ M_ERROR = 0x100
81
+ } JPEG_MARKER;
82
+
83
+
84
+ /* Private state */
85
+
86
+ typedef struct {
87
+ struct jpeg_marker_writer pub; /* public fields */
88
+
89
+ unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
90
+ } my_marker_writer;
91
+
92
+ typedef my_marker_writer * my_marker_ptr;
93
+
94
+
95
+ /*
96
+ * Basic output routines.
97
+ *
98
+ * Note that we do not support suspension while writing a marker.
99
+ * Therefore, an application using suspension must ensure that there is
100
+ * enough buffer space for the initial markers (typ. 600-700 bytes) before
101
+ * calling jpeg_start_compress, and enough space to write the trailing EOI
102
+ * (a few bytes) before calling jpeg_finish_compress. Multipass compression
103
+ * modes are not supported at all with suspension, so those two are the only
104
+ * points where markers will be written.
105
+ */
106
+
107
+ LOCAL(void)
108
+ emit_byte (j_compress_ptr cinfo, int val)
109
+ /* Emit a byte */
110
+ {
111
+ struct jpeg_destination_mgr * dest = cinfo->dest;
112
+
113
+ *(dest->next_output_byte)++ = (JOCTET) val;
114
+ if (--dest->free_in_buffer == 0) {
115
+ if (! (*dest->empty_output_buffer) (cinfo))
116
+ ERREXIT(cinfo, JERR_CANT_SUSPEND);
117
+ }
118
+ }
119
+
120
+
121
+ LOCAL(void)
122
+ emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
123
+ /* Emit a marker code */
124
+ {
125
+ emit_byte(cinfo, 0xFF);
126
+ emit_byte(cinfo, (int) mark);
127
+ }
128
+
129
+
130
+ LOCAL(void)
131
+ emit_2bytes (j_compress_ptr cinfo, int value)
132
+ /* Emit a 2-byte integer; these are always MSB first in JPEG files */
133
+ {
134
+ emit_byte(cinfo, (value >> 8) & 0xFF);
135
+ emit_byte(cinfo, value & 0xFF);
136
+ }
137
+
138
+
139
+ /*
140
+ * Routines to write specific marker types.
141
+ */
142
+
143
+ LOCAL(int)
144
+ emit_dqt (j_compress_ptr cinfo, int index)
145
+ /* Emit a DQT marker */
146
+ /* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
147
+ {
148
+ JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
149
+ int prec;
150
+ int i;
151
+
152
+ if (qtbl == NULL)
153
+ ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
154
+
155
+ prec = 0;
156
+ for (i = 0; i < DCTSIZE2; i++) {
157
+ if (qtbl->quantval[i] > 255)
158
+ prec = 1;
159
+ }
160
+
161
+ if (! qtbl->sent_table) {
162
+ emit_marker(cinfo, M_DQT);
163
+
164
+ emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2);
165
+
166
+ emit_byte(cinfo, index + (prec<<4));
167
+
168
+ for (i = 0; i < DCTSIZE2; i++) {
169
+ /* The table entries must be emitted in zigzag order. */
170
+ unsigned int qval = qtbl->quantval[jpeg_natural_order[i]];
171
+ if (prec)
172
+ emit_byte(cinfo, (int) (qval >> 8));
173
+ emit_byte(cinfo, (int) (qval & 0xFF));
174
+ }
175
+
176
+ qtbl->sent_table = TRUE;
177
+ }
178
+
179
+ return prec;
180
+ }
181
+
182
+
183
+ LOCAL(void)
184
+ emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
185
+ /* Emit a DHT marker */
186
+ {
187
+ JHUFF_TBL * htbl;
188
+ int length, i;
189
+
190
+ if (is_ac) {
191
+ htbl = cinfo->ac_huff_tbl_ptrs[index];
192
+ index += 0x10; /* output index has AC bit set */
193
+ } else {
194
+ htbl = cinfo->dc_huff_tbl_ptrs[index];
195
+ }
196
+
197
+ if (htbl == NULL)
198
+ ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
199
+
200
+ if (! htbl->sent_table) {
201
+ emit_marker(cinfo, M_DHT);
202
+
203
+ length = 0;
204
+ for (i = 1; i <= 16; i++)
205
+ length += htbl->bits[i];
206
+
207
+ emit_2bytes(cinfo, length + 2 + 1 + 16);
208
+ emit_byte(cinfo, index);
209
+
210
+ for (i = 1; i <= 16; i++)
211
+ emit_byte(cinfo, htbl->bits[i]);
212
+
213
+ for (i = 0; i < length; i++)
214
+ emit_byte(cinfo, htbl->huffval[i]);
215
+
216
+ htbl->sent_table = TRUE;
217
+ }
218
+ }
219
+
220
+
221
+ LOCAL(void)
222
+ emit_dac (j_compress_ptr cinfo)
223
+ /* Emit a DAC marker */
224
+ /* Since the useful info is so small, we want to emit all the tables in */
225
+ /* one DAC marker. Therefore this routine does its own scan of the table. */
226
+ {
227
+ #ifdef C_ARITH_CODING_SUPPORTED
228
+ char dc_in_use[NUM_ARITH_TBLS];
229
+ char ac_in_use[NUM_ARITH_TBLS];
230
+ int length, i;
231
+ jpeg_component_info *compptr;
232
+
233
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
234
+ dc_in_use[i] = ac_in_use[i] = 0;
235
+
236
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
237
+ compptr = cinfo->cur_comp_info[i];
238
+ dc_in_use[compptr->dc_tbl_no] = 1;
239
+ ac_in_use[compptr->ac_tbl_no] = 1;
240
+ }
241
+
242
+ length = 0;
243
+ for (i = 0; i < NUM_ARITH_TBLS; i++)
244
+ length += dc_in_use[i] + ac_in_use[i];
245
+
246
+ emit_marker(cinfo, M_DAC);
247
+
248
+ emit_2bytes(cinfo, length*2 + 2);
249
+
250
+ for (i = 0; i < NUM_ARITH_TBLS; i++) {
251
+ if (dc_in_use[i]) {
252
+ emit_byte(cinfo, i);
253
+ emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
254
+ }
255
+ if (ac_in_use[i]) {
256
+ emit_byte(cinfo, i + 0x10);
257
+ emit_byte(cinfo, cinfo->arith_ac_K[i]);
258
+ }
259
+ }
260
+ #endif /* C_ARITH_CODING_SUPPORTED */
261
+ }
262
+
263
+
264
+ LOCAL(void)
265
+ emit_dri (j_compress_ptr cinfo)
266
+ /* Emit a DRI marker */
267
+ {
268
+ emit_marker(cinfo, M_DRI);
269
+
270
+ emit_2bytes(cinfo, 4); /* fixed length */
271
+
272
+ emit_2bytes(cinfo, (int) cinfo->restart_interval);
273
+ }
274
+
275
+
276
+ LOCAL(void)
277
+ emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
278
+ /* Emit a SOF marker */
279
+ {
280
+ int ci;
281
+ jpeg_component_info *compptr;
282
+
283
+ emit_marker(cinfo, code);
284
+
285
+ emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
286
+
287
+ /* Make sure image isn't bigger than SOF field can handle */
288
+ if ((long) cinfo->jpeg_height > 65535L ||
289
+ (long) cinfo->jpeg_width > 65535L)
290
+ ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
291
+
292
+ emit_byte(cinfo, cinfo->data_precision);
293
+ emit_2bytes(cinfo, (int) cinfo->jpeg_height);
294
+ emit_2bytes(cinfo, (int) cinfo->jpeg_width);
295
+
296
+ emit_byte(cinfo, cinfo->num_components);
297
+
298
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
299
+ ci++, compptr++) {
300
+ emit_byte(cinfo, compptr->component_id);
301
+ emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
302
+ emit_byte(cinfo, compptr->quant_tbl_no);
303
+ }
304
+ }
305
+
306
+
307
+ LOCAL(void)
308
+ emit_sos (j_compress_ptr cinfo)
309
+ /* Emit a SOS marker */
310
+ {
311
+ int i, td, ta;
312
+ jpeg_component_info *compptr;
313
+
314
+ emit_marker(cinfo, M_SOS);
315
+
316
+ emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
317
+
318
+ emit_byte(cinfo, cinfo->comps_in_scan);
319
+
320
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
321
+ compptr = cinfo->cur_comp_info[i];
322
+ emit_byte(cinfo, compptr->component_id);
323
+ td = compptr->dc_tbl_no;
324
+ ta = compptr->ac_tbl_no;
325
+ if (cinfo->progressive_mode) {
326
+ /* Progressive mode: only DC or only AC tables are used in one scan;
327
+ * furthermore, Huffman coding of DC refinement uses no table at all.
328
+ * We emit 0 for unused field(s); this is recommended by the P&M text
329
+ * but does not seem to be specified in the standard.
330
+ */
331
+ if (cinfo->Ss == 0) {
332
+ ta = 0; /* DC scan */
333
+ if (cinfo->Ah != 0 && !cinfo->arith_code)
334
+ td = 0; /* no DC table either */
335
+ } else {
336
+ td = 0; /* AC scan */
337
+ }
338
+ }
339
+ emit_byte(cinfo, (td << 4) + ta);
340
+ }
341
+
342
+ emit_byte(cinfo, cinfo->Ss);
343
+ emit_byte(cinfo, cinfo->Se);
344
+ emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
345
+ }
346
+
347
+
348
+ LOCAL(void)
349
+ emit_jfif_app0 (j_compress_ptr cinfo)
350
+ /* Emit a JFIF-compliant APP0 marker */
351
+ {
352
+ /*
353
+ * Length of APP0 block (2 bytes)
354
+ * Block ID (4 bytes - ASCII "JFIF")
355
+ * Zero byte (1 byte to terminate the ID string)
356
+ * Version Major, Minor (2 bytes - major first)
357
+ * Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
358
+ * Xdpu (2 bytes - dots per unit horizontal)
359
+ * Ydpu (2 bytes - dots per unit vertical)
360
+ * Thumbnail X size (1 byte)
361
+ * Thumbnail Y size (1 byte)
362
+ */
363
+
364
+ emit_marker(cinfo, M_APP0);
365
+
366
+ emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
367
+
368
+ emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */
369
+ emit_byte(cinfo, 0x46);
370
+ emit_byte(cinfo, 0x49);
371
+ emit_byte(cinfo, 0x46);
372
+ emit_byte(cinfo, 0);
373
+ emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
374
+ emit_byte(cinfo, cinfo->JFIF_minor_version);
375
+ emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
376
+ emit_2bytes(cinfo, (int) cinfo->X_density);
377
+ emit_2bytes(cinfo, (int) cinfo->Y_density);
378
+ emit_byte(cinfo, 0); /* No thumbnail image */
379
+ emit_byte(cinfo, 0);
380
+ }
381
+
382
+
383
+ LOCAL(void)
384
+ emit_adobe_app14 (j_compress_ptr cinfo)
385
+ /* Emit an Adobe APP14 marker */
386
+ {
387
+ /*
388
+ * Length of APP14 block (2 bytes)
389
+ * Block ID (5 bytes - ASCII "Adobe")
390
+ * Version Number (2 bytes - currently 100)
391
+ * Flags0 (2 bytes - currently 0)
392
+ * Flags1 (2 bytes - currently 0)
393
+ * Color transform (1 byte)
394
+ *
395
+ * Although Adobe TN 5116 mentions Version = 101, all the Adobe files
396
+ * now in circulation seem to use Version = 100, so that's what we write.
397
+ *
398
+ * We write the color transform byte as 1 if the JPEG color space is
399
+ * YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with
400
+ * whether the encoder performed a transformation, which is pretty useless.
401
+ */
402
+
403
+ emit_marker(cinfo, M_APP14);
404
+
405
+ emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
406
+
407
+ emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */
408
+ emit_byte(cinfo, 0x64);
409
+ emit_byte(cinfo, 0x6F);
410
+ emit_byte(cinfo, 0x62);
411
+ emit_byte(cinfo, 0x65);
412
+ emit_2bytes(cinfo, 100); /* Version */
413
+ emit_2bytes(cinfo, 0); /* Flags0 */
414
+ emit_2bytes(cinfo, 0); /* Flags1 */
415
+ switch (cinfo->jpeg_color_space) {
416
+ case JCS_YCbCr:
417
+ emit_byte(cinfo, 1); /* Color transform = 1 */
418
+ break;
419
+ case JCS_YCCK:
420
+ emit_byte(cinfo, 2); /* Color transform = 2 */
421
+ break;
422
+ default:
423
+ emit_byte(cinfo, 0); /* Color transform = 0 */
424
+ break;
425
+ }
426
+ }
427
+
428
+
429
+ /*
430
+ * These routines allow writing an arbitrary marker with parameters.
431
+ * The only intended use is to emit COM or APPn markers after calling
432
+ * write_file_header and before calling write_frame_header.
433
+ * Other uses are not guaranteed to produce desirable results.
434
+ * Counting the parameter bytes properly is the caller's responsibility.
435
+ */
436
+
437
+ METHODDEF(void)
438
+ write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
439
+ /* Emit an arbitrary marker header */
440
+ {
441
+ if (datalen > (unsigned int) 65533) /* safety check */
442
+ ERREXIT(cinfo, JERR_BAD_LENGTH);
443
+
444
+ emit_marker(cinfo, (JPEG_MARKER) marker);
445
+
446
+ emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */
447
+ }
448
+
449
+ METHODDEF(void)
450
+ write_marker_byte (j_compress_ptr cinfo, int val)
451
+ /* Emit one byte of marker parameters following write_marker_header */
452
+ {
453
+ emit_byte(cinfo, val);
454
+ }
455
+
456
+
457
+ /*
458
+ * Write datastream header.
459
+ * This consists of an SOI and optional APPn markers.
460
+ * We recommend use of the JFIF marker, but not the Adobe marker,
461
+ * when using YCbCr or grayscale data. The JFIF marker should NOT
462
+ * be used for any other JPEG colorspace. The Adobe marker is helpful
463
+ * to distinguish RGB, CMYK, and YCCK colorspaces.
464
+ * Note that an application can write additional header markers after
465
+ * jpeg_start_compress returns.
466
+ */
467
+
468
+ METHODDEF(void)
469
+ write_file_header (j_compress_ptr cinfo)
470
+ {
471
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
472
+
473
+ emit_marker(cinfo, M_SOI); /* first the SOI */
474
+
475
+ /* SOI is defined to reset restart interval to 0 */
476
+ marker->last_restart_interval = 0;
477
+
478
+ if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
479
+ emit_jfif_app0(cinfo);
480
+ if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
481
+ emit_adobe_app14(cinfo);
482
+ }
483
+
484
+
485
+ /*
486
+ * Write frame header.
487
+ * This consists of DQT and SOFn markers.
488
+ * Note that we do not emit the SOF until we have emitted the DQT(s).
489
+ * This avoids compatibility problems with incorrect implementations that
490
+ * try to error-check the quant table numbers as soon as they see the SOF.
491
+ */
492
+
493
+ METHODDEF(void)
494
+ write_frame_header (j_compress_ptr cinfo)
495
+ {
496
+ int ci, prec;
497
+ boolean is_baseline;
498
+ jpeg_component_info *compptr;
499
+
500
+ /* Emit DQT for each quantization table.
501
+ * Note that emit_dqt() suppresses any duplicate tables.
502
+ */
503
+ prec = 0;
504
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
505
+ ci++, compptr++) {
506
+ prec += emit_dqt(cinfo, compptr->quant_tbl_no);
507
+ }
508
+ /* now prec is nonzero iff there are any 16-bit quant tables. */
509
+
510
+ /* Check for a non-baseline specification.
511
+ * Note we assume that Huffman table numbers won't be changed later.
512
+ */
513
+ if (cinfo->arith_code || cinfo->progressive_mode ||
514
+ cinfo->data_precision != 8) {
515
+ is_baseline = FALSE;
516
+ } else {
517
+ is_baseline = TRUE;
518
+ for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
519
+ ci++, compptr++) {
520
+ if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
521
+ is_baseline = FALSE;
522
+ }
523
+ if (prec && is_baseline) {
524
+ is_baseline = FALSE;
525
+ /* If it's baseline except for quantizer size, warn the user */
526
+ TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
527
+ }
528
+ }
529
+
530
+ /* Emit the proper SOF marker */
531
+ if (cinfo->arith_code) {
532
+ if (cinfo->progressive_mode)
533
+ emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */
534
+ else
535
+ emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */
536
+ } else {
537
+ if (cinfo->progressive_mode)
538
+ emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */
539
+ else if (is_baseline)
540
+ emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */
541
+ else
542
+ emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
543
+ }
544
+ }
545
+
546
+
547
+ /*
548
+ * Write scan header.
549
+ * This consists of DHT or DAC markers, optional DRI, and SOS.
550
+ * Compressed data will be written following the SOS.
551
+ */
552
+
553
+ METHODDEF(void)
554
+ write_scan_header (j_compress_ptr cinfo)
555
+ {
556
+ my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
557
+ int i;
558
+ jpeg_component_info *compptr;
559
+
560
+ if (cinfo->arith_code) {
561
+ /* Emit arith conditioning info. We may have some duplication
562
+ * if the file has multiple scans, but it's so small it's hardly
563
+ * worth worrying about.
564
+ */
565
+ emit_dac(cinfo);
566
+ } else {
567
+ /* Emit Huffman tables.
568
+ * Note that emit_dht() suppresses any duplicate tables.
569
+ */
570
+ for (i = 0; i < cinfo->comps_in_scan; i++) {
571
+ compptr = cinfo->cur_comp_info[i];
572
+ if (cinfo->progressive_mode) {
573
+ /* Progressive mode: only DC or only AC tables are used in one scan */
574
+ if (cinfo->Ss == 0) {
575
+ if (cinfo->Ah == 0) /* DC needs no table for refinement scan */
576
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
577
+ } else {
578
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
579
+ }
580
+ } else {
581
+ /* Sequential mode: need both DC and AC tables */
582
+ emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
583
+ emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
584
+ }
585
+ }
586
+ }
587
+
588
+ /* Emit DRI if required --- note that DRI value could change for each scan.
589
+ * We avoid wasting space with unnecessary DRIs, however.
590
+ */
591
+ if (cinfo->restart_interval != marker->last_restart_interval) {
592
+ emit_dri(cinfo);
593
+ marker->last_restart_interval = cinfo->restart_interval;
594
+ }
595
+
596
+ emit_sos(cinfo);
597
+ }
598
+
599
+
600
+ /*
601
+ * Write datastream trailer.
602
+ */
603
+
604
+ METHODDEF(void)
605
+ write_file_trailer (j_compress_ptr cinfo)
606
+ {
607
+ emit_marker(cinfo, M_EOI);
608
+ }
609
+
610
+
611
+ /*
612
+ * Write an abbreviated table-specification datastream.
613
+ * This consists of SOI, DQT and DHT tables, and EOI.
614
+ * Any table that is defined and not marked sent_table = TRUE will be
615
+ * emitted. Note that all tables will be marked sent_table = TRUE at exit.
616
+ */
617
+
618
+ METHODDEF(void)
619
+ write_tables_only (j_compress_ptr cinfo)
620
+ {
621
+ int i;
622
+
623
+ emit_marker(cinfo, M_SOI);
624
+
625
+ for (i = 0; i < NUM_QUANT_TBLS; i++) {
626
+ if (cinfo->quant_tbl_ptrs[i] != NULL)
627
+ (void) emit_dqt(cinfo, i);
628
+ }
629
+
630
+ if (! cinfo->arith_code) {
631
+ for (i = 0; i < NUM_HUFF_TBLS; i++) {
632
+ if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
633
+ emit_dht(cinfo, i, FALSE);
634
+ if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
635
+ emit_dht(cinfo, i, TRUE);
636
+ }
637
+ }
638
+
639
+ emit_marker(cinfo, M_EOI);
640
+ }
641
+
642
+
643
+ /*
644
+ * Initialize the marker writer module.
645
+ */
646
+
647
+ GLOBAL(void)
648
+ jinit_marker_writer (j_compress_ptr cinfo)
649
+ {
650
+ my_marker_ptr marker;
651
+
652
+ /* Create the subobject */
653
+ marker = (my_marker_ptr)
654
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
655
+ SIZEOF(my_marker_writer));
656
+ cinfo->marker = (struct jpeg_marker_writer *) marker;
657
+ /* Initialize method pointers */
658
+ marker->pub.write_file_header = write_file_header;
659
+ marker->pub.write_frame_header = write_frame_header;
660
+ marker->pub.write_scan_header = write_scan_header;
661
+ marker->pub.write_file_trailer = write_file_trailer;
662
+ marker->pub.write_tables_only = write_tables_only;
663
+ marker->pub.write_marker_header = write_marker_header;
664
+ marker->pub.write_marker_byte = write_marker_byte;
665
+ /* Initialize private state */
666
+ marker->last_restart_interval = 0;
667
+ }