isbn 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
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/jdinput.c DELETED
@@ -1,384 +0,0 @@
1
- /*
2
- * jdinput.c
3
- *
4
- * Copyright (C) 1991-1997, Thomas G. Lane.
5
- * Modified 2002-2009 by Guido Vollbeding.
6
- * This file is part of the Independent JPEG Group's software.
7
- * For conditions of distribution and use, see the accompanying README file.
8
- *
9
- * This file contains input control logic for the JPEG decompressor.
10
- * These routines are concerned with controlling the decompressor's input
11
- * processing (marker reading and coefficient decoding). The actual input
12
- * reading is done in jdmarker.c, jdhuff.c, and jdarith.c.
13
- */
14
-
15
- #define JPEG_INTERNALS
16
- #include "jinclude.h"
17
- #include "jpeglib.h"
18
-
19
-
20
- /* Private state */
21
-
22
- typedef struct {
23
- struct jpeg_input_controller pub; /* public fields */
24
-
25
- boolean inheaders; /* TRUE until first SOS is reached */
26
- } my_input_controller;
27
-
28
- typedef my_input_controller * my_inputctl_ptr;
29
-
30
-
31
- /* Forward declarations */
32
- METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
33
-
34
-
35
- /*
36
- * Routines to calculate various quantities related to the size of the image.
37
- */
38
-
39
- LOCAL(void)
40
- initial_setup (j_decompress_ptr cinfo)
41
- /* Called once, when first SOS marker is reached */
42
- {
43
- int ci;
44
- jpeg_component_info *compptr;
45
-
46
- /* Make sure image isn't bigger than I can handle */
47
- if ((long) cinfo->image_height > (long) JPEG_MAX_DIMENSION ||
48
- (long) cinfo->image_width > (long) JPEG_MAX_DIMENSION)
49
- ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
50
-
51
- /* For now, precision must match compiled-in value... */
52
- if (cinfo->data_precision != BITS_IN_JSAMPLE)
53
- ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
54
-
55
- /* Check that number of components won't exceed internal array sizes */
56
- if (cinfo->num_components > MAX_COMPONENTS)
57
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
58
- MAX_COMPONENTS);
59
-
60
- /* Compute maximum sampling factors; check factor validity */
61
- cinfo->max_h_samp_factor = 1;
62
- cinfo->max_v_samp_factor = 1;
63
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
64
- ci++, compptr++) {
65
- if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
66
- compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
67
- ERREXIT(cinfo, JERR_BAD_SAMPLING);
68
- cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
69
- compptr->h_samp_factor);
70
- cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
71
- compptr->v_samp_factor);
72
- }
73
-
74
- /* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE.
75
- * In the full decompressor, this will be overridden by jdmaster.c;
76
- * but in the transcoder, jdmaster.c is not used, so we must do it here.
77
- */
78
- cinfo->min_DCT_h_scaled_size = DCTSIZE;
79
- cinfo->min_DCT_v_scaled_size = DCTSIZE;
80
-
81
- /* Compute dimensions of components */
82
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
83
- ci++, compptr++) {
84
- compptr->DCT_h_scaled_size = DCTSIZE;
85
- compptr->DCT_v_scaled_size = DCTSIZE;
86
- /* Size in DCT blocks */
87
- compptr->width_in_blocks = (JDIMENSION)
88
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
89
- (long) (cinfo->max_h_samp_factor * DCTSIZE));
90
- compptr->height_in_blocks = (JDIMENSION)
91
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
92
- (long) (cinfo->max_v_samp_factor * DCTSIZE));
93
- /* downsampled_width and downsampled_height will also be overridden by
94
- * jdmaster.c if we are doing full decompression. The transcoder library
95
- * doesn't use these values, but the calling application might.
96
- */
97
- /* Size in samples */
98
- compptr->downsampled_width = (JDIMENSION)
99
- jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
100
- (long) cinfo->max_h_samp_factor);
101
- compptr->downsampled_height = (JDIMENSION)
102
- jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
103
- (long) cinfo->max_v_samp_factor);
104
- /* Mark component needed, until color conversion says otherwise */
105
- compptr->component_needed = TRUE;
106
- /* Mark no quantization table yet saved for component */
107
- compptr->quant_table = NULL;
108
- }
109
-
110
- /* Compute number of fully interleaved MCU rows. */
111
- cinfo->total_iMCU_rows = (JDIMENSION)
112
- jdiv_round_up((long) cinfo->image_height,
113
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
114
-
115
- /* Decide whether file contains multiple scans */
116
- if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
117
- cinfo->inputctl->has_multiple_scans = TRUE;
118
- else
119
- cinfo->inputctl->has_multiple_scans = FALSE;
120
- }
121
-
122
-
123
- LOCAL(void)
124
- per_scan_setup (j_decompress_ptr cinfo)
125
- /* Do computations that are needed before processing a JPEG scan */
126
- /* cinfo->comps_in_scan and cinfo->cur_comp_info[] were set from SOS marker */
127
- {
128
- int ci, mcublks, tmp;
129
- jpeg_component_info *compptr;
130
-
131
- if (cinfo->comps_in_scan == 1) {
132
-
133
- /* Noninterleaved (single-component) scan */
134
- compptr = cinfo->cur_comp_info[0];
135
-
136
- /* Overall image size in MCUs */
137
- cinfo->MCUs_per_row = compptr->width_in_blocks;
138
- cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
139
-
140
- /* For noninterleaved scan, always one block per MCU */
141
- compptr->MCU_width = 1;
142
- compptr->MCU_height = 1;
143
- compptr->MCU_blocks = 1;
144
- compptr->MCU_sample_width = compptr->DCT_h_scaled_size;
145
- compptr->last_col_width = 1;
146
- /* For noninterleaved scans, it is convenient to define last_row_height
147
- * as the number of block rows present in the last iMCU row.
148
- */
149
- tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
150
- if (tmp == 0) tmp = compptr->v_samp_factor;
151
- compptr->last_row_height = tmp;
152
-
153
- /* Prepare array describing MCU composition */
154
- cinfo->blocks_in_MCU = 1;
155
- cinfo->MCU_membership[0] = 0;
156
-
157
- } else {
158
-
159
- /* Interleaved (multi-component) scan */
160
- if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
161
- ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
162
- MAX_COMPS_IN_SCAN);
163
-
164
- /* Overall image size in MCUs */
165
- cinfo->MCUs_per_row = (JDIMENSION)
166
- jdiv_round_up((long) cinfo->image_width,
167
- (long) (cinfo->max_h_samp_factor*DCTSIZE));
168
- cinfo->MCU_rows_in_scan = (JDIMENSION)
169
- jdiv_round_up((long) cinfo->image_height,
170
- (long) (cinfo->max_v_samp_factor*DCTSIZE));
171
-
172
- cinfo->blocks_in_MCU = 0;
173
-
174
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
175
- compptr = cinfo->cur_comp_info[ci];
176
- /* Sampling factors give # of blocks of component in each MCU */
177
- compptr->MCU_width = compptr->h_samp_factor;
178
- compptr->MCU_height = compptr->v_samp_factor;
179
- compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
180
- compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size;
181
- /* Figure number of non-dummy blocks in last MCU column & row */
182
- tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
183
- if (tmp == 0) tmp = compptr->MCU_width;
184
- compptr->last_col_width = tmp;
185
- tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
186
- if (tmp == 0) tmp = compptr->MCU_height;
187
- compptr->last_row_height = tmp;
188
- /* Prepare array describing MCU composition */
189
- mcublks = compptr->MCU_blocks;
190
- if (cinfo->blocks_in_MCU + mcublks > D_MAX_BLOCKS_IN_MCU)
191
- ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
192
- while (mcublks-- > 0) {
193
- cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
194
- }
195
- }
196
-
197
- }
198
- }
199
-
200
-
201
- /*
202
- * Save away a copy of the Q-table referenced by each component present
203
- * in the current scan, unless already saved during a prior scan.
204
- *
205
- * In a multiple-scan JPEG file, the encoder could assign different components
206
- * the same Q-table slot number, but change table definitions between scans
207
- * so that each component uses a different Q-table. (The IJG encoder is not
208
- * currently capable of doing this, but other encoders might.) Since we want
209
- * to be able to dequantize all the components at the end of the file, this
210
- * means that we have to save away the table actually used for each component.
211
- * We do this by copying the table at the start of the first scan containing
212
- * the component.
213
- * The JPEG spec prohibits the encoder from changing the contents of a Q-table
214
- * slot between scans of a component using that slot. If the encoder does so
215
- * anyway, this decoder will simply use the Q-table values that were current
216
- * at the start of the first scan for the component.
217
- *
218
- * The decompressor output side looks only at the saved quant tables,
219
- * not at the current Q-table slots.
220
- */
221
-
222
- LOCAL(void)
223
- latch_quant_tables (j_decompress_ptr cinfo)
224
- {
225
- int ci, qtblno;
226
- jpeg_component_info *compptr;
227
- JQUANT_TBL * qtbl;
228
-
229
- for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
230
- compptr = cinfo->cur_comp_info[ci];
231
- /* No work if we already saved Q-table for this component */
232
- if (compptr->quant_table != NULL)
233
- continue;
234
- /* Make sure specified quantization table is present */
235
- qtblno = compptr->quant_tbl_no;
236
- if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
237
- cinfo->quant_tbl_ptrs[qtblno] == NULL)
238
- ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
239
- /* OK, save away the quantization table */
240
- qtbl = (JQUANT_TBL *)
241
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
242
- SIZEOF(JQUANT_TBL));
243
- MEMCOPY(qtbl, cinfo->quant_tbl_ptrs[qtblno], SIZEOF(JQUANT_TBL));
244
- compptr->quant_table = qtbl;
245
- }
246
- }
247
-
248
-
249
- /*
250
- * Initialize the input modules to read a scan of compressed data.
251
- * The first call to this is done by jdmaster.c after initializing
252
- * the entire decompressor (during jpeg_start_decompress).
253
- * Subsequent calls come from consume_markers, below.
254
- */
255
-
256
- METHODDEF(void)
257
- start_input_pass (j_decompress_ptr cinfo)
258
- {
259
- per_scan_setup(cinfo);
260
- latch_quant_tables(cinfo);
261
- (*cinfo->entropy->start_pass) (cinfo);
262
- (*cinfo->coef->start_input_pass) (cinfo);
263
- cinfo->inputctl->consume_input = cinfo->coef->consume_data;
264
- }
265
-
266
-
267
- /*
268
- * Finish up after inputting a compressed-data scan.
269
- * This is called by the coefficient controller after it's read all
270
- * the expected data of the scan.
271
- */
272
-
273
- METHODDEF(void)
274
- finish_input_pass (j_decompress_ptr cinfo)
275
- {
276
- cinfo->inputctl->consume_input = consume_markers;
277
- }
278
-
279
-
280
- /*
281
- * Read JPEG markers before, between, or after compressed-data scans.
282
- * Change state as necessary when a new scan is reached.
283
- * Return value is JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
284
- *
285
- * The consume_input method pointer points either here or to the
286
- * coefficient controller's consume_data routine, depending on whether
287
- * we are reading a compressed data segment or inter-segment markers.
288
- */
289
-
290
- METHODDEF(int)
291
- consume_markers (j_decompress_ptr cinfo)
292
- {
293
- my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
294
- int val;
295
-
296
- if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
297
- return JPEG_REACHED_EOI;
298
-
299
- val = (*cinfo->marker->read_markers) (cinfo);
300
-
301
- switch (val) {
302
- case JPEG_REACHED_SOS: /* Found SOS */
303
- if (inputctl->inheaders) { /* 1st SOS */
304
- initial_setup(cinfo);
305
- inputctl->inheaders = FALSE;
306
- /* Note: start_input_pass must be called by jdmaster.c
307
- * before any more input can be consumed. jdapimin.c is
308
- * responsible for enforcing this sequencing.
309
- */
310
- } else { /* 2nd or later SOS marker */
311
- if (! inputctl->pub.has_multiple_scans)
312
- ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
313
- start_input_pass(cinfo);
314
- }
315
- break;
316
- case JPEG_REACHED_EOI: /* Found EOI */
317
- inputctl->pub.eoi_reached = TRUE;
318
- if (inputctl->inheaders) { /* Tables-only datastream, apparently */
319
- if (cinfo->marker->saw_SOF)
320
- ERREXIT(cinfo, JERR_SOF_NO_SOS);
321
- } else {
322
- /* Prevent infinite loop in coef ctlr's decompress_data routine
323
- * if user set output_scan_number larger than number of scans.
324
- */
325
- if (cinfo->output_scan_number > cinfo->input_scan_number)
326
- cinfo->output_scan_number = cinfo->input_scan_number;
327
- }
328
- break;
329
- case JPEG_SUSPENDED:
330
- break;
331
- }
332
-
333
- return val;
334
- }
335
-
336
-
337
- /*
338
- * Reset state to begin a fresh datastream.
339
- */
340
-
341
- METHODDEF(void)
342
- reset_input_controller (j_decompress_ptr cinfo)
343
- {
344
- my_inputctl_ptr inputctl = (my_inputctl_ptr) cinfo->inputctl;
345
-
346
- inputctl->pub.consume_input = consume_markers;
347
- inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
348
- inputctl->pub.eoi_reached = FALSE;
349
- inputctl->inheaders = TRUE;
350
- /* Reset other modules */
351
- (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
352
- (*cinfo->marker->reset_marker_reader) (cinfo);
353
- /* Reset progression state -- would be cleaner if entropy decoder did this */
354
- cinfo->coef_bits = NULL;
355
- }
356
-
357
-
358
- /*
359
- * Initialize the input controller module.
360
- * This is called only once, when the decompression object is created.
361
- */
362
-
363
- GLOBAL(void)
364
- jinit_input_controller (j_decompress_ptr cinfo)
365
- {
366
- my_inputctl_ptr inputctl;
367
-
368
- /* Create subobject in permanent pool */
369
- inputctl = (my_inputctl_ptr)
370
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
371
- SIZEOF(my_input_controller));
372
- cinfo->inputctl = (struct jpeg_input_controller *) inputctl;
373
- /* Initialize method pointers */
374
- inputctl->pub.consume_input = consume_markers;
375
- inputctl->pub.reset_input_controller = reset_input_controller;
376
- inputctl->pub.start_input_pass = start_input_pass;
377
- inputctl->pub.finish_input_pass = finish_input_pass;
378
- /* Initialize state: can't use reset_input_controller since we don't
379
- * want to try to reset other modules yet.
380
- */
381
- inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
382
- inputctl->pub.eoi_reached = FALSE;
383
- inputctl->inheaders = TRUE;
384
- }
@@ -1,512 +0,0 @@
1
- /*
2
- * jdmainct.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 decompression.
9
- * The main buffer lies between the JPEG decompressor proper and the
10
- * post-processor; it holds downsampled data in the JPEG colorspace.
11
- *
12
- * Note that this code is bypassed in raw-data mode, since the application
13
- * supplies the equivalent of the main buffer in that case.
14
- */
15
-
16
- #define JPEG_INTERNALS
17
- #include "jinclude.h"
18
- #include "jpeglib.h"
19
-
20
-
21
- /*
22
- * In the current system design, the main buffer need never be a full-image
23
- * buffer; any full-height buffers will be found inside the coefficient or
24
- * postprocessing controllers. Nonetheless, the main controller is not
25
- * trivial. Its responsibility is to provide context rows for upsampling/
26
- * rescaling, and doing this in an efficient fashion is a bit tricky.
27
- *
28
- * Postprocessor input data is counted in "row groups". A row group
29
- * is defined to be (v_samp_factor * DCT_scaled_size / min_DCT_scaled_size)
30
- * sample rows of each component. (We require DCT_scaled_size values to be
31
- * chosen such that these numbers are integers. In practice DCT_scaled_size
32
- * values will likely be powers of two, so we actually have the stronger
33
- * condition that DCT_scaled_size / min_DCT_scaled_size is an integer.)
34
- * Upsampling will typically produce max_v_samp_factor pixel rows from each
35
- * row group (times any additional scale factor that the upsampler is
36
- * applying).
37
- *
38
- * The coefficient controller will deliver data to us one iMCU row at a time;
39
- * each iMCU row contains v_samp_factor * DCT_scaled_size sample rows, or
40
- * exactly min_DCT_scaled_size row groups. (This amount of data corresponds
41
- * to one row of MCUs when the image is fully interleaved.) Note that the
42
- * number of sample rows varies across components, but the number of row
43
- * groups does not. Some garbage sample rows may be included in the last iMCU
44
- * row at the bottom of the image.
45
- *
46
- * Depending on the vertical scaling algorithm used, the upsampler may need
47
- * access to the sample row(s) above and below its current input row group.
48
- * The upsampler is required to set need_context_rows TRUE at global selection
49
- * time if so. When need_context_rows is FALSE, this controller can simply
50
- * obtain one iMCU row at a time from the coefficient controller and dole it
51
- * out as row groups to the postprocessor.
52
- *
53
- * When need_context_rows is TRUE, this controller guarantees that the buffer
54
- * passed to postprocessing contains at least one row group's worth of samples
55
- * above and below the row group(s) being processed. Note that the context
56
- * rows "above" the first passed row group appear at negative row offsets in
57
- * the passed buffer. At the top and bottom of the image, the required
58
- * context rows are manufactured by duplicating the first or last real sample
59
- * row; this avoids having special cases in the upsampling inner loops.
60
- *
61
- * The amount of context is fixed at one row group just because that's a
62
- * convenient number for this controller to work with. The existing
63
- * upsamplers really only need one sample row of context. An upsampler
64
- * supporting arbitrary output rescaling might wish for more than one row
65
- * group of context when shrinking the image; tough, we don't handle that.
66
- * (This is justified by the assumption that downsizing will be handled mostly
67
- * by adjusting the DCT_scaled_size values, so that the actual scale factor at
68
- * the upsample step needn't be much less than one.)
69
- *
70
- * To provide the desired context, we have to retain the last two row groups
71
- * of one iMCU row while reading in the next iMCU row. (The last row group
72
- * can't be processed until we have another row group for its below-context,
73
- * and so we have to save the next-to-last group too for its above-context.)
74
- * We could do this most simply by copying data around in our buffer, but
75
- * that'd be very slow. We can avoid copying any data by creating a rather
76
- * strange pointer structure. Here's how it works. We allocate a workspace
77
- * consisting of M+2 row groups (where M = min_DCT_scaled_size is the number
78
- * of row groups per iMCU row). We create two sets of redundant pointers to
79
- * the workspace. Labeling the physical row groups 0 to M+1, the synthesized
80
- * pointer lists look like this:
81
- * M+1 M-1
82
- * master pointer --> 0 master pointer --> 0
83
- * 1 1
84
- * ... ...
85
- * M-3 M-3
86
- * M-2 M
87
- * M-1 M+1
88
- * M M-2
89
- * M+1 M-1
90
- * 0 0
91
- * We read alternate iMCU rows using each master pointer; thus the last two
92
- * row groups of the previous iMCU row remain un-overwritten in the workspace.
93
- * The pointer lists are set up so that the required context rows appear to
94
- * be adjacent to the proper places when we pass the pointer lists to the
95
- * upsampler.
96
- *
97
- * The above pictures describe the normal state of the pointer lists.
98
- * At top and bottom of the image, we diddle the pointer lists to duplicate
99
- * the first or last sample row as necessary (this is cheaper than copying
100
- * sample rows around).
101
- *
102
- * This scheme breaks down if M < 2, ie, min_DCT_scaled_size is 1. In that
103
- * situation each iMCU row provides only one row group so the buffering logic
104
- * must be different (eg, we must read two iMCU rows before we can emit the
105
- * first row group). For now, we simply do not support providing context
106
- * rows when min_DCT_scaled_size is 1. That combination seems unlikely to
107
- * be worth providing --- if someone wants a 1/8th-size preview, they probably
108
- * want it quick and dirty, so a context-free upsampler is sufficient.
109
- */
110
-
111
-
112
- /* Private buffer controller object */
113
-
114
- typedef struct {
115
- struct jpeg_d_main_controller pub; /* public fields */
116
-
117
- /* Pointer to allocated workspace (M or M+2 row groups). */
118
- JSAMPARRAY buffer[MAX_COMPONENTS];
119
-
120
- boolean buffer_full; /* Have we gotten an iMCU row from decoder? */
121
- JDIMENSION rowgroup_ctr; /* counts row groups output to postprocessor */
122
-
123
- /* Remaining fields are only used in the context case. */
124
-
125
- /* These are the master pointers to the funny-order pointer lists. */
126
- JSAMPIMAGE xbuffer[2]; /* pointers to weird pointer lists */
127
-
128
- int whichptr; /* indicates which pointer set is now in use */
129
- int context_state; /* process_data state machine status */
130
- JDIMENSION rowgroups_avail; /* row groups available to postprocessor */
131
- JDIMENSION iMCU_row_ctr; /* counts iMCU rows to detect image top/bot */
132
- } my_main_controller;
133
-
134
- typedef my_main_controller * my_main_ptr;
135
-
136
- /* context_state values: */
137
- #define CTX_PREPARE_FOR_IMCU 0 /* need to prepare for MCU row */
138
- #define CTX_PROCESS_IMCU 1 /* feeding iMCU to postprocessor */
139
- #define CTX_POSTPONED_ROW 2 /* feeding postponed row group */
140
-
141
-
142
- /* Forward declarations */
143
- METHODDEF(void) process_data_simple_main
144
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
145
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
146
- METHODDEF(void) process_data_context_main
147
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
148
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
149
- #ifdef QUANT_2PASS_SUPPORTED
150
- METHODDEF(void) process_data_crank_post
151
- JPP((j_decompress_ptr cinfo, JSAMPARRAY output_buf,
152
- JDIMENSION *out_row_ctr, JDIMENSION out_rows_avail));
153
- #endif
154
-
155
-
156
- LOCAL(void)
157
- alloc_funny_pointers (j_decompress_ptr cinfo)
158
- /* Allocate space for the funny pointer lists.
159
- * This is done only once, not once per pass.
160
- */
161
- {
162
- my_main_ptr main = (my_main_ptr) cinfo->main;
163
- int ci, rgroup;
164
- int M = cinfo->min_DCT_v_scaled_size;
165
- jpeg_component_info *compptr;
166
- JSAMPARRAY xbuf;
167
-
168
- /* Get top-level space for component array pointers.
169
- * We alloc both arrays with one call to save a few cycles.
170
- */
171
- main->xbuffer[0] = (JSAMPIMAGE)
172
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
173
- cinfo->num_components * 2 * SIZEOF(JSAMPARRAY));
174
- main->xbuffer[1] = main->xbuffer[0] + cinfo->num_components;
175
-
176
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
177
- ci++, compptr++) {
178
- rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
179
- cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
180
- /* Get space for pointer lists --- M+4 row groups in each list.
181
- * We alloc both pointer lists with one call to save a few cycles.
182
- */
183
- xbuf = (JSAMPARRAY)
184
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
185
- 2 * (rgroup * (M + 4)) * SIZEOF(JSAMPROW));
186
- xbuf += rgroup; /* want one row group at negative offsets */
187
- main->xbuffer[0][ci] = xbuf;
188
- xbuf += rgroup * (M + 4);
189
- main->xbuffer[1][ci] = xbuf;
190
- }
191
- }
192
-
193
-
194
- LOCAL(void)
195
- make_funny_pointers (j_decompress_ptr cinfo)
196
- /* Create the funny pointer lists discussed in the comments above.
197
- * The actual workspace is already allocated (in main->buffer),
198
- * and the space for the pointer lists is allocated too.
199
- * This routine just fills in the curiously ordered lists.
200
- * This will be repeated at the beginning of each pass.
201
- */
202
- {
203
- my_main_ptr main = (my_main_ptr) cinfo->main;
204
- int ci, i, rgroup;
205
- int M = cinfo->min_DCT_v_scaled_size;
206
- jpeg_component_info *compptr;
207
- JSAMPARRAY buf, xbuf0, xbuf1;
208
-
209
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
210
- ci++, compptr++) {
211
- rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
212
- cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
213
- xbuf0 = main->xbuffer[0][ci];
214
- xbuf1 = main->xbuffer[1][ci];
215
- /* First copy the workspace pointers as-is */
216
- buf = main->buffer[ci];
217
- for (i = 0; i < rgroup * (M + 2); i++) {
218
- xbuf0[i] = xbuf1[i] = buf[i];
219
- }
220
- /* In the second list, put the last four row groups in swapped order */
221
- for (i = 0; i < rgroup * 2; i++) {
222
- xbuf1[rgroup*(M-2) + i] = buf[rgroup*M + i];
223
- xbuf1[rgroup*M + i] = buf[rgroup*(M-2) + i];
224
- }
225
- /* The wraparound pointers at top and bottom will be filled later
226
- * (see set_wraparound_pointers, below). Initially we want the "above"
227
- * pointers to duplicate the first actual data line. This only needs
228
- * to happen in xbuffer[0].
229
- */
230
- for (i = 0; i < rgroup; i++) {
231
- xbuf0[i - rgroup] = xbuf0[0];
232
- }
233
- }
234
- }
235
-
236
-
237
- LOCAL(void)
238
- set_wraparound_pointers (j_decompress_ptr cinfo)
239
- /* Set up the "wraparound" pointers at top and bottom of the pointer lists.
240
- * This changes the pointer list state from top-of-image to the normal state.
241
- */
242
- {
243
- my_main_ptr main = (my_main_ptr) cinfo->main;
244
- int ci, i, rgroup;
245
- int M = cinfo->min_DCT_v_scaled_size;
246
- jpeg_component_info *compptr;
247
- JSAMPARRAY xbuf0, xbuf1;
248
-
249
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
250
- ci++, compptr++) {
251
- rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
252
- cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
253
- xbuf0 = main->xbuffer[0][ci];
254
- xbuf1 = main->xbuffer[1][ci];
255
- for (i = 0; i < rgroup; i++) {
256
- xbuf0[i - rgroup] = xbuf0[rgroup*(M+1) + i];
257
- xbuf1[i - rgroup] = xbuf1[rgroup*(M+1) + i];
258
- xbuf0[rgroup*(M+2) + i] = xbuf0[i];
259
- xbuf1[rgroup*(M+2) + i] = xbuf1[i];
260
- }
261
- }
262
- }
263
-
264
-
265
- LOCAL(void)
266
- set_bottom_pointers (j_decompress_ptr cinfo)
267
- /* Change the pointer lists to duplicate the last sample row at the bottom
268
- * of the image. whichptr indicates which xbuffer holds the final iMCU row.
269
- * Also sets rowgroups_avail to indicate number of nondummy row groups in row.
270
- */
271
- {
272
- my_main_ptr main = (my_main_ptr) cinfo->main;
273
- int ci, i, rgroup, iMCUheight, rows_left;
274
- jpeg_component_info *compptr;
275
- JSAMPARRAY xbuf;
276
-
277
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
278
- ci++, compptr++) {
279
- /* Count sample rows in one iMCU row and in one row group */
280
- iMCUheight = compptr->v_samp_factor * compptr->DCT_v_scaled_size;
281
- rgroup = iMCUheight / cinfo->min_DCT_v_scaled_size;
282
- /* Count nondummy sample rows remaining for this component */
283
- rows_left = (int) (compptr->downsampled_height % (JDIMENSION) iMCUheight);
284
- if (rows_left == 0) rows_left = iMCUheight;
285
- /* Count nondummy row groups. Should get same answer for each component,
286
- * so we need only do it once.
287
- */
288
- if (ci == 0) {
289
- main->rowgroups_avail = (JDIMENSION) ((rows_left-1) / rgroup + 1);
290
- }
291
- /* Duplicate the last real sample row rgroup*2 times; this pads out the
292
- * last partial rowgroup and ensures at least one full rowgroup of context.
293
- */
294
- xbuf = main->xbuffer[main->whichptr][ci];
295
- for (i = 0; i < rgroup * 2; i++) {
296
- xbuf[rows_left + i] = xbuf[rows_left-1];
297
- }
298
- }
299
- }
300
-
301
-
302
- /*
303
- * Initialize for a processing pass.
304
- */
305
-
306
- METHODDEF(void)
307
- start_pass_main (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)
308
- {
309
- my_main_ptr main = (my_main_ptr) cinfo->main;
310
-
311
- switch (pass_mode) {
312
- case JBUF_PASS_THRU:
313
- if (cinfo->upsample->need_context_rows) {
314
- main->pub.process_data = process_data_context_main;
315
- make_funny_pointers(cinfo); /* Create the xbuffer[] lists */
316
- main->whichptr = 0; /* Read first iMCU row into xbuffer[0] */
317
- main->context_state = CTX_PREPARE_FOR_IMCU;
318
- main->iMCU_row_ctr = 0;
319
- } else {
320
- /* Simple case with no context needed */
321
- main->pub.process_data = process_data_simple_main;
322
- }
323
- main->buffer_full = FALSE; /* Mark buffer empty */
324
- main->rowgroup_ctr = 0;
325
- break;
326
- #ifdef QUANT_2PASS_SUPPORTED
327
- case JBUF_CRANK_DEST:
328
- /* For last pass of 2-pass quantization, just crank the postprocessor */
329
- main->pub.process_data = process_data_crank_post;
330
- break;
331
- #endif
332
- default:
333
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
334
- break;
335
- }
336
- }
337
-
338
-
339
- /*
340
- * Process some data.
341
- * This handles the simple case where no context is required.
342
- */
343
-
344
- METHODDEF(void)
345
- process_data_simple_main (j_decompress_ptr cinfo,
346
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
347
- JDIMENSION out_rows_avail)
348
- {
349
- my_main_ptr main = (my_main_ptr) cinfo->main;
350
- JDIMENSION rowgroups_avail;
351
-
352
- /* Read input data if we haven't filled the main buffer yet */
353
- if (! main->buffer_full) {
354
- if (! (*cinfo->coef->decompress_data) (cinfo, main->buffer))
355
- return; /* suspension forced, can do nothing more */
356
- main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
357
- }
358
-
359
- /* There are always min_DCT_scaled_size row groups in an iMCU row. */
360
- rowgroups_avail = (JDIMENSION) cinfo->min_DCT_v_scaled_size;
361
- /* Note: at the bottom of the image, we may pass extra garbage row groups
362
- * to the postprocessor. The postprocessor has to check for bottom
363
- * of image anyway (at row resolution), so no point in us doing it too.
364
- */
365
-
366
- /* Feed the postprocessor */
367
- (*cinfo->post->post_process_data) (cinfo, main->buffer,
368
- &main->rowgroup_ctr, rowgroups_avail,
369
- output_buf, out_row_ctr, out_rows_avail);
370
-
371
- /* Has postprocessor consumed all the data yet? If so, mark buffer empty */
372
- if (main->rowgroup_ctr >= rowgroups_avail) {
373
- main->buffer_full = FALSE;
374
- main->rowgroup_ctr = 0;
375
- }
376
- }
377
-
378
-
379
- /*
380
- * Process some data.
381
- * This handles the case where context rows must be provided.
382
- */
383
-
384
- METHODDEF(void)
385
- process_data_context_main (j_decompress_ptr cinfo,
386
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
387
- JDIMENSION out_rows_avail)
388
- {
389
- my_main_ptr main = (my_main_ptr) cinfo->main;
390
-
391
- /* Read input data if we haven't filled the main buffer yet */
392
- if (! main->buffer_full) {
393
- if (! (*cinfo->coef->decompress_data) (cinfo,
394
- main->xbuffer[main->whichptr]))
395
- return; /* suspension forced, can do nothing more */
396
- main->buffer_full = TRUE; /* OK, we have an iMCU row to work with */
397
- main->iMCU_row_ctr++; /* count rows received */
398
- }
399
-
400
- /* Postprocessor typically will not swallow all the input data it is handed
401
- * in one call (due to filling the output buffer first). Must be prepared
402
- * to exit and restart. This switch lets us keep track of how far we got.
403
- * Note that each case falls through to the next on successful completion.
404
- */
405
- switch (main->context_state) {
406
- case CTX_POSTPONED_ROW:
407
- /* Call postprocessor using previously set pointers for postponed row */
408
- (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
409
- &main->rowgroup_ctr, main->rowgroups_avail,
410
- output_buf, out_row_ctr, out_rows_avail);
411
- if (main->rowgroup_ctr < main->rowgroups_avail)
412
- return; /* Need to suspend */
413
- main->context_state = CTX_PREPARE_FOR_IMCU;
414
- if (*out_row_ctr >= out_rows_avail)
415
- return; /* Postprocessor exactly filled output buf */
416
- /*FALLTHROUGH*/
417
- case CTX_PREPARE_FOR_IMCU:
418
- /* Prepare to process first M-1 row groups of this iMCU row */
419
- main->rowgroup_ctr = 0;
420
- main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size - 1);
421
- /* Check for bottom of image: if so, tweak pointers to "duplicate"
422
- * the last sample row, and adjust rowgroups_avail to ignore padding rows.
423
- */
424
- if (main->iMCU_row_ctr == cinfo->total_iMCU_rows)
425
- set_bottom_pointers(cinfo);
426
- main->context_state = CTX_PROCESS_IMCU;
427
- /*FALLTHROUGH*/
428
- case CTX_PROCESS_IMCU:
429
- /* Call postprocessor using previously set pointers */
430
- (*cinfo->post->post_process_data) (cinfo, main->xbuffer[main->whichptr],
431
- &main->rowgroup_ctr, main->rowgroups_avail,
432
- output_buf, out_row_ctr, out_rows_avail);
433
- if (main->rowgroup_ctr < main->rowgroups_avail)
434
- return; /* Need to suspend */
435
- /* After the first iMCU, change wraparound pointers to normal state */
436
- if (main->iMCU_row_ctr == 1)
437
- set_wraparound_pointers(cinfo);
438
- /* Prepare to load new iMCU row using other xbuffer list */
439
- main->whichptr ^= 1; /* 0=>1 or 1=>0 */
440
- main->buffer_full = FALSE;
441
- /* Still need to process last row group of this iMCU row, */
442
- /* which is saved at index M+1 of the other xbuffer */
443
- main->rowgroup_ctr = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 1);
444
- main->rowgroups_avail = (JDIMENSION) (cinfo->min_DCT_v_scaled_size + 2);
445
- main->context_state = CTX_POSTPONED_ROW;
446
- }
447
- }
448
-
449
-
450
- /*
451
- * Process some data.
452
- * Final pass of two-pass quantization: just call the postprocessor.
453
- * Source data will be the postprocessor controller's internal buffer.
454
- */
455
-
456
- #ifdef QUANT_2PASS_SUPPORTED
457
-
458
- METHODDEF(void)
459
- process_data_crank_post (j_decompress_ptr cinfo,
460
- JSAMPARRAY output_buf, JDIMENSION *out_row_ctr,
461
- JDIMENSION out_rows_avail)
462
- {
463
- (*cinfo->post->post_process_data) (cinfo, (JSAMPIMAGE) NULL,
464
- (JDIMENSION *) NULL, (JDIMENSION) 0,
465
- output_buf, out_row_ctr, out_rows_avail);
466
- }
467
-
468
- #endif /* QUANT_2PASS_SUPPORTED */
469
-
470
-
471
- /*
472
- * Initialize main buffer controller.
473
- */
474
-
475
- GLOBAL(void)
476
- jinit_d_main_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
477
- {
478
- my_main_ptr main;
479
- int ci, rgroup, ngroups;
480
- jpeg_component_info *compptr;
481
-
482
- main = (my_main_ptr)
483
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
484
- SIZEOF(my_main_controller));
485
- cinfo->main = (struct jpeg_d_main_controller *) main;
486
- main->pub.start_pass = start_pass_main;
487
-
488
- if (need_full_buffer) /* shouldn't happen */
489
- ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
490
-
491
- /* Allocate the workspace.
492
- * ngroups is the number of row groups we need.
493
- */
494
- if (cinfo->upsample->need_context_rows) {
495
- if (cinfo->min_DCT_v_scaled_size < 2) /* unsupported, see comments above */
496
- ERREXIT(cinfo, JERR_NOTIMPL);
497
- alloc_funny_pointers(cinfo); /* Alloc space for xbuffer[] lists */
498
- ngroups = cinfo->min_DCT_v_scaled_size + 2;
499
- } else {
500
- ngroups = cinfo->min_DCT_v_scaled_size;
501
- }
502
-
503
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
504
- ci++, compptr++) {
505
- rgroup = (compptr->v_samp_factor * compptr->DCT_v_scaled_size) /
506
- cinfo->min_DCT_v_scaled_size; /* height of a row group of component */
507
- main->buffer[ci] = (*cinfo->mem->alloc_sarray)
508
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
509
- compptr->width_in_blocks * compptr->DCT_h_scaled_size,
510
- (JDIMENSION) (rgroup * ngroups));
511
- }
512
- }