isbn 2.0.4 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. data/{README → README.md} +5 -11
  2. data/Rakefile +20 -14
  3. data/isbn.gemspec +23 -0
  4. data/lib/isbn.rb +2 -0
  5. data/test/isbn_spec.rb +1 -1
  6. metadata +29 -316
  7. data/VERSION +0 -1
  8. data/src/gocr-0.48/.cvsignore +0 -6
  9. data/src/gocr-0.48/AUTHORS +0 -7
  10. data/src/gocr-0.48/BUGS +0 -55
  11. data/src/gocr-0.48/CREDITS +0 -17
  12. data/src/gocr-0.48/HISTORY +0 -243
  13. data/src/gocr-0.48/INSTALL +0 -83
  14. data/src/gocr-0.48/Makefile +0 -193
  15. data/src/gocr-0.48/Makefile.in +0 -193
  16. data/src/gocr-0.48/README +0 -165
  17. data/src/gocr-0.48/READMEde.txt +0 -80
  18. data/src/gocr-0.48/REMARK.txt +0 -18
  19. data/src/gocr-0.48/REVIEW +0 -538
  20. data/src/gocr-0.48/TODO +0 -65
  21. data/src/gocr-0.48/bin/.cvsignore +0 -2
  22. data/src/gocr-0.48/bin/create_db +0 -38
  23. data/src/gocr-0.48/bin/gocr.tcl +0 -527
  24. data/src/gocr-0.48/bin/gocr_chk.sh +0 -44
  25. data/src/gocr-0.48/configure +0 -4689
  26. data/src/gocr-0.48/configure.in +0 -71
  27. data/src/gocr-0.48/doc/.#Makefile.1.6 +0 -39
  28. data/src/gocr-0.48/doc/.cvsignore +0 -2
  29. data/src/gocr-0.48/doc/Makefile +0 -39
  30. data/src/gocr-0.48/doc/Makefile.in +0 -39
  31. data/src/gocr-0.48/doc/example.dtd +0 -53
  32. data/src/gocr-0.48/doc/example.xml +0 -21
  33. data/src/gocr-0.48/doc/examples.txt +0 -67
  34. data/src/gocr-0.48/doc/gocr.html +0 -578
  35. data/src/gocr-0.48/doc/unicode.txt +0 -57
  36. data/src/gocr-0.48/examples/.#Makefile.1.22 +0 -166
  37. data/src/gocr-0.48/examples/4x6.png +0 -0
  38. data/src/gocr-0.48/examples/4x6.txt +0 -2
  39. data/src/gocr-0.48/examples/5x7.png +0 -0
  40. data/src/gocr-0.48/examples/5x7.png.txt +0 -2
  41. data/src/gocr-0.48/examples/5x8.png +0 -0
  42. data/src/gocr-0.48/examples/5x8.png.txt +0 -2
  43. data/src/gocr-0.48/examples/Makefile +0 -166
  44. data/src/gocr-0.48/examples/color.fig +0 -20
  45. data/src/gocr-0.48/examples/ex.fig +0 -16
  46. data/src/gocr-0.48/examples/font.tex +0 -22
  47. data/src/gocr-0.48/examples/font1.tex +0 -46
  48. data/src/gocr-0.48/examples/font2.fig +0 -27
  49. data/src/gocr-0.48/examples/font_nw.tex +0 -24
  50. data/src/gocr-0.48/examples/handwrt1.jpg +0 -0
  51. data/src/gocr-0.48/examples/handwrt1.txt +0 -10
  52. data/src/gocr-0.48/examples/inverse.fig +0 -20
  53. data/src/gocr-0.48/examples/matrix.jpg +0 -0
  54. data/src/gocr-0.48/examples/ocr-a-subset.png +0 -0
  55. data/src/gocr-0.48/examples/ocr-a-subset.png.txt +0 -4
  56. data/src/gocr-0.48/examples/ocr-a.png +0 -0
  57. data/src/gocr-0.48/examples/ocr-a.txt +0 -6
  58. data/src/gocr-0.48/examples/ocr-b.png +0 -0
  59. data/src/gocr-0.48/examples/ocr-b.png.txt +0 -4
  60. data/src/gocr-0.48/examples/polish.tex +0 -28
  61. data/src/gocr-0.48/examples/rotate45.fig +0 -14
  62. data/src/gocr-0.48/examples/score +0 -36
  63. data/src/gocr-0.48/examples/text.tex +0 -28
  64. data/src/gocr-0.48/gpl.html +0 -537
  65. data/src/gocr-0.48/include/.cvsignore +0 -2
  66. data/src/gocr-0.48/include/config.h +0 -36
  67. data/src/gocr-0.48/include/config.h.in +0 -36
  68. data/src/gocr-0.48/include/version.h +0 -2
  69. data/src/gocr-0.48/install-sh +0 -3
  70. data/src/gocr-0.48/make.bat +0 -57
  71. data/src/gocr-0.48/man/.cvsignore +0 -2
  72. data/src/gocr-0.48/man/Makefile +0 -29
  73. data/src/gocr-0.48/man/Makefile.in +0 -29
  74. data/src/gocr-0.48/man/man1/gocr.1 +0 -166
  75. data/src/gocr-0.48/src/.cvsignore +0 -4
  76. data/src/gocr-0.48/src/Makefile +0 -132
  77. data/src/gocr-0.48/src/Makefile.in +0 -132
  78. data/src/gocr-0.48/src/amiga.h +0 -31
  79. data/src/gocr-0.48/src/barcode.c +0 -846
  80. data/src/gocr-0.48/src/barcode.c.orig +0 -593
  81. data/src/gocr-0.48/src/barcode.h +0 -11
  82. data/src/gocr-0.48/src/box.c +0 -372
  83. data/src/gocr-0.48/src/database.c +0 -462
  84. data/src/gocr-0.48/src/detect.c +0 -943
  85. data/src/gocr-0.48/src/gocr.c +0 -373
  86. data/src/gocr-0.48/src/gocr.h +0 -288
  87. data/src/gocr-0.48/src/jconv.c +0 -168
  88. data/src/gocr-0.48/src/job.c +0 -84
  89. data/src/gocr-0.48/src/lines.c +0 -350
  90. data/src/gocr-0.48/src/list.c +0 -334
  91. data/src/gocr-0.48/src/list.h +0 -90
  92. data/src/gocr-0.48/src/ocr0.c +0 -6756
  93. data/src/gocr-0.48/src/ocr0.h +0 -63
  94. data/src/gocr-0.48/src/ocr0n.c +0 -1475
  95. data/src/gocr-0.48/src/ocr1.c +0 -85
  96. data/src/gocr-0.48/src/ocr1.h +0 -3
  97. data/src/gocr-0.48/src/otsu.c +0 -289
  98. data/src/gocr-0.48/src/otsu.h +0 -23
  99. data/src/gocr-0.48/src/output.c +0 -289
  100. data/src/gocr-0.48/src/output.h +0 -37
  101. data/src/gocr-0.48/src/pcx.c +0 -153
  102. data/src/gocr-0.48/src/pcx.h +0 -9
  103. data/src/gocr-0.48/src/pgm2asc.c +0 -2893
  104. data/src/gocr-0.48/src/pgm2asc.h +0 -105
  105. data/src/gocr-0.48/src/pixel.c +0 -537
  106. data/src/gocr-0.48/src/pnm.c +0 -533
  107. data/src/gocr-0.48/src/pnm.h +0 -35
  108. data/src/gocr-0.48/src/progress.c +0 -87
  109. data/src/gocr-0.48/src/progress.h +0 -42
  110. data/src/gocr-0.48/src/remove.c +0 -703
  111. data/src/gocr-0.48/src/tga.c +0 -87
  112. data/src/gocr-0.48/src/tga.h +0 -6
  113. data/src/gocr-0.48/src/unicode.c +0 -1314
  114. data/src/gocr-0.48/src/unicode.h +0 -1257
  115. data/src/jpeg-7/Makefile.am +0 -133
  116. data/src/jpeg-7/Makefile.in +0 -1089
  117. data/src/jpeg-7/README +0 -322
  118. data/src/jpeg-7/aclocal.m4 +0 -8990
  119. data/src/jpeg-7/ansi2knr.1 +0 -36
  120. data/src/jpeg-7/ansi2knr.c +0 -739
  121. data/src/jpeg-7/cderror.h +0 -132
  122. data/src/jpeg-7/cdjpeg.c +0 -181
  123. data/src/jpeg-7/cdjpeg.h +0 -187
  124. data/src/jpeg-7/change.log +0 -270
  125. data/src/jpeg-7/cjpeg.1 +0 -325
  126. data/src/jpeg-7/cjpeg.c +0 -616
  127. data/src/jpeg-7/ckconfig.c +0 -402
  128. data/src/jpeg-7/coderules.txt +0 -118
  129. data/src/jpeg-7/config.guess +0 -1561
  130. data/src/jpeg-7/config.sub +0 -1686
  131. data/src/jpeg-7/configure +0 -17139
  132. data/src/jpeg-7/configure.ac +0 -317
  133. data/src/jpeg-7/depcomp +0 -630
  134. data/src/jpeg-7/djpeg.1 +0 -251
  135. data/src/jpeg-7/djpeg.c +0 -617
  136. data/src/jpeg-7/example.c +0 -433
  137. data/src/jpeg-7/filelist.txt +0 -215
  138. data/src/jpeg-7/install-sh +0 -520
  139. data/src/jpeg-7/install.txt +0 -1097
  140. data/src/jpeg-7/jaricom.c +0 -148
  141. data/src/jpeg-7/jcapimin.c +0 -282
  142. data/src/jpeg-7/jcapistd.c +0 -161
  143. data/src/jpeg-7/jcarith.c +0 -921
  144. data/src/jpeg-7/jccoefct.c +0 -453
  145. data/src/jpeg-7/jccolor.c +0 -459
  146. data/src/jpeg-7/jcdctmgr.c +0 -482
  147. data/src/jpeg-7/jchuff.c +0 -1612
  148. data/src/jpeg-7/jcinit.c +0 -65
  149. data/src/jpeg-7/jcmainct.c +0 -293
  150. data/src/jpeg-7/jcmarker.c +0 -667
  151. data/src/jpeg-7/jcmaster.c +0 -770
  152. data/src/jpeg-7/jcomapi.c +0 -106
  153. data/src/jpeg-7/jconfig.bcc +0 -48
  154. data/src/jpeg-7/jconfig.cfg +0 -45
  155. data/src/jpeg-7/jconfig.dj +0 -38
  156. data/src/jpeg-7/jconfig.mac +0 -43
  157. data/src/jpeg-7/jconfig.manx +0 -43
  158. data/src/jpeg-7/jconfig.mc6 +0 -52
  159. data/src/jpeg-7/jconfig.sas +0 -43
  160. data/src/jpeg-7/jconfig.st +0 -42
  161. data/src/jpeg-7/jconfig.txt +0 -155
  162. data/src/jpeg-7/jconfig.vc +0 -45
  163. data/src/jpeg-7/jconfig.vms +0 -37
  164. data/src/jpeg-7/jconfig.wat +0 -38
  165. data/src/jpeg-7/jcparam.c +0 -632
  166. data/src/jpeg-7/jcprepct.c +0 -358
  167. data/src/jpeg-7/jcsample.c +0 -545
  168. data/src/jpeg-7/jctrans.c +0 -381
  169. data/src/jpeg-7/jdapimin.c +0 -396
  170. data/src/jpeg-7/jdapistd.c +0 -275
  171. data/src/jpeg-7/jdarith.c +0 -762
  172. data/src/jpeg-7/jdatadst.c +0 -151
  173. data/src/jpeg-7/jdatasrc.c +0 -212
  174. data/src/jpeg-7/jdcoefct.c +0 -736
  175. data/src/jpeg-7/jdcolor.c +0 -396
  176. data/src/jpeg-7/jdct.h +0 -393
  177. data/src/jpeg-7/jddctmgr.c +0 -382
  178. data/src/jpeg-7/jdhuff.c +0 -1309
  179. data/src/jpeg-7/jdinput.c +0 -384
  180. data/src/jpeg-7/jdmainct.c +0 -512
  181. data/src/jpeg-7/jdmarker.c +0 -1360
  182. data/src/jpeg-7/jdmaster.c +0 -663
  183. data/src/jpeg-7/jdmerge.c +0 -400
  184. data/src/jpeg-7/jdpostct.c +0 -290
  185. data/src/jpeg-7/jdsample.c +0 -361
  186. data/src/jpeg-7/jdtrans.c +0 -136
  187. data/src/jpeg-7/jerror.c +0 -252
  188. data/src/jpeg-7/jerror.h +0 -304
  189. data/src/jpeg-7/jfdctflt.c +0 -174
  190. data/src/jpeg-7/jfdctfst.c +0 -230
  191. data/src/jpeg-7/jfdctint.c +0 -4348
  192. data/src/jpeg-7/jidctflt.c +0 -242
  193. data/src/jpeg-7/jidctfst.c +0 -368
  194. data/src/jpeg-7/jidctint.c +0 -5137
  195. data/src/jpeg-7/jinclude.h +0 -91
  196. data/src/jpeg-7/jmemansi.c +0 -167
  197. data/src/jpeg-7/jmemdos.c +0 -638
  198. data/src/jpeg-7/jmemdosa.asm +0 -379
  199. data/src/jpeg-7/jmemmac.c +0 -289
  200. data/src/jpeg-7/jmemmgr.c +0 -1118
  201. data/src/jpeg-7/jmemname.c +0 -276
  202. data/src/jpeg-7/jmemnobs.c +0 -109
  203. data/src/jpeg-7/jmemsys.h +0 -198
  204. data/src/jpeg-7/jmorecfg.h +0 -369
  205. data/src/jpeg-7/jpegint.h +0 -395
  206. data/src/jpeg-7/jpeglib.h +0 -1135
  207. data/src/jpeg-7/jpegtran.1 +0 -272
  208. data/src/jpeg-7/jpegtran.c +0 -546
  209. data/src/jpeg-7/jquant1.c +0 -856
  210. data/src/jpeg-7/jquant2.c +0 -1310
  211. data/src/jpeg-7/jutils.c +0 -179
  212. data/src/jpeg-7/jversion.h +0 -14
  213. data/src/jpeg-7/libjpeg.map +0 -4
  214. data/src/jpeg-7/libjpeg.txt +0 -3067
  215. data/src/jpeg-7/ltmain.sh +0 -8406
  216. data/src/jpeg-7/makcjpeg.st +0 -36
  217. data/src/jpeg-7/makdjpeg.st +0 -36
  218. data/src/jpeg-7/makeadsw.vc6 +0 -77
  219. data/src/jpeg-7/makeasln.vc9 +0 -33
  220. data/src/jpeg-7/makecdep.vc6 +0 -82
  221. data/src/jpeg-7/makecdsp.vc6 +0 -130
  222. data/src/jpeg-7/makecmak.vc6 +0 -159
  223. data/src/jpeg-7/makecvcp.vc9 +0 -186
  224. data/src/jpeg-7/makeddep.vc6 +0 -82
  225. data/src/jpeg-7/makeddsp.vc6 +0 -130
  226. data/src/jpeg-7/makedmak.vc6 +0 -159
  227. data/src/jpeg-7/makedvcp.vc9 +0 -186
  228. data/src/jpeg-7/makefile.ansi +0 -220
  229. data/src/jpeg-7/makefile.bcc +0 -291
  230. data/src/jpeg-7/makefile.dj +0 -226
  231. data/src/jpeg-7/makefile.manx +0 -220
  232. data/src/jpeg-7/makefile.mc6 +0 -255
  233. data/src/jpeg-7/makefile.mms +0 -224
  234. data/src/jpeg-7/makefile.sas +0 -258
  235. data/src/jpeg-7/makefile.unix +0 -234
  236. data/src/jpeg-7/makefile.vc +0 -217
  237. data/src/jpeg-7/makefile.vms +0 -142
  238. data/src/jpeg-7/makefile.wat +0 -239
  239. data/src/jpeg-7/makejdep.vc6 +0 -423
  240. data/src/jpeg-7/makejdsp.vc6 +0 -285
  241. data/src/jpeg-7/makejdsw.vc6 +0 -29
  242. data/src/jpeg-7/makejmak.vc6 +0 -425
  243. data/src/jpeg-7/makejsln.vc9 +0 -17
  244. data/src/jpeg-7/makejvcp.vc9 +0 -328
  245. data/src/jpeg-7/makeproj.mac +0 -213
  246. data/src/jpeg-7/makerdep.vc6 +0 -6
  247. data/src/jpeg-7/makerdsp.vc6 +0 -78
  248. data/src/jpeg-7/makermak.vc6 +0 -110
  249. data/src/jpeg-7/makervcp.vc9 +0 -133
  250. data/src/jpeg-7/maketdep.vc6 +0 -43
  251. data/src/jpeg-7/maketdsp.vc6 +0 -122
  252. data/src/jpeg-7/maketmak.vc6 +0 -131
  253. data/src/jpeg-7/maketvcp.vc9 +0 -178
  254. data/src/jpeg-7/makewdep.vc6 +0 -6
  255. data/src/jpeg-7/makewdsp.vc6 +0 -78
  256. data/src/jpeg-7/makewmak.vc6 +0 -110
  257. data/src/jpeg-7/makewvcp.vc9 +0 -133
  258. data/src/jpeg-7/makljpeg.st +0 -68
  259. data/src/jpeg-7/maktjpeg.st +0 -30
  260. data/src/jpeg-7/makvms.opt +0 -4
  261. data/src/jpeg-7/missing +0 -376
  262. data/src/jpeg-7/rdbmp.c +0 -439
  263. data/src/jpeg-7/rdcolmap.c +0 -253
  264. data/src/jpeg-7/rdgif.c +0 -38
  265. data/src/jpeg-7/rdjpgcom.1 +0 -63
  266. data/src/jpeg-7/rdjpgcom.c +0 -515
  267. data/src/jpeg-7/rdppm.c +0 -459
  268. data/src/jpeg-7/rdrle.c +0 -387
  269. data/src/jpeg-7/rdswitch.c +0 -365
  270. data/src/jpeg-7/rdtarga.c +0 -500
  271. data/src/jpeg-7/structure.txt +0 -945
  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 +0 -4
  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 +0 -1533
  279. data/src/jpeg-7/transupp.h +0 -205
  280. data/src/jpeg-7/usage.txt +0 -605
  281. data/src/jpeg-7/wizard.txt +0 -211
  282. data/src/jpeg-7/wrbmp.c +0 -442
  283. data/src/jpeg-7/wrgif.c +0 -399
  284. data/src/jpeg-7/wrjpgcom.1 +0 -103
  285. data/src/jpeg-7/wrjpgcom.c +0 -583
  286. data/src/jpeg-7/wrppm.c +0 -269
  287. data/src/jpeg-7/wrrle.c +0 -305
  288. data/src/jpeg-7/wrtarga.c +0 -253
data/src/jpeg-7/jcinit.c DELETED
@@ -1,65 +0,0 @@
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
- }
@@ -1,293 +0,0 @@
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
- }
@@ -1,667 +0,0 @@
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
- }