entangledstate-isbn 1.4.0 → 1.4.1

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