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
@@ -1,1360 +0,0 @@
1
- /*
2
- * jdmarker.c
3
- *
4
- * Copyright (C) 1991-1998, Thomas G. Lane.
5
- * This file is part of the Independent JPEG Group's software.
6
- * For conditions of distribution and use, see the accompanying README file.
7
- *
8
- * This file contains routines to decode JPEG datastream markers.
9
- * Most of the complexity arises from our desire to support input
10
- * suspension: if not all of the data for a marker is available,
11
- * we must exit back to the application. On resumption, we reprocess
12
- * the marker.
13
- */
14
-
15
- #define JPEG_INTERNALS
16
- #include "jinclude.h"
17
- #include "jpeglib.h"
18
-
19
-
20
- typedef enum { /* JPEG marker codes */
21
- M_SOF0 = 0xc0,
22
- M_SOF1 = 0xc1,
23
- M_SOF2 = 0xc2,
24
- M_SOF3 = 0xc3,
25
-
26
- M_SOF5 = 0xc5,
27
- M_SOF6 = 0xc6,
28
- M_SOF7 = 0xc7,
29
-
30
- M_JPG = 0xc8,
31
- M_SOF9 = 0xc9,
32
- M_SOF10 = 0xca,
33
- M_SOF11 = 0xcb,
34
-
35
- M_SOF13 = 0xcd,
36
- M_SOF14 = 0xce,
37
- M_SOF15 = 0xcf,
38
-
39
- M_DHT = 0xc4,
40
-
41
- M_DAC = 0xcc,
42
-
43
- M_RST0 = 0xd0,
44
- M_RST1 = 0xd1,
45
- M_RST2 = 0xd2,
46
- M_RST3 = 0xd3,
47
- M_RST4 = 0xd4,
48
- M_RST5 = 0xd5,
49
- M_RST6 = 0xd6,
50
- M_RST7 = 0xd7,
51
-
52
- M_SOI = 0xd8,
53
- M_EOI = 0xd9,
54
- M_SOS = 0xda,
55
- M_DQT = 0xdb,
56
- M_DNL = 0xdc,
57
- M_DRI = 0xdd,
58
- M_DHP = 0xde,
59
- M_EXP = 0xdf,
60
-
61
- M_APP0 = 0xe0,
62
- M_APP1 = 0xe1,
63
- M_APP2 = 0xe2,
64
- M_APP3 = 0xe3,
65
- M_APP4 = 0xe4,
66
- M_APP5 = 0xe5,
67
- M_APP6 = 0xe6,
68
- M_APP7 = 0xe7,
69
- M_APP8 = 0xe8,
70
- M_APP9 = 0xe9,
71
- M_APP10 = 0xea,
72
- M_APP11 = 0xeb,
73
- M_APP12 = 0xec,
74
- M_APP13 = 0xed,
75
- M_APP14 = 0xee,
76
- M_APP15 = 0xef,
77
-
78
- M_JPG0 = 0xf0,
79
- M_JPG13 = 0xfd,
80
- M_COM = 0xfe,
81
-
82
- M_TEM = 0x01,
83
-
84
- M_ERROR = 0x100
85
- } JPEG_MARKER;
86
-
87
-
88
- /* Private state */
89
-
90
- typedef struct {
91
- struct jpeg_marker_reader pub; /* public fields */
92
-
93
- /* Application-overridable marker processing methods */
94
- jpeg_marker_parser_method process_COM;
95
- jpeg_marker_parser_method process_APPn[16];
96
-
97
- /* Limit on marker data length to save for each marker type */
98
- unsigned int length_limit_COM;
99
- unsigned int length_limit_APPn[16];
100
-
101
- /* Status of COM/APPn marker saving */
102
- jpeg_saved_marker_ptr cur_marker; /* NULL if not processing a marker */
103
- unsigned int bytes_read; /* data bytes read so far in marker */
104
- /* Note: cur_marker is not linked into marker_list until it's all read. */
105
- } my_marker_reader;
106
-
107
- typedef my_marker_reader * my_marker_ptr;
108
-
109
-
110
- /*
111
- * Macros for fetching data from the data source module.
112
- *
113
- * At all times, cinfo->src->next_input_byte and ->bytes_in_buffer reflect
114
- * the current restart point; we update them only when we have reached a
115
- * suitable place to restart if a suspension occurs.
116
- */
117
-
118
- /* Declare and initialize local copies of input pointer/count */
119
- #define INPUT_VARS(cinfo) \
120
- struct jpeg_source_mgr * datasrc = (cinfo)->src; \
121
- const JOCTET * next_input_byte = datasrc->next_input_byte; \
122
- size_t bytes_in_buffer = datasrc->bytes_in_buffer
123
-
124
- /* Unload the local copies --- do this only at a restart boundary */
125
- #define INPUT_SYNC(cinfo) \
126
- ( datasrc->next_input_byte = next_input_byte, \
127
- datasrc->bytes_in_buffer = bytes_in_buffer )
128
-
129
- /* Reload the local copies --- used only in MAKE_BYTE_AVAIL */
130
- #define INPUT_RELOAD(cinfo) \
131
- ( next_input_byte = datasrc->next_input_byte, \
132
- bytes_in_buffer = datasrc->bytes_in_buffer )
133
-
134
- /* Internal macro for INPUT_BYTE and INPUT_2BYTES: make a byte available.
135
- * Note we do *not* do INPUT_SYNC before calling fill_input_buffer,
136
- * but we must reload the local copies after a successful fill.
137
- */
138
- #define MAKE_BYTE_AVAIL(cinfo,action) \
139
- if (bytes_in_buffer == 0) { \
140
- if (! (*datasrc->fill_input_buffer) (cinfo)) \
141
- { action; } \
142
- INPUT_RELOAD(cinfo); \
143
- }
144
-
145
- /* Read a byte into variable V.
146
- * If must suspend, take the specified action (typically "return FALSE").
147
- */
148
- #define INPUT_BYTE(cinfo,V,action) \
149
- MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
150
- bytes_in_buffer--; \
151
- V = GETJOCTET(*next_input_byte++); )
152
-
153
- /* As above, but read two bytes interpreted as an unsigned 16-bit integer.
154
- * V should be declared unsigned int or perhaps INT32.
155
- */
156
- #define INPUT_2BYTES(cinfo,V,action) \
157
- MAKESTMT( MAKE_BYTE_AVAIL(cinfo,action); \
158
- bytes_in_buffer--; \
159
- V = ((unsigned int) GETJOCTET(*next_input_byte++)) << 8; \
160
- MAKE_BYTE_AVAIL(cinfo,action); \
161
- bytes_in_buffer--; \
162
- V += GETJOCTET(*next_input_byte++); )
163
-
164
-
165
- /*
166
- * Routines to process JPEG markers.
167
- *
168
- * Entry condition: JPEG marker itself has been read and its code saved
169
- * in cinfo->unread_marker; input restart point is just after the marker.
170
- *
171
- * Exit: if return TRUE, have read and processed any parameters, and have
172
- * updated the restart point to point after the parameters.
173
- * If return FALSE, was forced to suspend before reaching end of
174
- * marker parameters; restart point has not been moved. Same routine
175
- * will be called again after application supplies more input data.
176
- *
177
- * This approach to suspension assumes that all of a marker's parameters
178
- * can fit into a single input bufferload. This should hold for "normal"
179
- * markers. Some COM/APPn markers might have large parameter segments
180
- * that might not fit. If we are simply dropping such a marker, we use
181
- * skip_input_data to get past it, and thereby put the problem on the
182
- * source manager's shoulders. If we are saving the marker's contents
183
- * into memory, we use a slightly different convention: when forced to
184
- * suspend, the marker processor updates the restart point to the end of
185
- * what it's consumed (ie, the end of the buffer) before returning FALSE.
186
- * On resumption, cinfo->unread_marker still contains the marker code,
187
- * but the data source will point to the next chunk of marker data.
188
- * The marker processor must retain internal state to deal with this.
189
- *
190
- * Note that we don't bother to avoid duplicate trace messages if a
191
- * suspension occurs within marker parameters. Other side effects
192
- * require more care.
193
- */
194
-
195
-
196
- LOCAL(boolean)
197
- get_soi (j_decompress_ptr cinfo)
198
- /* Process an SOI marker */
199
- {
200
- int i;
201
-
202
- TRACEMS(cinfo, 1, JTRC_SOI);
203
-
204
- if (cinfo->marker->saw_SOI)
205
- ERREXIT(cinfo, JERR_SOI_DUPLICATE);
206
-
207
- /* Reset all parameters that are defined to be reset by SOI */
208
-
209
- for (i = 0; i < NUM_ARITH_TBLS; i++) {
210
- cinfo->arith_dc_L[i] = 0;
211
- cinfo->arith_dc_U[i] = 1;
212
- cinfo->arith_ac_K[i] = 5;
213
- }
214
- cinfo->restart_interval = 0;
215
-
216
- /* Set initial assumptions for colorspace etc */
217
-
218
- cinfo->jpeg_color_space = JCS_UNKNOWN;
219
- cinfo->CCIR601_sampling = FALSE; /* Assume non-CCIR sampling??? */
220
-
221
- cinfo->saw_JFIF_marker = FALSE;
222
- cinfo->JFIF_major_version = 1; /* set default JFIF APP0 values */
223
- cinfo->JFIF_minor_version = 1;
224
- cinfo->density_unit = 0;
225
- cinfo->X_density = 1;
226
- cinfo->Y_density = 1;
227
- cinfo->saw_Adobe_marker = FALSE;
228
- cinfo->Adobe_transform = 0;
229
-
230
- cinfo->marker->saw_SOI = TRUE;
231
-
232
- return TRUE;
233
- }
234
-
235
-
236
- LOCAL(boolean)
237
- get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
238
- /* Process a SOFn marker */
239
- {
240
- INT32 length;
241
- int c, ci;
242
- jpeg_component_info * compptr;
243
- INPUT_VARS(cinfo);
244
-
245
- cinfo->progressive_mode = is_prog;
246
- cinfo->arith_code = is_arith;
247
-
248
- INPUT_2BYTES(cinfo, length, return FALSE);
249
-
250
- INPUT_BYTE(cinfo, cinfo->data_precision, return FALSE);
251
- INPUT_2BYTES(cinfo, cinfo->image_height, return FALSE);
252
- INPUT_2BYTES(cinfo, cinfo->image_width, return FALSE);
253
- INPUT_BYTE(cinfo, cinfo->num_components, return FALSE);
254
-
255
- length -= 8;
256
-
257
- TRACEMS4(cinfo, 1, JTRC_SOF, cinfo->unread_marker,
258
- (int) cinfo->image_width, (int) cinfo->image_height,
259
- cinfo->num_components);
260
-
261
- if (cinfo->marker->saw_SOF)
262
- ERREXIT(cinfo, JERR_SOF_DUPLICATE);
263
-
264
- /* We don't support files in which the image height is initially specified */
265
- /* as 0 and is later redefined by DNL. As long as we have to check that, */
266
- /* might as well have a general sanity check. */
267
- if (cinfo->image_height <= 0 || cinfo->image_width <= 0
268
- || cinfo->num_components <= 0)
269
- ERREXIT(cinfo, JERR_EMPTY_IMAGE);
270
-
271
- if (length != (cinfo->num_components * 3))
272
- ERREXIT(cinfo, JERR_BAD_LENGTH);
273
-
274
- if (cinfo->comp_info == NULL) /* do only once, even if suspend */
275
- cinfo->comp_info = (jpeg_component_info *) (*cinfo->mem->alloc_small)
276
- ((j_common_ptr) cinfo, JPOOL_IMAGE,
277
- cinfo->num_components * SIZEOF(jpeg_component_info));
278
-
279
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
280
- ci++, compptr++) {
281
- compptr->component_index = ci;
282
- INPUT_BYTE(cinfo, compptr->component_id, return FALSE);
283
- INPUT_BYTE(cinfo, c, return FALSE);
284
- compptr->h_samp_factor = (c >> 4) & 15;
285
- compptr->v_samp_factor = (c ) & 15;
286
- INPUT_BYTE(cinfo, compptr->quant_tbl_no, return FALSE);
287
-
288
- TRACEMS4(cinfo, 1, JTRC_SOF_COMPONENT,
289
- compptr->component_id, compptr->h_samp_factor,
290
- compptr->v_samp_factor, compptr->quant_tbl_no);
291
- }
292
-
293
- cinfo->marker->saw_SOF = TRUE;
294
-
295
- INPUT_SYNC(cinfo);
296
- return TRUE;
297
- }
298
-
299
-
300
- LOCAL(boolean)
301
- get_sos (j_decompress_ptr cinfo)
302
- /* Process a SOS marker */
303
- {
304
- INT32 length;
305
- int i, ci, n, c, cc;
306
- jpeg_component_info * compptr;
307
- INPUT_VARS(cinfo);
308
-
309
- if (! cinfo->marker->saw_SOF)
310
- ERREXIT(cinfo, JERR_SOS_NO_SOF);
311
-
312
- INPUT_2BYTES(cinfo, length, return FALSE);
313
-
314
- INPUT_BYTE(cinfo, n, return FALSE); /* Number of components */
315
-
316
- TRACEMS1(cinfo, 1, JTRC_SOS, n);
317
-
318
- if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN)
319
- ERREXIT(cinfo, JERR_BAD_LENGTH);
320
-
321
- cinfo->comps_in_scan = n;
322
-
323
- /* Collect the component-spec parameters */
324
-
325
- for (i = 0; i < n; i++) {
326
- INPUT_BYTE(cinfo, cc, return FALSE);
327
- INPUT_BYTE(cinfo, c, return FALSE);
328
-
329
- for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
330
- ci++, compptr++) {
331
- if (cc == compptr->component_id)
332
- goto id_found;
333
- }
334
-
335
- ERREXIT1(cinfo, JERR_BAD_COMPONENT_ID, cc);
336
-
337
- id_found:
338
-
339
- cinfo->cur_comp_info[i] = compptr;
340
- compptr->dc_tbl_no = (c >> 4) & 15;
341
- compptr->ac_tbl_no = (c ) & 15;
342
-
343
- TRACEMS3(cinfo, 1, JTRC_SOS_COMPONENT, cc,
344
- compptr->dc_tbl_no, compptr->ac_tbl_no);
345
- }
346
-
347
- /* Collect the additional scan parameters Ss, Se, Ah/Al. */
348
- INPUT_BYTE(cinfo, c, return FALSE);
349
- cinfo->Ss = c;
350
- INPUT_BYTE(cinfo, c, return FALSE);
351
- cinfo->Se = c;
352
- INPUT_BYTE(cinfo, c, return FALSE);
353
- cinfo->Ah = (c >> 4) & 15;
354
- cinfo->Al = (c ) & 15;
355
-
356
- TRACEMS4(cinfo, 1, JTRC_SOS_PARAMS, cinfo->Ss, cinfo->Se,
357
- cinfo->Ah, cinfo->Al);
358
-
359
- /* Prepare to scan data & restart markers */
360
- cinfo->marker->next_restart_num = 0;
361
-
362
- /* Count another SOS marker */
363
- cinfo->input_scan_number++;
364
-
365
- INPUT_SYNC(cinfo);
366
- return TRUE;
367
- }
368
-
369
-
370
- #ifdef D_ARITH_CODING_SUPPORTED
371
-
372
- LOCAL(boolean)
373
- get_dac (j_decompress_ptr cinfo)
374
- /* Process a DAC marker */
375
- {
376
- INT32 length;
377
- int index, val;
378
- INPUT_VARS(cinfo);
379
-
380
- INPUT_2BYTES(cinfo, length, return FALSE);
381
- length -= 2;
382
-
383
- while (length > 0) {
384
- INPUT_BYTE(cinfo, index, return FALSE);
385
- INPUT_BYTE(cinfo, val, return FALSE);
386
-
387
- length -= 2;
388
-
389
- TRACEMS2(cinfo, 1, JTRC_DAC, index, val);
390
-
391
- if (index < 0 || index >= (2*NUM_ARITH_TBLS))
392
- ERREXIT1(cinfo, JERR_DAC_INDEX, index);
393
-
394
- if (index >= NUM_ARITH_TBLS) { /* define AC table */
395
- cinfo->arith_ac_K[index-NUM_ARITH_TBLS] = (UINT8) val;
396
- } else { /* define DC table */
397
- cinfo->arith_dc_L[index] = (UINT8) (val & 0x0F);
398
- cinfo->arith_dc_U[index] = (UINT8) (val >> 4);
399
- if (cinfo->arith_dc_L[index] > cinfo->arith_dc_U[index])
400
- ERREXIT1(cinfo, JERR_DAC_VALUE, val);
401
- }
402
- }
403
-
404
- if (length != 0)
405
- ERREXIT(cinfo, JERR_BAD_LENGTH);
406
-
407
- INPUT_SYNC(cinfo);
408
- return TRUE;
409
- }
410
-
411
- #else /* ! D_ARITH_CODING_SUPPORTED */
412
-
413
- #define get_dac(cinfo) skip_variable(cinfo)
414
-
415
- #endif /* D_ARITH_CODING_SUPPORTED */
416
-
417
-
418
- LOCAL(boolean)
419
- get_dht (j_decompress_ptr cinfo)
420
- /* Process a DHT marker */
421
- {
422
- INT32 length;
423
- UINT8 bits[17];
424
- UINT8 huffval[256];
425
- int i, index, count;
426
- JHUFF_TBL **htblptr;
427
- INPUT_VARS(cinfo);
428
-
429
- INPUT_2BYTES(cinfo, length, return FALSE);
430
- length -= 2;
431
-
432
- while (length > 16) {
433
- INPUT_BYTE(cinfo, index, return FALSE);
434
-
435
- TRACEMS1(cinfo, 1, JTRC_DHT, index);
436
-
437
- bits[0] = 0;
438
- count = 0;
439
- for (i = 1; i <= 16; i++) {
440
- INPUT_BYTE(cinfo, bits[i], return FALSE);
441
- count += bits[i];
442
- }
443
-
444
- length -= 1 + 16;
445
-
446
- TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
447
- bits[1], bits[2], bits[3], bits[4],
448
- bits[5], bits[6], bits[7], bits[8]);
449
- TRACEMS8(cinfo, 2, JTRC_HUFFBITS,
450
- bits[9], bits[10], bits[11], bits[12],
451
- bits[13], bits[14], bits[15], bits[16]);
452
-
453
- /* Here we just do minimal validation of the counts to avoid walking
454
- * off the end of our table space. jdhuff.c will check more carefully.
455
- */
456
- if (count > 256 || ((INT32) count) > length)
457
- ERREXIT(cinfo, JERR_BAD_HUFF_TABLE);
458
-
459
- for (i = 0; i < count; i++)
460
- INPUT_BYTE(cinfo, huffval[i], return FALSE);
461
-
462
- length -= count;
463
-
464
- if (index & 0x10) { /* AC table definition */
465
- index -= 0x10;
466
- htblptr = &cinfo->ac_huff_tbl_ptrs[index];
467
- } else { /* DC table definition */
468
- htblptr = &cinfo->dc_huff_tbl_ptrs[index];
469
- }
470
-
471
- if (index < 0 || index >= NUM_HUFF_TBLS)
472
- ERREXIT1(cinfo, JERR_DHT_INDEX, index);
473
-
474
- if (*htblptr == NULL)
475
- *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
476
-
477
- MEMCOPY((*htblptr)->bits, bits, SIZEOF((*htblptr)->bits));
478
- MEMCOPY((*htblptr)->huffval, huffval, SIZEOF((*htblptr)->huffval));
479
- }
480
-
481
- if (length != 0)
482
- ERREXIT(cinfo, JERR_BAD_LENGTH);
483
-
484
- INPUT_SYNC(cinfo);
485
- return TRUE;
486
- }
487
-
488
-
489
- LOCAL(boolean)
490
- get_dqt (j_decompress_ptr cinfo)
491
- /* Process a DQT marker */
492
- {
493
- INT32 length;
494
- int n, i, prec;
495
- unsigned int tmp;
496
- JQUANT_TBL *quant_ptr;
497
- INPUT_VARS(cinfo);
498
-
499
- INPUT_2BYTES(cinfo, length, return FALSE);
500
- length -= 2;
501
-
502
- while (length > 0) {
503
- INPUT_BYTE(cinfo, n, return FALSE);
504
- prec = n >> 4;
505
- n &= 0x0F;
506
-
507
- TRACEMS2(cinfo, 1, JTRC_DQT, n, prec);
508
-
509
- if (n >= NUM_QUANT_TBLS)
510
- ERREXIT1(cinfo, JERR_DQT_INDEX, n);
511
-
512
- if (cinfo->quant_tbl_ptrs[n] == NULL)
513
- cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
514
- quant_ptr = cinfo->quant_tbl_ptrs[n];
515
-
516
- for (i = 0; i < DCTSIZE2; i++) {
517
- if (prec)
518
- INPUT_2BYTES(cinfo, tmp, return FALSE);
519
- else
520
- INPUT_BYTE(cinfo, tmp, return FALSE);
521
- /* We convert the zigzag-order table to natural array order. */
522
- quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp;
523
- }
524
-
525
- if (cinfo->err->trace_level >= 2) {
526
- for (i = 0; i < DCTSIZE2; i += 8) {
527
- TRACEMS8(cinfo, 2, JTRC_QUANTVALS,
528
- quant_ptr->quantval[i], quant_ptr->quantval[i+1],
529
- quant_ptr->quantval[i+2], quant_ptr->quantval[i+3],
530
- quant_ptr->quantval[i+4], quant_ptr->quantval[i+5],
531
- quant_ptr->quantval[i+6], quant_ptr->quantval[i+7]);
532
- }
533
- }
534
-
535
- length -= DCTSIZE2+1;
536
- if (prec) length -= DCTSIZE2;
537
- }
538
-
539
- if (length != 0)
540
- ERREXIT(cinfo, JERR_BAD_LENGTH);
541
-
542
- INPUT_SYNC(cinfo);
543
- return TRUE;
544
- }
545
-
546
-
547
- LOCAL(boolean)
548
- get_dri (j_decompress_ptr cinfo)
549
- /* Process a DRI marker */
550
- {
551
- INT32 length;
552
- unsigned int tmp;
553
- INPUT_VARS(cinfo);
554
-
555
- INPUT_2BYTES(cinfo, length, return FALSE);
556
-
557
- if (length != 4)
558
- ERREXIT(cinfo, JERR_BAD_LENGTH);
559
-
560
- INPUT_2BYTES(cinfo, tmp, return FALSE);
561
-
562
- TRACEMS1(cinfo, 1, JTRC_DRI, tmp);
563
-
564
- cinfo->restart_interval = tmp;
565
-
566
- INPUT_SYNC(cinfo);
567
- return TRUE;
568
- }
569
-
570
-
571
- /*
572
- * Routines for processing APPn and COM markers.
573
- * These are either saved in memory or discarded, per application request.
574
- * APP0 and APP14 are specially checked to see if they are
575
- * JFIF and Adobe markers, respectively.
576
- */
577
-
578
- #define APP0_DATA_LEN 14 /* Length of interesting data in APP0 */
579
- #define APP14_DATA_LEN 12 /* Length of interesting data in APP14 */
580
- #define APPN_DATA_LEN 14 /* Must be the largest of the above!! */
581
-
582
-
583
- LOCAL(void)
584
- examine_app0 (j_decompress_ptr cinfo, JOCTET FAR * data,
585
- unsigned int datalen, INT32 remaining)
586
- /* Examine first few bytes from an APP0.
587
- * Take appropriate action if it is a JFIF marker.
588
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
589
- */
590
- {
591
- INT32 totallen = (INT32) datalen + remaining;
592
-
593
- if (datalen >= APP0_DATA_LEN &&
594
- GETJOCTET(data[0]) == 0x4A &&
595
- GETJOCTET(data[1]) == 0x46 &&
596
- GETJOCTET(data[2]) == 0x49 &&
597
- GETJOCTET(data[3]) == 0x46 &&
598
- GETJOCTET(data[4]) == 0) {
599
- /* Found JFIF APP0 marker: save info */
600
- cinfo->saw_JFIF_marker = TRUE;
601
- cinfo->JFIF_major_version = GETJOCTET(data[5]);
602
- cinfo->JFIF_minor_version = GETJOCTET(data[6]);
603
- cinfo->density_unit = GETJOCTET(data[7]);
604
- cinfo->X_density = (GETJOCTET(data[8]) << 8) + GETJOCTET(data[9]);
605
- cinfo->Y_density = (GETJOCTET(data[10]) << 8) + GETJOCTET(data[11]);
606
- /* Check version.
607
- * Major version must be 1, anything else signals an incompatible change.
608
- * (We used to treat this as an error, but now it's a nonfatal warning,
609
- * because some bozo at Hijaak couldn't read the spec.)
610
- * Minor version should be 0..2, but process anyway if newer.
611
- */
612
- if (cinfo->JFIF_major_version != 1)
613
- WARNMS2(cinfo, JWRN_JFIF_MAJOR,
614
- cinfo->JFIF_major_version, cinfo->JFIF_minor_version);
615
- /* Generate trace messages */
616
- TRACEMS5(cinfo, 1, JTRC_JFIF,
617
- cinfo->JFIF_major_version, cinfo->JFIF_minor_version,
618
- cinfo->X_density, cinfo->Y_density, cinfo->density_unit);
619
- /* Validate thumbnail dimensions and issue appropriate messages */
620
- if (GETJOCTET(data[12]) | GETJOCTET(data[13]))
621
- TRACEMS2(cinfo, 1, JTRC_JFIF_THUMBNAIL,
622
- GETJOCTET(data[12]), GETJOCTET(data[13]));
623
- totallen -= APP0_DATA_LEN;
624
- if (totallen !=
625
- ((INT32)GETJOCTET(data[12]) * (INT32)GETJOCTET(data[13]) * (INT32) 3))
626
- TRACEMS1(cinfo, 1, JTRC_JFIF_BADTHUMBNAILSIZE, (int) totallen);
627
- } else if (datalen >= 6 &&
628
- GETJOCTET(data[0]) == 0x4A &&
629
- GETJOCTET(data[1]) == 0x46 &&
630
- GETJOCTET(data[2]) == 0x58 &&
631
- GETJOCTET(data[3]) == 0x58 &&
632
- GETJOCTET(data[4]) == 0) {
633
- /* Found JFIF "JFXX" extension APP0 marker */
634
- /* The library doesn't actually do anything with these,
635
- * but we try to produce a helpful trace message.
636
- */
637
- switch (GETJOCTET(data[5])) {
638
- case 0x10:
639
- TRACEMS1(cinfo, 1, JTRC_THUMB_JPEG, (int) totallen);
640
- break;
641
- case 0x11:
642
- TRACEMS1(cinfo, 1, JTRC_THUMB_PALETTE, (int) totallen);
643
- break;
644
- case 0x13:
645
- TRACEMS1(cinfo, 1, JTRC_THUMB_RGB, (int) totallen);
646
- break;
647
- default:
648
- TRACEMS2(cinfo, 1, JTRC_JFIF_EXTENSION,
649
- GETJOCTET(data[5]), (int) totallen);
650
- break;
651
- }
652
- } else {
653
- /* Start of APP0 does not match "JFIF" or "JFXX", or too short */
654
- TRACEMS1(cinfo, 1, JTRC_APP0, (int) totallen);
655
- }
656
- }
657
-
658
-
659
- LOCAL(void)
660
- examine_app14 (j_decompress_ptr cinfo, JOCTET FAR * data,
661
- unsigned int datalen, INT32 remaining)
662
- /* Examine first few bytes from an APP14.
663
- * Take appropriate action if it is an Adobe marker.
664
- * datalen is # of bytes at data[], remaining is length of rest of marker data.
665
- */
666
- {
667
- unsigned int version, flags0, flags1, transform;
668
-
669
- if (datalen >= APP14_DATA_LEN &&
670
- GETJOCTET(data[0]) == 0x41 &&
671
- GETJOCTET(data[1]) == 0x64 &&
672
- GETJOCTET(data[2]) == 0x6F &&
673
- GETJOCTET(data[3]) == 0x62 &&
674
- GETJOCTET(data[4]) == 0x65) {
675
- /* Found Adobe APP14 marker */
676
- version = (GETJOCTET(data[5]) << 8) + GETJOCTET(data[6]);
677
- flags0 = (GETJOCTET(data[7]) << 8) + GETJOCTET(data[8]);
678
- flags1 = (GETJOCTET(data[9]) << 8) + GETJOCTET(data[10]);
679
- transform = GETJOCTET(data[11]);
680
- TRACEMS4(cinfo, 1, JTRC_ADOBE, version, flags0, flags1, transform);
681
- cinfo->saw_Adobe_marker = TRUE;
682
- cinfo->Adobe_transform = (UINT8) transform;
683
- } else {
684
- /* Start of APP14 does not match "Adobe", or too short */
685
- TRACEMS1(cinfo, 1, JTRC_APP14, (int) (datalen + remaining));
686
- }
687
- }
688
-
689
-
690
- METHODDEF(boolean)
691
- get_interesting_appn (j_decompress_ptr cinfo)
692
- /* Process an APP0 or APP14 marker without saving it */
693
- {
694
- INT32 length;
695
- JOCTET b[APPN_DATA_LEN];
696
- unsigned int i, numtoread;
697
- INPUT_VARS(cinfo);
698
-
699
- INPUT_2BYTES(cinfo, length, return FALSE);
700
- length -= 2;
701
-
702
- /* get the interesting part of the marker data */
703
- if (length >= APPN_DATA_LEN)
704
- numtoread = APPN_DATA_LEN;
705
- else if (length > 0)
706
- numtoread = (unsigned int) length;
707
- else
708
- numtoread = 0;
709
- for (i = 0; i < numtoread; i++)
710
- INPUT_BYTE(cinfo, b[i], return FALSE);
711
- length -= numtoread;
712
-
713
- /* process it */
714
- switch (cinfo->unread_marker) {
715
- case M_APP0:
716
- examine_app0(cinfo, (JOCTET FAR *) b, numtoread, length);
717
- break;
718
- case M_APP14:
719
- examine_app14(cinfo, (JOCTET FAR *) b, numtoread, length);
720
- break;
721
- default:
722
- /* can't get here unless jpeg_save_markers chooses wrong processor */
723
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
724
- break;
725
- }
726
-
727
- /* skip any remaining data -- could be lots */
728
- INPUT_SYNC(cinfo);
729
- if (length > 0)
730
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
731
-
732
- return TRUE;
733
- }
734
-
735
-
736
- #ifdef SAVE_MARKERS_SUPPORTED
737
-
738
- METHODDEF(boolean)
739
- save_marker (j_decompress_ptr cinfo)
740
- /* Save an APPn or COM marker into the marker list */
741
- {
742
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
743
- jpeg_saved_marker_ptr cur_marker = marker->cur_marker;
744
- unsigned int bytes_read, data_length;
745
- JOCTET FAR * data;
746
- INT32 length = 0;
747
- INPUT_VARS(cinfo);
748
-
749
- if (cur_marker == NULL) {
750
- /* begin reading a marker */
751
- INPUT_2BYTES(cinfo, length, return FALSE);
752
- length -= 2;
753
- if (length >= 0) { /* watch out for bogus length word */
754
- /* figure out how much we want to save */
755
- unsigned int limit;
756
- if (cinfo->unread_marker == (int) M_COM)
757
- limit = marker->length_limit_COM;
758
- else
759
- limit = marker->length_limit_APPn[cinfo->unread_marker - (int) M_APP0];
760
- if ((unsigned int) length < limit)
761
- limit = (unsigned int) length;
762
- /* allocate and initialize the marker item */
763
- cur_marker = (jpeg_saved_marker_ptr)
764
- (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
765
- SIZEOF(struct jpeg_marker_struct) + limit);
766
- cur_marker->next = NULL;
767
- cur_marker->marker = (UINT8) cinfo->unread_marker;
768
- cur_marker->original_length = (unsigned int) length;
769
- cur_marker->data_length = limit;
770
- /* data area is just beyond the jpeg_marker_struct */
771
- data = cur_marker->data = (JOCTET FAR *) (cur_marker + 1);
772
- marker->cur_marker = cur_marker;
773
- marker->bytes_read = 0;
774
- bytes_read = 0;
775
- data_length = limit;
776
- } else {
777
- /* deal with bogus length word */
778
- bytes_read = data_length = 0;
779
- data = NULL;
780
- }
781
- } else {
782
- /* resume reading a marker */
783
- bytes_read = marker->bytes_read;
784
- data_length = cur_marker->data_length;
785
- data = cur_marker->data + bytes_read;
786
- }
787
-
788
- while (bytes_read < data_length) {
789
- INPUT_SYNC(cinfo); /* move the restart point to here */
790
- marker->bytes_read = bytes_read;
791
- /* If there's not at least one byte in buffer, suspend */
792
- MAKE_BYTE_AVAIL(cinfo, return FALSE);
793
- /* Copy bytes with reasonable rapidity */
794
- while (bytes_read < data_length && bytes_in_buffer > 0) {
795
- *data++ = *next_input_byte++;
796
- bytes_in_buffer--;
797
- bytes_read++;
798
- }
799
- }
800
-
801
- /* Done reading what we want to read */
802
- if (cur_marker != NULL) { /* will be NULL if bogus length word */
803
- /* Add new marker to end of list */
804
- if (cinfo->marker_list == NULL) {
805
- cinfo->marker_list = cur_marker;
806
- } else {
807
- jpeg_saved_marker_ptr prev = cinfo->marker_list;
808
- while (prev->next != NULL)
809
- prev = prev->next;
810
- prev->next = cur_marker;
811
- }
812
- /* Reset pointer & calc remaining data length */
813
- data = cur_marker->data;
814
- length = cur_marker->original_length - data_length;
815
- }
816
- /* Reset to initial state for next marker */
817
- marker->cur_marker = NULL;
818
-
819
- /* Process the marker if interesting; else just make a generic trace msg */
820
- switch (cinfo->unread_marker) {
821
- case M_APP0:
822
- examine_app0(cinfo, data, data_length, length);
823
- break;
824
- case M_APP14:
825
- examine_app14(cinfo, data, data_length, length);
826
- break;
827
- default:
828
- TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker,
829
- (int) (data_length + length));
830
- break;
831
- }
832
-
833
- /* skip any remaining data -- could be lots */
834
- INPUT_SYNC(cinfo); /* do before skip_input_data */
835
- if (length > 0)
836
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
837
-
838
- return TRUE;
839
- }
840
-
841
- #endif /* SAVE_MARKERS_SUPPORTED */
842
-
843
-
844
- METHODDEF(boolean)
845
- skip_variable (j_decompress_ptr cinfo)
846
- /* Skip over an unknown or uninteresting variable-length marker */
847
- {
848
- INT32 length;
849
- INPUT_VARS(cinfo);
850
-
851
- INPUT_2BYTES(cinfo, length, return FALSE);
852
- length -= 2;
853
-
854
- TRACEMS2(cinfo, 1, JTRC_MISC_MARKER, cinfo->unread_marker, (int) length);
855
-
856
- INPUT_SYNC(cinfo); /* do before skip_input_data */
857
- if (length > 0)
858
- (*cinfo->src->skip_input_data) (cinfo, (long) length);
859
-
860
- return TRUE;
861
- }
862
-
863
-
864
- /*
865
- * Find the next JPEG marker, save it in cinfo->unread_marker.
866
- * Returns FALSE if had to suspend before reaching a marker;
867
- * in that case cinfo->unread_marker is unchanged.
868
- *
869
- * Note that the result might not be a valid marker code,
870
- * but it will never be 0 or FF.
871
- */
872
-
873
- LOCAL(boolean)
874
- next_marker (j_decompress_ptr cinfo)
875
- {
876
- int c;
877
- INPUT_VARS(cinfo);
878
-
879
- for (;;) {
880
- INPUT_BYTE(cinfo, c, return FALSE);
881
- /* Skip any non-FF bytes.
882
- * This may look a bit inefficient, but it will not occur in a valid file.
883
- * We sync after each discarded byte so that a suspending data source
884
- * can discard the byte from its buffer.
885
- */
886
- while (c != 0xFF) {
887
- cinfo->marker->discarded_bytes++;
888
- INPUT_SYNC(cinfo);
889
- INPUT_BYTE(cinfo, c, return FALSE);
890
- }
891
- /* This loop swallows any duplicate FF bytes. Extra FFs are legal as
892
- * pad bytes, so don't count them in discarded_bytes. We assume there
893
- * will not be so many consecutive FF bytes as to overflow a suspending
894
- * data source's input buffer.
895
- */
896
- do {
897
- INPUT_BYTE(cinfo, c, return FALSE);
898
- } while (c == 0xFF);
899
- if (c != 0)
900
- break; /* found a valid marker, exit loop */
901
- /* Reach here if we found a stuffed-zero data sequence (FF/00).
902
- * Discard it and loop back to try again.
903
- */
904
- cinfo->marker->discarded_bytes += 2;
905
- INPUT_SYNC(cinfo);
906
- }
907
-
908
- if (cinfo->marker->discarded_bytes != 0) {
909
- WARNMS2(cinfo, JWRN_EXTRANEOUS_DATA, cinfo->marker->discarded_bytes, c);
910
- cinfo->marker->discarded_bytes = 0;
911
- }
912
-
913
- cinfo->unread_marker = c;
914
-
915
- INPUT_SYNC(cinfo);
916
- return TRUE;
917
- }
918
-
919
-
920
- LOCAL(boolean)
921
- first_marker (j_decompress_ptr cinfo)
922
- /* Like next_marker, but used to obtain the initial SOI marker. */
923
- /* For this marker, we do not allow preceding garbage or fill; otherwise,
924
- * we might well scan an entire input file before realizing it ain't JPEG.
925
- * If an application wants to process non-JFIF files, it must seek to the
926
- * SOI before calling the JPEG library.
927
- */
928
- {
929
- int c, c2;
930
- INPUT_VARS(cinfo);
931
-
932
- INPUT_BYTE(cinfo, c, return FALSE);
933
- INPUT_BYTE(cinfo, c2, return FALSE);
934
- if (c != 0xFF || c2 != (int) M_SOI)
935
- ERREXIT2(cinfo, JERR_NO_SOI, c, c2);
936
-
937
- cinfo->unread_marker = c2;
938
-
939
- INPUT_SYNC(cinfo);
940
- return TRUE;
941
- }
942
-
943
-
944
- /*
945
- * Read markers until SOS or EOI.
946
- *
947
- * Returns same codes as are defined for jpeg_consume_input:
948
- * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
949
- */
950
-
951
- METHODDEF(int)
952
- read_markers (j_decompress_ptr cinfo)
953
- {
954
- /* Outer loop repeats once for each marker. */
955
- for (;;) {
956
- /* Collect the marker proper, unless we already did. */
957
- /* NB: first_marker() enforces the requirement that SOI appear first. */
958
- if (cinfo->unread_marker == 0) {
959
- if (! cinfo->marker->saw_SOI) {
960
- if (! first_marker(cinfo))
961
- return JPEG_SUSPENDED;
962
- } else {
963
- if (! next_marker(cinfo))
964
- return JPEG_SUSPENDED;
965
- }
966
- }
967
- /* At this point cinfo->unread_marker contains the marker code and the
968
- * input point is just past the marker proper, but before any parameters.
969
- * A suspension will cause us to return with this state still true.
970
- */
971
- switch (cinfo->unread_marker) {
972
- case M_SOI:
973
- if (! get_soi(cinfo))
974
- return JPEG_SUSPENDED;
975
- break;
976
-
977
- case M_SOF0: /* Baseline */
978
- case M_SOF1: /* Extended sequential, Huffman */
979
- if (! get_sof(cinfo, FALSE, FALSE))
980
- return JPEG_SUSPENDED;
981
- break;
982
-
983
- case M_SOF2: /* Progressive, Huffman */
984
- if (! get_sof(cinfo, TRUE, FALSE))
985
- return JPEG_SUSPENDED;
986
- break;
987
-
988
- case M_SOF9: /* Extended sequential, arithmetic */
989
- if (! get_sof(cinfo, FALSE, TRUE))
990
- return JPEG_SUSPENDED;
991
- break;
992
-
993
- case M_SOF10: /* Progressive, arithmetic */
994
- if (! get_sof(cinfo, TRUE, TRUE))
995
- return JPEG_SUSPENDED;
996
- break;
997
-
998
- /* Currently unsupported SOFn types */
999
- case M_SOF3: /* Lossless, Huffman */
1000
- case M_SOF5: /* Differential sequential, Huffman */
1001
- case M_SOF6: /* Differential progressive, Huffman */
1002
- case M_SOF7: /* Differential lossless, Huffman */
1003
- case M_JPG: /* Reserved for JPEG extensions */
1004
- case M_SOF11: /* Lossless, arithmetic */
1005
- case M_SOF13: /* Differential sequential, arithmetic */
1006
- case M_SOF14: /* Differential progressive, arithmetic */
1007
- case M_SOF15: /* Differential lossless, arithmetic */
1008
- ERREXIT1(cinfo, JERR_SOF_UNSUPPORTED, cinfo->unread_marker);
1009
- break;
1010
-
1011
- case M_SOS:
1012
- if (! get_sos(cinfo))
1013
- return JPEG_SUSPENDED;
1014
- cinfo->unread_marker = 0; /* processed the marker */
1015
- return JPEG_REACHED_SOS;
1016
-
1017
- case M_EOI:
1018
- TRACEMS(cinfo, 1, JTRC_EOI);
1019
- cinfo->unread_marker = 0; /* processed the marker */
1020
- return JPEG_REACHED_EOI;
1021
-
1022
- case M_DAC:
1023
- if (! get_dac(cinfo))
1024
- return JPEG_SUSPENDED;
1025
- break;
1026
-
1027
- case M_DHT:
1028
- if (! get_dht(cinfo))
1029
- return JPEG_SUSPENDED;
1030
- break;
1031
-
1032
- case M_DQT:
1033
- if (! get_dqt(cinfo))
1034
- return JPEG_SUSPENDED;
1035
- break;
1036
-
1037
- case M_DRI:
1038
- if (! get_dri(cinfo))
1039
- return JPEG_SUSPENDED;
1040
- break;
1041
-
1042
- case M_APP0:
1043
- case M_APP1:
1044
- case M_APP2:
1045
- case M_APP3:
1046
- case M_APP4:
1047
- case M_APP5:
1048
- case M_APP6:
1049
- case M_APP7:
1050
- case M_APP8:
1051
- case M_APP9:
1052
- case M_APP10:
1053
- case M_APP11:
1054
- case M_APP12:
1055
- case M_APP13:
1056
- case M_APP14:
1057
- case M_APP15:
1058
- if (! (*((my_marker_ptr) cinfo->marker)->process_APPn[
1059
- cinfo->unread_marker - (int) M_APP0]) (cinfo))
1060
- return JPEG_SUSPENDED;
1061
- break;
1062
-
1063
- case M_COM:
1064
- if (! (*((my_marker_ptr) cinfo->marker)->process_COM) (cinfo))
1065
- return JPEG_SUSPENDED;
1066
- break;
1067
-
1068
- case M_RST0: /* these are all parameterless */
1069
- case M_RST1:
1070
- case M_RST2:
1071
- case M_RST3:
1072
- case M_RST4:
1073
- case M_RST5:
1074
- case M_RST6:
1075
- case M_RST7:
1076
- case M_TEM:
1077
- TRACEMS1(cinfo, 1, JTRC_PARMLESS_MARKER, cinfo->unread_marker);
1078
- break;
1079
-
1080
- case M_DNL: /* Ignore DNL ... perhaps the wrong thing */
1081
- if (! skip_variable(cinfo))
1082
- return JPEG_SUSPENDED;
1083
- break;
1084
-
1085
- default: /* must be DHP, EXP, JPGn, or RESn */
1086
- /* For now, we treat the reserved markers as fatal errors since they are
1087
- * likely to be used to signal incompatible JPEG Part 3 extensions.
1088
- * Once the JPEG 3 version-number marker is well defined, this code
1089
- * ought to change!
1090
- */
1091
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, cinfo->unread_marker);
1092
- break;
1093
- }
1094
- /* Successfully processed marker, so reset state variable */
1095
- cinfo->unread_marker = 0;
1096
- } /* end loop */
1097
- }
1098
-
1099
-
1100
- /*
1101
- * Read a restart marker, which is expected to appear next in the datastream;
1102
- * if the marker is not there, take appropriate recovery action.
1103
- * Returns FALSE if suspension is required.
1104
- *
1105
- * This is called by the entropy decoder after it has read an appropriate
1106
- * number of MCUs. cinfo->unread_marker may be nonzero if the entropy decoder
1107
- * has already read a marker from the data source. Under normal conditions
1108
- * cinfo->unread_marker will be reset to 0 before returning; if not reset,
1109
- * it holds a marker which the decoder will be unable to read past.
1110
- */
1111
-
1112
- METHODDEF(boolean)
1113
- read_restart_marker (j_decompress_ptr cinfo)
1114
- {
1115
- /* Obtain a marker unless we already did. */
1116
- /* Note that next_marker will complain if it skips any data. */
1117
- if (cinfo->unread_marker == 0) {
1118
- if (! next_marker(cinfo))
1119
- return FALSE;
1120
- }
1121
-
1122
- if (cinfo->unread_marker ==
1123
- ((int) M_RST0 + cinfo->marker->next_restart_num)) {
1124
- /* Normal case --- swallow the marker and let entropy decoder continue */
1125
- TRACEMS1(cinfo, 3, JTRC_RST, cinfo->marker->next_restart_num);
1126
- cinfo->unread_marker = 0;
1127
- } else {
1128
- /* Uh-oh, the restart markers have been messed up. */
1129
- /* Let the data source manager determine how to resync. */
1130
- if (! (*cinfo->src->resync_to_restart) (cinfo,
1131
- cinfo->marker->next_restart_num))
1132
- return FALSE;
1133
- }
1134
-
1135
- /* Update next-restart state */
1136
- cinfo->marker->next_restart_num = (cinfo->marker->next_restart_num + 1) & 7;
1137
-
1138
- return TRUE;
1139
- }
1140
-
1141
-
1142
- /*
1143
- * This is the default resync_to_restart method for data source managers
1144
- * to use if they don't have any better approach. Some data source managers
1145
- * may be able to back up, or may have additional knowledge about the data
1146
- * which permits a more intelligent recovery strategy; such managers would
1147
- * presumably supply their own resync method.
1148
- *
1149
- * read_restart_marker calls resync_to_restart if it finds a marker other than
1150
- * the restart marker it was expecting. (This code is *not* used unless
1151
- * a nonzero restart interval has been declared.) cinfo->unread_marker is
1152
- * the marker code actually found (might be anything, except 0 or FF).
1153
- * The desired restart marker number (0..7) is passed as a parameter.
1154
- * This routine is supposed to apply whatever error recovery strategy seems
1155
- * appropriate in order to position the input stream to the next data segment.
1156
- * Note that cinfo->unread_marker is treated as a marker appearing before
1157
- * the current data-source input point; usually it should be reset to zero
1158
- * before returning.
1159
- * Returns FALSE if suspension is required.
1160
- *
1161
- * This implementation is substantially constrained by wanting to treat the
1162
- * input as a data stream; this means we can't back up. Therefore, we have
1163
- * only the following actions to work with:
1164
- * 1. Simply discard the marker and let the entropy decoder resume at next
1165
- * byte of file.
1166
- * 2. Read forward until we find another marker, discarding intervening
1167
- * data. (In theory we could look ahead within the current bufferload,
1168
- * without having to discard data if we don't find the desired marker.
1169
- * This idea is not implemented here, in part because it makes behavior
1170
- * dependent on buffer size and chance buffer-boundary positions.)
1171
- * 3. Leave the marker unread (by failing to zero cinfo->unread_marker).
1172
- * This will cause the entropy decoder to process an empty data segment,
1173
- * inserting dummy zeroes, and then we will reprocess the marker.
1174
- *
1175
- * #2 is appropriate if we think the desired marker lies ahead, while #3 is
1176
- * appropriate if the found marker is a future restart marker (indicating
1177
- * that we have missed the desired restart marker, probably because it got
1178
- * corrupted).
1179
- * We apply #2 or #3 if the found marker is a restart marker no more than
1180
- * two counts behind or ahead of the expected one. We also apply #2 if the
1181
- * found marker is not a legal JPEG marker code (it's certainly bogus data).
1182
- * If the found marker is a restart marker more than 2 counts away, we do #1
1183
- * (too much risk that the marker is erroneous; with luck we will be able to
1184
- * resync at some future point).
1185
- * For any valid non-restart JPEG marker, we apply #3. This keeps us from
1186
- * overrunning the end of a scan. An implementation limited to single-scan
1187
- * files might find it better to apply #2 for markers other than EOI, since
1188
- * any other marker would have to be bogus data in that case.
1189
- */
1190
-
1191
- GLOBAL(boolean)
1192
- jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired)
1193
- {
1194
- int marker = cinfo->unread_marker;
1195
- int action = 1;
1196
-
1197
- /* Always put up a warning. */
1198
- WARNMS2(cinfo, JWRN_MUST_RESYNC, marker, desired);
1199
-
1200
- /* Outer loop handles repeated decision after scanning forward. */
1201
- for (;;) {
1202
- if (marker < (int) M_SOF0)
1203
- action = 2; /* invalid marker */
1204
- else if (marker < (int) M_RST0 || marker > (int) M_RST7)
1205
- action = 3; /* valid non-restart marker */
1206
- else {
1207
- if (marker == ((int) M_RST0 + ((desired+1) & 7)) ||
1208
- marker == ((int) M_RST0 + ((desired+2) & 7)))
1209
- action = 3; /* one of the next two expected restarts */
1210
- else if (marker == ((int) M_RST0 + ((desired-1) & 7)) ||
1211
- marker == ((int) M_RST0 + ((desired-2) & 7)))
1212
- action = 2; /* a prior restart, so advance */
1213
- else
1214
- action = 1; /* desired restart or too far away */
1215
- }
1216
- TRACEMS2(cinfo, 4, JTRC_RECOVERY_ACTION, marker, action);
1217
- switch (action) {
1218
- case 1:
1219
- /* Discard marker and let entropy decoder resume processing. */
1220
- cinfo->unread_marker = 0;
1221
- return TRUE;
1222
- case 2:
1223
- /* Scan to the next marker, and repeat the decision loop. */
1224
- if (! next_marker(cinfo))
1225
- return FALSE;
1226
- marker = cinfo->unread_marker;
1227
- break;
1228
- case 3:
1229
- /* Return without advancing past this marker. */
1230
- /* Entropy decoder will be forced to process an empty segment. */
1231
- return TRUE;
1232
- }
1233
- } /* end loop */
1234
- }
1235
-
1236
-
1237
- /*
1238
- * Reset marker processing state to begin a fresh datastream.
1239
- */
1240
-
1241
- METHODDEF(void)
1242
- reset_marker_reader (j_decompress_ptr cinfo)
1243
- {
1244
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
1245
-
1246
- cinfo->comp_info = NULL; /* until allocated by get_sof */
1247
- cinfo->input_scan_number = 0; /* no SOS seen yet */
1248
- cinfo->unread_marker = 0; /* no pending marker */
1249
- marker->pub.saw_SOI = FALSE; /* set internal state too */
1250
- marker->pub.saw_SOF = FALSE;
1251
- marker->pub.discarded_bytes = 0;
1252
- marker->cur_marker = NULL;
1253
- }
1254
-
1255
-
1256
- /*
1257
- * Initialize the marker reader module.
1258
- * This is called only once, when the decompression object is created.
1259
- */
1260
-
1261
- GLOBAL(void)
1262
- jinit_marker_reader (j_decompress_ptr cinfo)
1263
- {
1264
- my_marker_ptr marker;
1265
- int i;
1266
-
1267
- /* Create subobject in permanent pool */
1268
- marker = (my_marker_ptr)
1269
- (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
1270
- SIZEOF(my_marker_reader));
1271
- cinfo->marker = (struct jpeg_marker_reader *) marker;
1272
- /* Initialize public method pointers */
1273
- marker->pub.reset_marker_reader = reset_marker_reader;
1274
- marker->pub.read_markers = read_markers;
1275
- marker->pub.read_restart_marker = read_restart_marker;
1276
- /* Initialize COM/APPn processing.
1277
- * By default, we examine and then discard APP0 and APP14,
1278
- * but simply discard COM and all other APPn.
1279
- */
1280
- marker->process_COM = skip_variable;
1281
- marker->length_limit_COM = 0;
1282
- for (i = 0; i < 16; i++) {
1283
- marker->process_APPn[i] = skip_variable;
1284
- marker->length_limit_APPn[i] = 0;
1285
- }
1286
- marker->process_APPn[0] = get_interesting_appn;
1287
- marker->process_APPn[14] = get_interesting_appn;
1288
- /* Reset marker processing state */
1289
- reset_marker_reader(cinfo);
1290
- }
1291
-
1292
-
1293
- /*
1294
- * Control saving of COM and APPn markers into marker_list.
1295
- */
1296
-
1297
- #ifdef SAVE_MARKERS_SUPPORTED
1298
-
1299
- GLOBAL(void)
1300
- jpeg_save_markers (j_decompress_ptr cinfo, int marker_code,
1301
- unsigned int length_limit)
1302
- {
1303
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
1304
- long maxlength;
1305
- jpeg_marker_parser_method processor;
1306
-
1307
- /* Length limit mustn't be larger than what we can allocate
1308
- * (should only be a concern in a 16-bit environment).
1309
- */
1310
- maxlength = cinfo->mem->max_alloc_chunk - SIZEOF(struct jpeg_marker_struct);
1311
- if (((long) length_limit) > maxlength)
1312
- length_limit = (unsigned int) maxlength;
1313
-
1314
- /* Choose processor routine to use.
1315
- * APP0/APP14 have special requirements.
1316
- */
1317
- if (length_limit) {
1318
- processor = save_marker;
1319
- /* If saving APP0/APP14, save at least enough for our internal use. */
1320
- if (marker_code == (int) M_APP0 && length_limit < APP0_DATA_LEN)
1321
- length_limit = APP0_DATA_LEN;
1322
- else if (marker_code == (int) M_APP14 && length_limit < APP14_DATA_LEN)
1323
- length_limit = APP14_DATA_LEN;
1324
- } else {
1325
- processor = skip_variable;
1326
- /* If discarding APP0/APP14, use our regular on-the-fly processor. */
1327
- if (marker_code == (int) M_APP0 || marker_code == (int) M_APP14)
1328
- processor = get_interesting_appn;
1329
- }
1330
-
1331
- if (marker_code == (int) M_COM) {
1332
- marker->process_COM = processor;
1333
- marker->length_limit_COM = length_limit;
1334
- } else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15) {
1335
- marker->process_APPn[marker_code - (int) M_APP0] = processor;
1336
- marker->length_limit_APPn[marker_code - (int) M_APP0] = length_limit;
1337
- } else
1338
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
1339
- }
1340
-
1341
- #endif /* SAVE_MARKERS_SUPPORTED */
1342
-
1343
-
1344
- /*
1345
- * Install a special processing method for COM or APPn markers.
1346
- */
1347
-
1348
- GLOBAL(void)
1349
- jpeg_set_marker_processor (j_decompress_ptr cinfo, int marker_code,
1350
- jpeg_marker_parser_method routine)
1351
- {
1352
- my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
1353
-
1354
- if (marker_code == (int) M_COM)
1355
- marker->process_COM = routine;
1356
- else if (marker_code >= (int) M_APP0 && marker_code <= (int) M_APP15)
1357
- marker->process_APPn[marker_code - (int) M_APP0] = routine;
1358
- else
1359
- ERREXIT1(cinfo, JERR_UNKNOWN_MARKER, marker_code);
1360
- }