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/jcarith.c DELETED
@@ -1,921 +0,0 @@
1
- /*
2
- * jcarith.c
3
- *
4
- * Developed 1997 by Guido Vollbeding.
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 portable arithmetic entropy encoding routines for JPEG
9
- * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
10
- *
11
- * Both sequential and progressive modes are supported in this single module.
12
- *
13
- * Suspension is not currently supported in this module.
14
- */
15
-
16
- #define JPEG_INTERNALS
17
- #include "jinclude.h"
18
- #include "jpeglib.h"
19
-
20
-
21
- /* Expanded entropy encoder object for arithmetic encoding. */
22
-
23
- typedef struct {
24
- struct jpeg_entropy_encoder pub; /* public fields */
25
-
26
- INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */
27
- INT32 a; /* A register, normalized size of coding interval */
28
- INT32 sc; /* counter for stacked 0xFF values which might overflow */
29
- INT32 zc; /* counter for pending 0x00 output values which might *
30
- * be discarded at the end ("Pacman" termination) */
31
- int ct; /* bit shift counter, determines when next byte will be written */
32
- int buffer; /* buffer for most recent output byte != 0xFF */
33
-
34
- int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
35
- int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
36
-
37
- unsigned int restarts_to_go; /* MCUs left in this restart interval */
38
- int next_restart_num; /* next restart number to write (0-7) */
39
-
40
- /* Pointers to statistics areas (these workspaces have image lifespan) */
41
- unsigned char * dc_stats[NUM_ARITH_TBLS];
42
- unsigned char * ac_stats[NUM_ARITH_TBLS];
43
- } arith_entropy_encoder;
44
-
45
- typedef arith_entropy_encoder * arith_entropy_ptr;
46
-
47
- /* The following two definitions specify the allocation chunk size
48
- * for the statistics area.
49
- * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
50
- * 49 statistics bins for DC, and 245 statistics bins for AC coding.
51
- * Note that we use one additional AC bin for codings with fixed
52
- * probability (0.5), thus the minimum number for AC is 246.
53
- *
54
- * We use a compact representation with 1 byte per statistics bin,
55
- * thus the numbers directly represent byte sizes.
56
- * This 1 byte per statistics bin contains the meaning of the MPS
57
- * (more probable symbol) in the highest bit (mask 0x80), and the
58
- * index into the probability estimation state machine table
59
- * in the lower bits (mask 0x7F).
60
- */
61
-
62
- #define DC_STAT_BINS 64
63
- #define AC_STAT_BINS 256
64
-
65
- /* NOTE: Uncomment the following #define if you want to use the
66
- * given formula for calculating the AC conditioning parameter Kx
67
- * for spectral selection progressive coding in section G.1.3.2
68
- * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
69
- * Although the spec and P&M authors claim that this "has proven
70
- * to give good results for 8 bit precision samples", I'm not
71
- * convinced yet that this is really beneficial.
72
- * Early tests gave only very marginal compression enhancements
73
- * (a few - around 5 or so - bytes even for very large files),
74
- * which would turn out rather negative if we'd suppress the
75
- * DAC (Define Arithmetic Conditioning) marker segments for
76
- * the default parameters in the future.
77
- * Note that currently the marker writing module emits 12-byte
78
- * DAC segments for a full-component scan in a color image.
79
- * This is not worth worrying about IMHO. However, since the
80
- * spec defines the default values to be used if the tables
81
- * are omitted (unlike Huffman tables, which are required
82
- * anyway), one might optimize this behaviour in the future,
83
- * and then it would be disadvantageous to use custom tables if
84
- * they don't provide sufficient gain to exceed the DAC size.
85
- *
86
- * On the other hand, I'd consider it as a reasonable result
87
- * that the conditioning has no significant influence on the
88
- * compression performance. This means that the basic
89
- * statistical model is already rather stable.
90
- *
91
- * Thus, at the moment, we use the default conditioning values
92
- * anyway, and do not use the custom formula.
93
- *
94
- #define CALCULATE_SPECTRAL_CONDITIONING
95
- */
96
-
97
- /* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
98
- * We assume that int right shift is unsigned if INT32 right shift is,
99
- * which should be safe.
100
- */
101
-
102
- #ifdef RIGHT_SHIFT_IS_UNSIGNED
103
- #define ISHIFT_TEMPS int ishift_temp;
104
- #define IRIGHT_SHIFT(x,shft) \
105
- ((ishift_temp = (x)) < 0 ? \
106
- (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
107
- (ishift_temp >> (shft)))
108
- #else
109
- #define ISHIFT_TEMPS
110
- #define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
111
- #endif
112
-
113
-
114
- LOCAL(void)
115
- emit_byte (int val, j_compress_ptr cinfo)
116
- /* Write next output byte; we do not support suspension in this module. */
117
- {
118
- struct jpeg_destination_mgr * dest = cinfo->dest;
119
-
120
- *dest->next_output_byte++ = (JOCTET) val;
121
- if (--dest->free_in_buffer == 0)
122
- if (! (*dest->empty_output_buffer) (cinfo))
123
- ERREXIT(cinfo, JERR_CANT_SUSPEND);
124
- }
125
-
126
-
127
- /*
128
- * Finish up at the end of an arithmetic-compressed scan.
129
- */
130
-
131
- METHODDEF(void)
132
- finish_pass (j_compress_ptr cinfo)
133
- {
134
- arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
135
- INT32 temp;
136
-
137
- /* Section D.1.8: Termination of encoding */
138
-
139
- /* Find the e->c in the coding interval with the largest
140
- * number of trailing zero bits */
141
- if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)
142
- e->c = temp + 0x8000L;
143
- else
144
- e->c = temp;
145
- /* Send remaining bytes to output */
146
- e->c <<= e->ct;
147
- if (e->c & 0xF8000000L) {
148
- /* One final overflow has to be handled */
149
- if (e->buffer >= 0) {
150
- if (e->zc)
151
- do emit_byte(0x00, cinfo);
152
- while (--e->zc);
153
- emit_byte(e->buffer + 1, cinfo);
154
- if (e->buffer + 1 == 0xFF)
155
- emit_byte(0x00, cinfo);
156
- }
157
- e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
158
- e->sc = 0;
159
- } else {
160
- if (e->buffer == 0)
161
- ++e->zc;
162
- else if (e->buffer >= 0) {
163
- if (e->zc)
164
- do emit_byte(0x00, cinfo);
165
- while (--e->zc);
166
- emit_byte(e->buffer, cinfo);
167
- }
168
- if (e->sc) {
169
- if (e->zc)
170
- do emit_byte(0x00, cinfo);
171
- while (--e->zc);
172
- do {
173
- emit_byte(0xFF, cinfo);
174
- emit_byte(0x00, cinfo);
175
- } while (--e->sc);
176
- }
177
- }
178
- /* Output final bytes only if they are not 0x00 */
179
- if (e->c & 0x7FFF800L) {
180
- if (e->zc) /* output final pending zero bytes */
181
- do emit_byte(0x00, cinfo);
182
- while (--e->zc);
183
- emit_byte((e->c >> 19) & 0xFF, cinfo);
184
- if (((e->c >> 19) & 0xFF) == 0xFF)
185
- emit_byte(0x00, cinfo);
186
- if (e->c & 0x7F800L) {
187
- emit_byte((e->c >> 11) & 0xFF, cinfo);
188
- if (((e->c >> 11) & 0xFF) == 0xFF)
189
- emit_byte(0x00, cinfo);
190
- }
191
- }
192
- }
193
-
194
-
195
- /*
196
- * The core arithmetic encoding routine (common in JPEG and JBIG).
197
- * This needs to go as fast as possible.
198
- * Machine-dependent optimization facilities
199
- * are not utilized in this portable implementation.
200
- * However, this code should be fairly efficient and
201
- * may be a good base for further optimizations anyway.
202
- *
203
- * Parameter 'val' to be encoded may be 0 or 1 (binary decision).
204
- *
205
- * Note: I've added full "Pacman" termination support to the
206
- * byte output routines, which is equivalent to the optional
207
- * Discard_final_zeros procedure (Figure D.15) in the spec.
208
- * Thus, we always produce the shortest possible output
209
- * stream compliant to the spec (no trailing zero bytes,
210
- * except for FF stuffing).
211
- *
212
- * I've also introduced a new scheme for accessing
213
- * the probability estimation state machine table,
214
- * derived from Markus Kuhn's JBIG implementation.
215
- */
216
-
217
- LOCAL(void)
218
- arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
219
- {
220
- extern const INT32 jaritab[];
221
- register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
222
- register unsigned char nl, nm;
223
- register INT32 qe, temp;
224
- register int sv;
225
-
226
- /* Fetch values from our compact representation of Table D.2:
227
- * Qe values and probability estimation state machine
228
- */
229
- sv = *st;
230
- qe = jaritab[sv & 0x7F]; /* => Qe_Value */
231
- nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
232
- nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
233
-
234
- /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
235
- e->a -= qe;
236
- if (val != (sv >> 7)) {
237
- /* Encode the less probable symbol */
238
- if (e->a >= qe) {
239
- /* If the interval size (qe) for the less probable symbol (LPS)
240
- * is larger than the interval size for the MPS, then exchange
241
- * the two symbols for coding efficiency, otherwise code the LPS
242
- * as usual: */
243
- e->c += e->a;
244
- e->a = qe;
245
- }
246
- *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
247
- } else {
248
- /* Encode the more probable symbol */
249
- if (e->a >= 0x8000L)
250
- return; /* A >= 0x8000 -> ready, no renormalization required */
251
- if (e->a < qe) {
252
- /* If the interval size (qe) for the less probable symbol (LPS)
253
- * is larger than the interval size for the MPS, then exchange
254
- * the two symbols for coding efficiency: */
255
- e->c += e->a;
256
- e->a = qe;
257
- }
258
- *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
259
- }
260
-
261
- /* Renormalization & data output per section D.1.6 */
262
- do {
263
- e->a <<= 1;
264
- e->c <<= 1;
265
- if (--e->ct == 0) {
266
- /* Another byte is ready for output */
267
- temp = e->c >> 19;
268
- if (temp > 0xFF) {
269
- /* Handle overflow over all stacked 0xFF bytes */
270
- if (e->buffer >= 0) {
271
- if (e->zc)
272
- do emit_byte(0x00, cinfo);
273
- while (--e->zc);
274
- emit_byte(e->buffer + 1, cinfo);
275
- if (e->buffer + 1 == 0xFF)
276
- emit_byte(0x00, cinfo);
277
- }
278
- e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
279
- e->sc = 0;
280
- /* Note: The 3 spacer bits in the C register guarantee
281
- * that the new buffer byte can't be 0xFF here
282
- * (see page 160 in the P&M JPEG book). */
283
- e->buffer = temp & 0xFF; /* new output byte, might overflow later */
284
- } else if (temp == 0xFF) {
285
- ++e->sc; /* stack 0xFF byte (which might overflow later) */
286
- } else {
287
- /* Output all stacked 0xFF bytes, they will not overflow any more */
288
- if (e->buffer == 0)
289
- ++e->zc;
290
- else if (e->buffer >= 0) {
291
- if (e->zc)
292
- do emit_byte(0x00, cinfo);
293
- while (--e->zc);
294
- emit_byte(e->buffer, cinfo);
295
- }
296
- if (e->sc) {
297
- if (e->zc)
298
- do emit_byte(0x00, cinfo);
299
- while (--e->zc);
300
- do {
301
- emit_byte(0xFF, cinfo);
302
- emit_byte(0x00, cinfo);
303
- } while (--e->sc);
304
- }
305
- e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
306
- }
307
- e->c &= 0x7FFFFL;
308
- e->ct += 8;
309
- }
310
- } while (e->a < 0x8000L);
311
- }
312
-
313
-
314
- /*
315
- * Emit a restart marker & resynchronize predictions.
316
- */
317
-
318
- LOCAL(void)
319
- emit_restart (j_compress_ptr cinfo, int restart_num)
320
- {
321
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
322
- int ci;
323
- jpeg_component_info * compptr;
324
-
325
- finish_pass(cinfo);
326
-
327
- emit_byte(0xFF, cinfo);
328
- emit_byte(JPEG_RST0 + restart_num, cinfo);
329
-
330
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
331
- compptr = cinfo->cur_comp_info[ci];
332
- /* Re-initialize statistics areas */
333
- if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
334
- MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
335
- /* Reset DC predictions to 0 */
336
- entropy->last_dc_val[ci] = 0;
337
- entropy->dc_context[ci] = 0;
338
- }
339
- if (cinfo->progressive_mode == 0 || cinfo->Ss) {
340
- MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
341
- }
342
- }
343
-
344
- /* Reset arithmetic encoding variables */
345
- entropy->c = 0;
346
- entropy->a = 0x10000L;
347
- entropy->sc = 0;
348
- entropy->zc = 0;
349
- entropy->ct = 11;
350
- entropy->buffer = -1; /* empty */
351
- }
352
-
353
-
354
- /*
355
- * MCU encoding for DC initial scan (either spectral selection,
356
- * or first pass of successive approximation).
357
- */
358
-
359
- METHODDEF(boolean)
360
- encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
361
- {
362
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
363
- JBLOCKROW block;
364
- unsigned char *st;
365
- int blkn, ci, tbl;
366
- int v, v2, m;
367
- ISHIFT_TEMPS
368
-
369
- /* Emit restart marker if needed */
370
- if (cinfo->restart_interval) {
371
- if (entropy->restarts_to_go == 0) {
372
- emit_restart(cinfo, entropy->next_restart_num);
373
- entropy->restarts_to_go = cinfo->restart_interval;
374
- entropy->next_restart_num++;
375
- entropy->next_restart_num &= 7;
376
- }
377
- entropy->restarts_to_go--;
378
- }
379
-
380
- /* Encode the MCU data blocks */
381
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
382
- block = MCU_data[blkn];
383
- ci = cinfo->MCU_membership[blkn];
384
- tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
385
-
386
- /* Compute the DC value after the required point transform by Al.
387
- * This is simply an arithmetic right shift.
388
- */
389
- m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
390
-
391
- /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
392
-
393
- /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
394
- st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
395
-
396
- /* Figure F.4: Encode_DC_DIFF */
397
- if ((v = m - entropy->last_dc_val[ci]) == 0) {
398
- arith_encode(cinfo, st, 0);
399
- entropy->dc_context[ci] = 0; /* zero diff category */
400
- } else {
401
- entropy->last_dc_val[ci] = m;
402
- arith_encode(cinfo, st, 1);
403
- /* Figure F.6: Encoding nonzero value v */
404
- /* Figure F.7: Encoding the sign of v */
405
- if (v > 0) {
406
- arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
407
- st += 2; /* Table F.4: SP = S0 + 2 */
408
- entropy->dc_context[ci] = 4; /* small positive diff category */
409
- } else {
410
- v = -v;
411
- arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
412
- st += 3; /* Table F.4: SN = S0 + 3 */
413
- entropy->dc_context[ci] = 8; /* small negative diff category */
414
- }
415
- /* Figure F.8: Encoding the magnitude category of v */
416
- m = 0;
417
- if (v -= 1) {
418
- arith_encode(cinfo, st, 1);
419
- m = 1;
420
- v2 = v;
421
- st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
422
- while (v2 >>= 1) {
423
- arith_encode(cinfo, st, 1);
424
- m <<= 1;
425
- st += 1;
426
- }
427
- }
428
- arith_encode(cinfo, st, 0);
429
- /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
430
- if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
431
- entropy->dc_context[ci] = 0; /* zero diff category */
432
- else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
433
- entropy->dc_context[ci] += 8; /* large diff category */
434
- /* Figure F.9: Encoding the magnitude bit pattern of v */
435
- st += 14;
436
- while (m >>= 1)
437
- arith_encode(cinfo, st, (m & v) ? 1 : 0);
438
- }
439
- }
440
-
441
- return TRUE;
442
- }
443
-
444
-
445
- /*
446
- * MCU encoding for AC initial scan (either spectral selection,
447
- * or first pass of successive approximation).
448
- */
449
-
450
- METHODDEF(boolean)
451
- encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
452
- {
453
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
454
- JBLOCKROW block;
455
- unsigned char *st;
456
- int tbl, k, ke;
457
- int v, v2, m;
458
-
459
- /* Emit restart marker if needed */
460
- if (cinfo->restart_interval) {
461
- if (entropy->restarts_to_go == 0) {
462
- emit_restart(cinfo, entropy->next_restart_num);
463
- entropy->restarts_to_go = cinfo->restart_interval;
464
- entropy->next_restart_num++;
465
- entropy->next_restart_num &= 7;
466
- }
467
- entropy->restarts_to_go--;
468
- }
469
-
470
- /* Encode the MCU data block */
471
- block = MCU_data[0];
472
- tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
473
-
474
- /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
475
-
476
- /* Establish EOB (end-of-block) index */
477
- for (ke = cinfo->Se + 1; ke > 1; ke--)
478
- /* We must apply the point transform by Al. For AC coefficients this
479
- * is an integer division with rounding towards 0. To do this portably
480
- * in C, we shift after obtaining the absolute value.
481
- */
482
- if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {
483
- if (v >>= cinfo->Al) break;
484
- } else {
485
- v = -v;
486
- if (v >>= cinfo->Al) break;
487
- }
488
-
489
- /* Figure F.5: Encode_AC_Coefficients */
490
- for (k = cinfo->Ss; k < ke; k++) {
491
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
492
- arith_encode(cinfo, st, 0); /* EOB decision */
493
- entropy->ac_stats[tbl][245] = 0;
494
- for (;;) {
495
- if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
496
- if (v >>= cinfo->Al) {
497
- arith_encode(cinfo, st + 1, 1);
498
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
499
- break;
500
- }
501
- } else {
502
- v = -v;
503
- if (v >>= cinfo->Al) {
504
- arith_encode(cinfo, st + 1, 1);
505
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
506
- break;
507
- }
508
- }
509
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
510
- }
511
- st += 2;
512
- /* Figure F.8: Encoding the magnitude category of v */
513
- m = 0;
514
- if (v -= 1) {
515
- arith_encode(cinfo, st, 1);
516
- m = 1;
517
- v2 = v;
518
- if (v2 >>= 1) {
519
- arith_encode(cinfo, st, 1);
520
- m <<= 1;
521
- st = entropy->ac_stats[tbl] +
522
- (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
523
- while (v2 >>= 1) {
524
- arith_encode(cinfo, st, 1);
525
- m <<= 1;
526
- st += 1;
527
- }
528
- }
529
- }
530
- arith_encode(cinfo, st, 0);
531
- /* Figure F.9: Encoding the magnitude bit pattern of v */
532
- st += 14;
533
- while (m >>= 1)
534
- arith_encode(cinfo, st, (m & v) ? 1 : 0);
535
- }
536
- /* Encode EOB decision only if k <= cinfo->Se */
537
- if (k <= cinfo->Se) {
538
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
539
- arith_encode(cinfo, st, 1);
540
- }
541
-
542
- return TRUE;
543
- }
544
-
545
-
546
- /*
547
- * MCU encoding for DC successive approximation refinement scan.
548
- */
549
-
550
- METHODDEF(boolean)
551
- encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
552
- {
553
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
554
- unsigned char st[4];
555
- int Al, blkn;
556
-
557
- /* Emit restart marker if needed */
558
- if (cinfo->restart_interval) {
559
- if (entropy->restarts_to_go == 0) {
560
- emit_restart(cinfo, entropy->next_restart_num);
561
- entropy->restarts_to_go = cinfo->restart_interval;
562
- entropy->next_restart_num++;
563
- entropy->next_restart_num &= 7;
564
- }
565
- entropy->restarts_to_go--;
566
- }
567
-
568
- Al = cinfo->Al;
569
-
570
- /* Encode the MCU data blocks */
571
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
572
- st[0] = 0; /* use fixed probability estimation */
573
- /* We simply emit the Al'th bit of the DC coefficient value. */
574
- arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
575
- }
576
-
577
- return TRUE;
578
- }
579
-
580
-
581
- /*
582
- * MCU encoding for AC successive approximation refinement scan.
583
- */
584
-
585
- METHODDEF(boolean)
586
- encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
587
- {
588
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
589
- JBLOCKROW block;
590
- unsigned char *st;
591
- int tbl, k, ke, kex;
592
- int v;
593
-
594
- /* Emit restart marker if needed */
595
- if (cinfo->restart_interval) {
596
- if (entropy->restarts_to_go == 0) {
597
- emit_restart(cinfo, entropy->next_restart_num);
598
- entropy->restarts_to_go = cinfo->restart_interval;
599
- entropy->next_restart_num++;
600
- entropy->next_restart_num &= 7;
601
- }
602
- entropy->restarts_to_go--;
603
- }
604
-
605
- /* Encode the MCU data block */
606
- block = MCU_data[0];
607
- tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
608
-
609
- /* Section G.1.3.3: Encoding of AC coefficients */
610
-
611
- /* Establish EOB (end-of-block) index */
612
- for (ke = cinfo->Se + 1; ke > 1; ke--)
613
- /* We must apply the point transform by Al. For AC coefficients this
614
- * is an integer division with rounding towards 0. To do this portably
615
- * in C, we shift after obtaining the absolute value.
616
- */
617
- if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {
618
- if (v >>= cinfo->Al) break;
619
- } else {
620
- v = -v;
621
- if (v >>= cinfo->Al) break;
622
- }
623
-
624
- /* Establish EOBx (previous stage end-of-block) index */
625
- for (kex = ke; kex > 1; kex--)
626
- if ((v = (*block)[jpeg_natural_order[kex - 1]]) >= 0) {
627
- if (v >>= cinfo->Ah) break;
628
- } else {
629
- v = -v;
630
- if (v >>= cinfo->Ah) break;
631
- }
632
-
633
- /* Figure G.10: Encode_AC_Coefficients_SA */
634
- for (k = cinfo->Ss; k < ke; k++) {
635
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
636
- if (k >= kex)
637
- arith_encode(cinfo, st, 0); /* EOB decision */
638
- entropy->ac_stats[tbl][245] = 0;
639
- for (;;) {
640
- if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
641
- if (v >>= cinfo->Al) {
642
- if (v >> 1) /* previously nonzero coef */
643
- arith_encode(cinfo, st + 2, (v & 1));
644
- else { /* newly nonzero coef */
645
- arith_encode(cinfo, st + 1, 1);
646
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
647
- }
648
- break;
649
- }
650
- } else {
651
- v = -v;
652
- if (v >>= cinfo->Al) {
653
- if (v >> 1) /* previously nonzero coef */
654
- arith_encode(cinfo, st + 2, (v & 1));
655
- else { /* newly nonzero coef */
656
- arith_encode(cinfo, st + 1, 1);
657
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
658
- }
659
- break;
660
- }
661
- }
662
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
663
- }
664
- }
665
- /* Encode EOB decision only if k <= cinfo->Se */
666
- if (k <= cinfo->Se) {
667
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
668
- arith_encode(cinfo, st, 1);
669
- }
670
-
671
- return TRUE;
672
- }
673
-
674
-
675
- /*
676
- * Encode and output one MCU's worth of arithmetic-compressed coefficients.
677
- */
678
-
679
- METHODDEF(boolean)
680
- encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
681
- {
682
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
683
- jpeg_component_info * compptr;
684
- JBLOCKROW block;
685
- unsigned char *st;
686
- int blkn, ci, tbl, k, ke;
687
- int v, v2, m;
688
-
689
- /* Emit restart marker if needed */
690
- if (cinfo->restart_interval) {
691
- if (entropy->restarts_to_go == 0) {
692
- emit_restart(cinfo, entropy->next_restart_num);
693
- entropy->restarts_to_go = cinfo->restart_interval;
694
- entropy->next_restart_num++;
695
- entropy->next_restart_num &= 7;
696
- }
697
- entropy->restarts_to_go--;
698
- }
699
-
700
- /* Encode the MCU data blocks */
701
- for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
702
- block = MCU_data[blkn];
703
- ci = cinfo->MCU_membership[blkn];
704
- compptr = cinfo->cur_comp_info[ci];
705
-
706
- /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
707
-
708
- tbl = compptr->dc_tbl_no;
709
-
710
- /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
711
- st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
712
-
713
- /* Figure F.4: Encode_DC_DIFF */
714
- if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
715
- arith_encode(cinfo, st, 0);
716
- entropy->dc_context[ci] = 0; /* zero diff category */
717
- } else {
718
- entropy->last_dc_val[ci] = (*block)[0];
719
- arith_encode(cinfo, st, 1);
720
- /* Figure F.6: Encoding nonzero value v */
721
- /* Figure F.7: Encoding the sign of v */
722
- if (v > 0) {
723
- arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
724
- st += 2; /* Table F.4: SP = S0 + 2 */
725
- entropy->dc_context[ci] = 4; /* small positive diff category */
726
- } else {
727
- v = -v;
728
- arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
729
- st += 3; /* Table F.4: SN = S0 + 3 */
730
- entropy->dc_context[ci] = 8; /* small negative diff category */
731
- }
732
- /* Figure F.8: Encoding the magnitude category of v */
733
- m = 0;
734
- if (v -= 1) {
735
- arith_encode(cinfo, st, 1);
736
- m = 1;
737
- v2 = v;
738
- st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
739
- while (v2 >>= 1) {
740
- arith_encode(cinfo, st, 1);
741
- m <<= 1;
742
- st += 1;
743
- }
744
- }
745
- arith_encode(cinfo, st, 0);
746
- /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
747
- if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
748
- entropy->dc_context[ci] = 0; /* zero diff category */
749
- else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
750
- entropy->dc_context[ci] += 8; /* large diff category */
751
- /* Figure F.9: Encoding the magnitude bit pattern of v */
752
- st += 14;
753
- while (m >>= 1)
754
- arith_encode(cinfo, st, (m & v) ? 1 : 0);
755
- }
756
-
757
- /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
758
-
759
- tbl = compptr->ac_tbl_no;
760
-
761
- /* Establish EOB (end-of-block) index */
762
- for (ke = DCTSIZE2; ke > 1; ke--)
763
- if ((*block)[jpeg_natural_order[ke - 1]]) break;
764
-
765
- /* Figure F.5: Encode_AC_Coefficients */
766
- for (k = 1; k < ke; k++) {
767
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
768
- arith_encode(cinfo, st, 0); /* EOB decision */
769
- while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
770
- arith_encode(cinfo, st + 1, 0); st += 3; k++;
771
- }
772
- arith_encode(cinfo, st + 1, 1);
773
- /* Figure F.6: Encoding nonzero value v */
774
- /* Figure F.7: Encoding the sign of v */
775
- entropy->ac_stats[tbl][245] = 0;
776
- if (v > 0) {
777
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
778
- } else {
779
- v = -v;
780
- arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
781
- }
782
- st += 2;
783
- /* Figure F.8: Encoding the magnitude category of v */
784
- m = 0;
785
- if (v -= 1) {
786
- arith_encode(cinfo, st, 1);
787
- m = 1;
788
- v2 = v;
789
- if (v2 >>= 1) {
790
- arith_encode(cinfo, st, 1);
791
- m <<= 1;
792
- st = entropy->ac_stats[tbl] +
793
- (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
794
- while (v2 >>= 1) {
795
- arith_encode(cinfo, st, 1);
796
- m <<= 1;
797
- st += 1;
798
- }
799
- }
800
- }
801
- arith_encode(cinfo, st, 0);
802
- /* Figure F.9: Encoding the magnitude bit pattern of v */
803
- st += 14;
804
- while (m >>= 1)
805
- arith_encode(cinfo, st, (m & v) ? 1 : 0);
806
- }
807
- /* Encode EOB decision only if k < DCTSIZE2 */
808
- if (k < DCTSIZE2) {
809
- st = entropy->ac_stats[tbl] + 3 * (k - 1);
810
- arith_encode(cinfo, st, 1);
811
- }
812
- }
813
-
814
- return TRUE;
815
- }
816
-
817
-
818
- /*
819
- * Initialize for an arithmetic-compressed scan.
820
- */
821
-
822
- METHODDEF(void)
823
- start_pass (j_compress_ptr cinfo, boolean gather_statistics)
824
- {
825
- arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
826
- int ci, tbl;
827
- jpeg_component_info * compptr;
828
-
829
- if (gather_statistics)
830
- /* Make sure to avoid that in the master control logic!
831
- * We are fully adaptive here and need no extra
832
- * statistics gathering pass!
833
- */
834
- ERREXIT(cinfo, JERR_NOT_COMPILED);
835
-
836
- /* We assume jcmaster.c already validated the progressive scan parameters. */
837
-
838
- /* Select execution routines */
839
- if (cinfo->progressive_mode) {
840
- if (cinfo->Ah == 0) {
841
- if (cinfo->Ss == 0)
842
- entropy->pub.encode_mcu = encode_mcu_DC_first;
843
- else
844
- entropy->pub.encode_mcu = encode_mcu_AC_first;
845
- } else {
846
- if (cinfo->Ss == 0)
847
- entropy->pub.encode_mcu = encode_mcu_DC_refine;
848
- else
849
- entropy->pub.encode_mcu = encode_mcu_AC_refine;
850
- }
851
- } else
852
- entropy->pub.encode_mcu = encode_mcu;
853
-
854
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
855
- compptr = cinfo->cur_comp_info[ci];
856
- /* Allocate & initialize requested statistics areas */
857
- if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
858
- tbl = compptr->dc_tbl_no;
859
- if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
860
- ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
861
- if (entropy->dc_stats[tbl] == NULL)
862
- entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
863
- ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
864
- MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
865
- /* Initialize DC predictions to 0 */
866
- entropy->last_dc_val[ci] = 0;
867
- entropy->dc_context[ci] = 0;
868
- }
869
- if (cinfo->progressive_mode == 0 || cinfo->Ss) {
870
- tbl = compptr->ac_tbl_no;
871
- if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
872
- ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
873
- if (entropy->ac_stats[tbl] == NULL)
874
- entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
875
- ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
876
- MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
877
- #ifdef CALCULATE_SPECTRAL_CONDITIONING
878
- if (cinfo->progressive_mode)
879
- /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
880
- cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
881
- #endif
882
- }
883
- }
884
-
885
- /* Initialize arithmetic encoding variables */
886
- entropy->c = 0;
887
- entropy->a = 0x10000L;
888
- entropy->sc = 0;
889
- entropy->zc = 0;
890
- entropy->ct = 11;
891
- entropy->buffer = -1; /* empty */
892
-
893
- /* Initialize restart stuff */
894
- entropy->restarts_to_go = cinfo->restart_interval;
895
- entropy->next_restart_num = 0;
896
- }
897
-
898
-
899
- /*
900
- * Module initialization routine for arithmetic entropy encoding.
901
- */
902
-
903
- GLOBAL(void)
904
- jinit_arith_encoder (j_compress_ptr cinfo)
905
- {
906
- arith_entropy_ptr entropy;
907
- int i;
908
-
909
- entropy = (arith_entropy_ptr)
910
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
911
- SIZEOF(arith_entropy_encoder));
912
- cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
913
- entropy->pub.start_pass = start_pass;
914
- entropy->pub.finish_pass = finish_pass;
915
-
916
- /* Mark tables unallocated */
917
- for (i = 0; i < NUM_ARITH_TBLS; i++) {
918
- entropy->dc_stats[i] = NULL;
919
- entropy->ac_stats[i] = NULL;
920
- }
921
- }