isbn 1.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (291) hide show
  1. data/.gitignore +4 -0
  2. data/README +9 -0
  3. data/Rakefile +13 -0
  4. data/VERSION +1 -0
  5. data/isbn.gemspec +329 -0
  6. data/lib/isbn.rb +90 -0
  7. data/src/gocr-0.48/.cvsignore +6 -0
  8. data/src/gocr-0.48/AUTHORS +7 -0
  9. data/src/gocr-0.48/BUGS +55 -0
  10. data/src/gocr-0.48/CREDITS +17 -0
  11. data/src/gocr-0.48/HISTORY +243 -0
  12. data/src/gocr-0.48/INSTALL +83 -0
  13. data/src/gocr-0.48/Makefile +193 -0
  14. data/src/gocr-0.48/Makefile.in +193 -0
  15. data/src/gocr-0.48/README +165 -0
  16. data/src/gocr-0.48/READMEde.txt +80 -0
  17. data/src/gocr-0.48/REMARK.txt +18 -0
  18. data/src/gocr-0.48/REVIEW +538 -0
  19. data/src/gocr-0.48/TODO +65 -0
  20. data/src/gocr-0.48/bin/.cvsignore +2 -0
  21. data/src/gocr-0.48/bin/create_db +38 -0
  22. data/src/gocr-0.48/bin/gocr.tcl +527 -0
  23. data/src/gocr-0.48/bin/gocr_chk.sh +44 -0
  24. data/src/gocr-0.48/configure +4689 -0
  25. data/src/gocr-0.48/configure.in +71 -0
  26. data/src/gocr-0.48/doc/.#Makefile.1.6 +39 -0
  27. data/src/gocr-0.48/doc/.cvsignore +2 -0
  28. data/src/gocr-0.48/doc/Makefile +39 -0
  29. data/src/gocr-0.48/doc/Makefile.in +39 -0
  30. data/src/gocr-0.48/doc/example.dtd +53 -0
  31. data/src/gocr-0.48/doc/example.xml +21 -0
  32. data/src/gocr-0.48/doc/examples.txt +67 -0
  33. data/src/gocr-0.48/doc/gocr.html +578 -0
  34. data/src/gocr-0.48/doc/unicode.txt +57 -0
  35. data/src/gocr-0.48/examples/.#Makefile.1.22 +166 -0
  36. data/src/gocr-0.48/examples/4x6.png +0 -0
  37. data/src/gocr-0.48/examples/4x6.txt +2 -0
  38. data/src/gocr-0.48/examples/5x7.png +0 -0
  39. data/src/gocr-0.48/examples/5x7.png.txt +2 -0
  40. data/src/gocr-0.48/examples/5x8.png +0 -0
  41. data/src/gocr-0.48/examples/5x8.png.txt +2 -0
  42. data/src/gocr-0.48/examples/Makefile +166 -0
  43. data/src/gocr-0.48/examples/color.fig +20 -0
  44. data/src/gocr-0.48/examples/ex.fig +16 -0
  45. data/src/gocr-0.48/examples/font.tex +22 -0
  46. data/src/gocr-0.48/examples/font1.tex +46 -0
  47. data/src/gocr-0.48/examples/font2.fig +27 -0
  48. data/src/gocr-0.48/examples/font_nw.tex +24 -0
  49. data/src/gocr-0.48/examples/handwrt1.jpg +0 -0
  50. data/src/gocr-0.48/examples/handwrt1.txt +10 -0
  51. data/src/gocr-0.48/examples/inverse.fig +20 -0
  52. data/src/gocr-0.48/examples/matrix.jpg +0 -0
  53. data/src/gocr-0.48/examples/ocr-a-subset.png +0 -0
  54. data/src/gocr-0.48/examples/ocr-a-subset.png.txt +4 -0
  55. data/src/gocr-0.48/examples/ocr-a.png +0 -0
  56. data/src/gocr-0.48/examples/ocr-a.txt +6 -0
  57. data/src/gocr-0.48/examples/ocr-b.png +0 -0
  58. data/src/gocr-0.48/examples/ocr-b.png.txt +4 -0
  59. data/src/gocr-0.48/examples/polish.tex +28 -0
  60. data/src/gocr-0.48/examples/rotate45.fig +14 -0
  61. data/src/gocr-0.48/examples/score +36 -0
  62. data/src/gocr-0.48/examples/text.tex +28 -0
  63. data/src/gocr-0.48/gocr.spec +143 -0
  64. data/src/gocr-0.48/gpl.html +537 -0
  65. data/src/gocr-0.48/include/.cvsignore +2 -0
  66. data/src/gocr-0.48/include/config.h +36 -0
  67. data/src/gocr-0.48/include/config.h.in +36 -0
  68. data/src/gocr-0.48/include/version.h +2 -0
  69. data/src/gocr-0.48/install-sh +3 -0
  70. data/src/gocr-0.48/make.bat +57 -0
  71. data/src/gocr-0.48/man/.cvsignore +2 -0
  72. data/src/gocr-0.48/man/Makefile +29 -0
  73. data/src/gocr-0.48/man/Makefile.in +29 -0
  74. data/src/gocr-0.48/man/man1/gocr.1 +166 -0
  75. data/src/gocr-0.48/src/.cvsignore +4 -0
  76. data/src/gocr-0.48/src/Makefile +132 -0
  77. data/src/gocr-0.48/src/Makefile.in +132 -0
  78. data/src/gocr-0.48/src/amiga.h +31 -0
  79. data/src/gocr-0.48/src/barcode.c +846 -0
  80. data/src/gocr-0.48/src/barcode.c.orig +593 -0
  81. data/src/gocr-0.48/src/barcode.h +11 -0
  82. data/src/gocr-0.48/src/box.c +372 -0
  83. data/src/gocr-0.48/src/database.c +462 -0
  84. data/src/gocr-0.48/src/detect.c +943 -0
  85. data/src/gocr-0.48/src/gocr.c +373 -0
  86. data/src/gocr-0.48/src/gocr.h +288 -0
  87. data/src/gocr-0.48/src/jconv.c +168 -0
  88. data/src/gocr-0.48/src/job.c +84 -0
  89. data/src/gocr-0.48/src/lines.c +350 -0
  90. data/src/gocr-0.48/src/list.c +334 -0
  91. data/src/gocr-0.48/src/list.h +90 -0
  92. data/src/gocr-0.48/src/ocr0.c +6756 -0
  93. data/src/gocr-0.48/src/ocr0.h +63 -0
  94. data/src/gocr-0.48/src/ocr0n.c +1475 -0
  95. data/src/gocr-0.48/src/ocr1.c +85 -0
  96. data/src/gocr-0.48/src/ocr1.h +3 -0
  97. data/src/gocr-0.48/src/otsu.c +289 -0
  98. data/src/gocr-0.48/src/otsu.h +23 -0
  99. data/src/gocr-0.48/src/output.c +289 -0
  100. data/src/gocr-0.48/src/output.h +37 -0
  101. data/src/gocr-0.48/src/pcx.c +153 -0
  102. data/src/gocr-0.48/src/pcx.h +9 -0
  103. data/src/gocr-0.48/src/pgm2asc.c +2893 -0
  104. data/src/gocr-0.48/src/pgm2asc.h +105 -0
  105. data/src/gocr-0.48/src/pixel.c +537 -0
  106. data/src/gocr-0.48/src/pnm.c +533 -0
  107. data/src/gocr-0.48/src/pnm.h +35 -0
  108. data/src/gocr-0.48/src/progress.c +87 -0
  109. data/src/gocr-0.48/src/progress.h +42 -0
  110. data/src/gocr-0.48/src/remove.c +703 -0
  111. data/src/gocr-0.48/src/tga.c +87 -0
  112. data/src/gocr-0.48/src/tga.h +6 -0
  113. data/src/gocr-0.48/src/unicode.c +1314 -0
  114. data/src/gocr-0.48/src/unicode.h +1257 -0
  115. data/src/jpeg-7/Makefile.am +133 -0
  116. data/src/jpeg-7/Makefile.in +1089 -0
  117. data/src/jpeg-7/README +322 -0
  118. data/src/jpeg-7/aclocal.m4 +8990 -0
  119. data/src/jpeg-7/ansi2knr.1 +36 -0
  120. data/src/jpeg-7/ansi2knr.c +739 -0
  121. data/src/jpeg-7/cderror.h +132 -0
  122. data/src/jpeg-7/cdjpeg.c +181 -0
  123. data/src/jpeg-7/cdjpeg.h +187 -0
  124. data/src/jpeg-7/change.log +270 -0
  125. data/src/jpeg-7/cjpeg.1 +325 -0
  126. data/src/jpeg-7/cjpeg.c +616 -0
  127. data/src/jpeg-7/ckconfig.c +402 -0
  128. data/src/jpeg-7/coderules.txt +118 -0
  129. data/src/jpeg-7/config.guess +1561 -0
  130. data/src/jpeg-7/config.sub +1686 -0
  131. data/src/jpeg-7/configure +17139 -0
  132. data/src/jpeg-7/configure.ac +317 -0
  133. data/src/jpeg-7/depcomp +630 -0
  134. data/src/jpeg-7/djpeg.1 +251 -0
  135. data/src/jpeg-7/djpeg.c +617 -0
  136. data/src/jpeg-7/example.c +433 -0
  137. data/src/jpeg-7/filelist.txt +215 -0
  138. data/src/jpeg-7/install-sh +520 -0
  139. data/src/jpeg-7/install.txt +1097 -0
  140. data/src/jpeg-7/jaricom.c +148 -0
  141. data/src/jpeg-7/jcapimin.c +282 -0
  142. data/src/jpeg-7/jcapistd.c +161 -0
  143. data/src/jpeg-7/jcarith.c +921 -0
  144. data/src/jpeg-7/jccoefct.c +453 -0
  145. data/src/jpeg-7/jccolor.c +459 -0
  146. data/src/jpeg-7/jcdctmgr.c +482 -0
  147. data/src/jpeg-7/jchuff.c +1612 -0
  148. data/src/jpeg-7/jcinit.c +65 -0
  149. data/src/jpeg-7/jcmainct.c +293 -0
  150. data/src/jpeg-7/jcmarker.c +667 -0
  151. data/src/jpeg-7/jcmaster.c +770 -0
  152. data/src/jpeg-7/jcomapi.c +106 -0
  153. data/src/jpeg-7/jconfig.bcc +48 -0
  154. data/src/jpeg-7/jconfig.cfg +45 -0
  155. data/src/jpeg-7/jconfig.dj +38 -0
  156. data/src/jpeg-7/jconfig.mac +43 -0
  157. data/src/jpeg-7/jconfig.manx +43 -0
  158. data/src/jpeg-7/jconfig.mc6 +52 -0
  159. data/src/jpeg-7/jconfig.sas +43 -0
  160. data/src/jpeg-7/jconfig.st +42 -0
  161. data/src/jpeg-7/jconfig.txt +155 -0
  162. data/src/jpeg-7/jconfig.vc +45 -0
  163. data/src/jpeg-7/jconfig.vms +37 -0
  164. data/src/jpeg-7/jconfig.wat +38 -0
  165. data/src/jpeg-7/jcparam.c +632 -0
  166. data/src/jpeg-7/jcprepct.c +358 -0
  167. data/src/jpeg-7/jcsample.c +545 -0
  168. data/src/jpeg-7/jctrans.c +381 -0
  169. data/src/jpeg-7/jdapimin.c +396 -0
  170. data/src/jpeg-7/jdapistd.c +275 -0
  171. data/src/jpeg-7/jdarith.c +762 -0
  172. data/src/jpeg-7/jdatadst.c +151 -0
  173. data/src/jpeg-7/jdatasrc.c +212 -0
  174. data/src/jpeg-7/jdcoefct.c +736 -0
  175. data/src/jpeg-7/jdcolor.c +396 -0
  176. data/src/jpeg-7/jdct.h +393 -0
  177. data/src/jpeg-7/jddctmgr.c +382 -0
  178. data/src/jpeg-7/jdhuff.c +1309 -0
  179. data/src/jpeg-7/jdinput.c +384 -0
  180. data/src/jpeg-7/jdmainct.c +512 -0
  181. data/src/jpeg-7/jdmarker.c +1360 -0
  182. data/src/jpeg-7/jdmaster.c +663 -0
  183. data/src/jpeg-7/jdmerge.c +400 -0
  184. data/src/jpeg-7/jdpostct.c +290 -0
  185. data/src/jpeg-7/jdsample.c +361 -0
  186. data/src/jpeg-7/jdtrans.c +136 -0
  187. data/src/jpeg-7/jerror.c +252 -0
  188. data/src/jpeg-7/jerror.h +304 -0
  189. data/src/jpeg-7/jfdctflt.c +174 -0
  190. data/src/jpeg-7/jfdctfst.c +230 -0
  191. data/src/jpeg-7/jfdctint.c +4348 -0
  192. data/src/jpeg-7/jidctflt.c +242 -0
  193. data/src/jpeg-7/jidctfst.c +368 -0
  194. data/src/jpeg-7/jidctint.c +5137 -0
  195. data/src/jpeg-7/jinclude.h +91 -0
  196. data/src/jpeg-7/jmemansi.c +167 -0
  197. data/src/jpeg-7/jmemdos.c +638 -0
  198. data/src/jpeg-7/jmemdosa.asm +379 -0
  199. data/src/jpeg-7/jmemmac.c +289 -0
  200. data/src/jpeg-7/jmemmgr.c +1118 -0
  201. data/src/jpeg-7/jmemname.c +276 -0
  202. data/src/jpeg-7/jmemnobs.c +109 -0
  203. data/src/jpeg-7/jmemsys.h +198 -0
  204. data/src/jpeg-7/jmorecfg.h +369 -0
  205. data/src/jpeg-7/jpegint.h +395 -0
  206. data/src/jpeg-7/jpeglib.h +1135 -0
  207. data/src/jpeg-7/jpegtran.1 +272 -0
  208. data/src/jpeg-7/jpegtran.c +546 -0
  209. data/src/jpeg-7/jquant1.c +856 -0
  210. data/src/jpeg-7/jquant2.c +1310 -0
  211. data/src/jpeg-7/jutils.c +179 -0
  212. data/src/jpeg-7/jversion.h +14 -0
  213. data/src/jpeg-7/libjpeg.map +4 -0
  214. data/src/jpeg-7/libjpeg.txt +3067 -0
  215. data/src/jpeg-7/ltmain.sh +8406 -0
  216. data/src/jpeg-7/makcjpeg.st +36 -0
  217. data/src/jpeg-7/makdjpeg.st +36 -0
  218. data/src/jpeg-7/makeadsw.vc6 +77 -0
  219. data/src/jpeg-7/makeasln.vc9 +33 -0
  220. data/src/jpeg-7/makecdep.vc6 +82 -0
  221. data/src/jpeg-7/makecdsp.vc6 +130 -0
  222. data/src/jpeg-7/makecmak.vc6 +159 -0
  223. data/src/jpeg-7/makecvcp.vc9 +186 -0
  224. data/src/jpeg-7/makeddep.vc6 +82 -0
  225. data/src/jpeg-7/makeddsp.vc6 +130 -0
  226. data/src/jpeg-7/makedmak.vc6 +159 -0
  227. data/src/jpeg-7/makedvcp.vc9 +186 -0
  228. data/src/jpeg-7/makefile.ansi +220 -0
  229. data/src/jpeg-7/makefile.bcc +291 -0
  230. data/src/jpeg-7/makefile.dj +226 -0
  231. data/src/jpeg-7/makefile.manx +220 -0
  232. data/src/jpeg-7/makefile.mc6 +255 -0
  233. data/src/jpeg-7/makefile.mms +224 -0
  234. data/src/jpeg-7/makefile.sas +258 -0
  235. data/src/jpeg-7/makefile.unix +234 -0
  236. data/src/jpeg-7/makefile.vc +217 -0
  237. data/src/jpeg-7/makefile.vms +142 -0
  238. data/src/jpeg-7/makefile.wat +239 -0
  239. data/src/jpeg-7/makejdep.vc6 +423 -0
  240. data/src/jpeg-7/makejdsp.vc6 +285 -0
  241. data/src/jpeg-7/makejdsw.vc6 +29 -0
  242. data/src/jpeg-7/makejmak.vc6 +425 -0
  243. data/src/jpeg-7/makejsln.vc9 +17 -0
  244. data/src/jpeg-7/makejvcp.vc9 +328 -0
  245. data/src/jpeg-7/makeproj.mac +213 -0
  246. data/src/jpeg-7/makerdep.vc6 +6 -0
  247. data/src/jpeg-7/makerdsp.vc6 +78 -0
  248. data/src/jpeg-7/makermak.vc6 +110 -0
  249. data/src/jpeg-7/makervcp.vc9 +133 -0
  250. data/src/jpeg-7/maketdep.vc6 +43 -0
  251. data/src/jpeg-7/maketdsp.vc6 +122 -0
  252. data/src/jpeg-7/maketmak.vc6 +131 -0
  253. data/src/jpeg-7/maketvcp.vc9 +178 -0
  254. data/src/jpeg-7/makewdep.vc6 +6 -0
  255. data/src/jpeg-7/makewdsp.vc6 +78 -0
  256. data/src/jpeg-7/makewmak.vc6 +110 -0
  257. data/src/jpeg-7/makewvcp.vc9 +133 -0
  258. data/src/jpeg-7/makljpeg.st +68 -0
  259. data/src/jpeg-7/maktjpeg.st +30 -0
  260. data/src/jpeg-7/makvms.opt +4 -0
  261. data/src/jpeg-7/missing +376 -0
  262. data/src/jpeg-7/rdbmp.c +439 -0
  263. data/src/jpeg-7/rdcolmap.c +253 -0
  264. data/src/jpeg-7/rdgif.c +38 -0
  265. data/src/jpeg-7/rdjpgcom.1 +63 -0
  266. data/src/jpeg-7/rdjpgcom.c +515 -0
  267. data/src/jpeg-7/rdppm.c +459 -0
  268. data/src/jpeg-7/rdrle.c +387 -0
  269. data/src/jpeg-7/rdswitch.c +365 -0
  270. data/src/jpeg-7/rdtarga.c +500 -0
  271. data/src/jpeg-7/structure.txt +945 -0
  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 +4 -0
  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 +1533 -0
  279. data/src/jpeg-7/transupp.h +205 -0
  280. data/src/jpeg-7/usage.txt +605 -0
  281. data/src/jpeg-7/wizard.txt +211 -0
  282. data/src/jpeg-7/wrbmp.c +442 -0
  283. data/src/jpeg-7/wrgif.c +399 -0
  284. data/src/jpeg-7/wrjpgcom.1 +103 -0
  285. data/src/jpeg-7/wrjpgcom.c +583 -0
  286. data/src/jpeg-7/wrppm.c +269 -0
  287. data/src/jpeg-7/wrrle.c +305 -0
  288. data/src/jpeg-7/wrtarga.c +253 -0
  289. data/test/isbn_test.rb +7 -0
  290. data/test/test_helper.rb +7 -0
  291. metadata +345 -0
@@ -0,0 +1,439 @@
1
+ /*
2
+ * rdbmp.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 routines to read input images in Microsoft "BMP"
9
+ * format (MS Windows 3.x, OS/2 1.x, and OS/2 2.x flavors).
10
+ * Currently, only 8-bit and 24-bit images are supported, not 1-bit or
11
+ * 4-bit (feeding such low-depth images into JPEG would be silly anyway).
12
+ * Also, we don't support RLE-compressed files.
13
+ *
14
+ * These routines may need modification for non-Unix environments or
15
+ * specialized applications. As they stand, they assume input from
16
+ * an ordinary stdio stream. They further assume that reading begins
17
+ * at the start of the file; start_input may need work if the
18
+ * user interface has already read some data (e.g., to determine that
19
+ * the file is indeed BMP format).
20
+ *
21
+ * This code contributed by James Arthur Boucher.
22
+ */
23
+
24
+ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
25
+
26
+ #ifdef BMP_SUPPORTED
27
+
28
+
29
+ /* Macros to deal with unsigned chars as efficiently as compiler allows */
30
+
31
+ #ifdef HAVE_UNSIGNED_CHAR
32
+ typedef unsigned char U_CHAR;
33
+ #define UCH(x) ((int) (x))
34
+ #else /* !HAVE_UNSIGNED_CHAR */
35
+ #ifdef CHAR_IS_UNSIGNED
36
+ typedef char U_CHAR;
37
+ #define UCH(x) ((int) (x))
38
+ #else
39
+ typedef char U_CHAR;
40
+ #define UCH(x) ((int) (x) & 0xFF)
41
+ #endif
42
+ #endif /* HAVE_UNSIGNED_CHAR */
43
+
44
+
45
+ #define ReadOK(file,buffer,len) (JFREAD(file,buffer,len) == ((size_t) (len)))
46
+
47
+
48
+ /* Private version of data source object */
49
+
50
+ typedef struct _bmp_source_struct * bmp_source_ptr;
51
+
52
+ typedef struct _bmp_source_struct {
53
+ struct cjpeg_source_struct pub; /* public fields */
54
+
55
+ j_compress_ptr cinfo; /* back link saves passing separate parm */
56
+
57
+ JSAMPARRAY colormap; /* BMP colormap (converted to my format) */
58
+
59
+ jvirt_sarray_ptr whole_image; /* Needed to reverse row order */
60
+ JDIMENSION source_row; /* Current source row number */
61
+ JDIMENSION row_width; /* Physical width of scanlines in file */
62
+
63
+ int bits_per_pixel; /* remembers 8- or 24-bit format */
64
+ } bmp_source_struct;
65
+
66
+
67
+ LOCAL(int)
68
+ read_byte (bmp_source_ptr sinfo)
69
+ /* Read next byte from BMP file */
70
+ {
71
+ register FILE *infile = sinfo->pub.input_file;
72
+ register int c;
73
+
74
+ if ((c = getc(infile)) == EOF)
75
+ ERREXIT(sinfo->cinfo, JERR_INPUT_EOF);
76
+ return c;
77
+ }
78
+
79
+
80
+ LOCAL(void)
81
+ read_colormap (bmp_source_ptr sinfo, int cmaplen, int mapentrysize)
82
+ /* Read the colormap from a BMP file */
83
+ {
84
+ int i;
85
+
86
+ switch (mapentrysize) {
87
+ case 3:
88
+ /* BGR format (occurs in OS/2 files) */
89
+ for (i = 0; i < cmaplen; i++) {
90
+ sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);
91
+ sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);
92
+ sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);
93
+ }
94
+ break;
95
+ case 4:
96
+ /* BGR0 format (occurs in MS Windows files) */
97
+ for (i = 0; i < cmaplen; i++) {
98
+ sinfo->colormap[2][i] = (JSAMPLE) read_byte(sinfo);
99
+ sinfo->colormap[1][i] = (JSAMPLE) read_byte(sinfo);
100
+ sinfo->colormap[0][i] = (JSAMPLE) read_byte(sinfo);
101
+ (void) read_byte(sinfo);
102
+ }
103
+ break;
104
+ default:
105
+ ERREXIT(sinfo->cinfo, JERR_BMP_BADCMAP);
106
+ break;
107
+ }
108
+ }
109
+
110
+
111
+ /*
112
+ * Read one row of pixels.
113
+ * The image has been read into the whole_image array, but is otherwise
114
+ * unprocessed. We must read it out in top-to-bottom row order, and if
115
+ * it is an 8-bit image, we must expand colormapped pixels to 24bit format.
116
+ */
117
+
118
+ METHODDEF(JDIMENSION)
119
+ get_8bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
120
+ /* This version is for reading 8-bit colormap indexes */
121
+ {
122
+ bmp_source_ptr source = (bmp_source_ptr) sinfo;
123
+ register JSAMPARRAY colormap = source->colormap;
124
+ JSAMPARRAY image_ptr;
125
+ register int t;
126
+ register JSAMPROW inptr, outptr;
127
+ register JDIMENSION col;
128
+
129
+ /* Fetch next row from virtual array */
130
+ source->source_row--;
131
+ image_ptr = (*cinfo->mem->access_virt_sarray)
132
+ ((j_common_ptr) cinfo, source->whole_image,
133
+ source->source_row, (JDIMENSION) 1, FALSE);
134
+
135
+ /* Expand the colormap indexes to real data */
136
+ inptr = image_ptr[0];
137
+ outptr = source->pub.buffer[0];
138
+ for (col = cinfo->image_width; col > 0; col--) {
139
+ t = GETJSAMPLE(*inptr++);
140
+ *outptr++ = colormap[0][t]; /* can omit GETJSAMPLE() safely */
141
+ *outptr++ = colormap[1][t];
142
+ *outptr++ = colormap[2][t];
143
+ }
144
+
145
+ return 1;
146
+ }
147
+
148
+
149
+ METHODDEF(JDIMENSION)
150
+ get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
151
+ /* This version is for reading 24-bit pixels */
152
+ {
153
+ bmp_source_ptr source = (bmp_source_ptr) sinfo;
154
+ JSAMPARRAY image_ptr;
155
+ register JSAMPROW inptr, outptr;
156
+ register JDIMENSION col;
157
+
158
+ /* Fetch next row from virtual array */
159
+ source->source_row--;
160
+ image_ptr = (*cinfo->mem->access_virt_sarray)
161
+ ((j_common_ptr) cinfo, source->whole_image,
162
+ source->source_row, (JDIMENSION) 1, FALSE);
163
+
164
+ /* Transfer data. Note source values are in BGR order
165
+ * (even though Microsoft's own documents say the opposite).
166
+ */
167
+ inptr = image_ptr[0];
168
+ outptr = source->pub.buffer[0];
169
+ for (col = cinfo->image_width; col > 0; col--) {
170
+ outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */
171
+ outptr[1] = *inptr++;
172
+ outptr[0] = *inptr++;
173
+ outptr += 3;
174
+ }
175
+
176
+ return 1;
177
+ }
178
+
179
+
180
+ /*
181
+ * This method loads the image into whole_image during the first call on
182
+ * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call
183
+ * get_8bit_row or get_24bit_row on subsequent calls.
184
+ */
185
+
186
+ METHODDEF(JDIMENSION)
187
+ preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
188
+ {
189
+ bmp_source_ptr source = (bmp_source_ptr) sinfo;
190
+ register FILE *infile = source->pub.input_file;
191
+ register int c;
192
+ register JSAMPROW out_ptr;
193
+ JSAMPARRAY image_ptr;
194
+ JDIMENSION row, col;
195
+ cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;
196
+
197
+ /* Read the data into a virtual array in input-file row order. */
198
+ for (row = 0; row < cinfo->image_height; row++) {
199
+ if (progress != NULL) {
200
+ progress->pub.pass_counter = (long) row;
201
+ progress->pub.pass_limit = (long) cinfo->image_height;
202
+ (*progress->pub.progress_monitor) ((j_common_ptr) cinfo);
203
+ }
204
+ image_ptr = (*cinfo->mem->access_virt_sarray)
205
+ ((j_common_ptr) cinfo, source->whole_image,
206
+ row, (JDIMENSION) 1, TRUE);
207
+ out_ptr = image_ptr[0];
208
+ for (col = source->row_width; col > 0; col--) {
209
+ /* inline copy of read_byte() for speed */
210
+ if ((c = getc(infile)) == EOF)
211
+ ERREXIT(cinfo, JERR_INPUT_EOF);
212
+ *out_ptr++ = (JSAMPLE) c;
213
+ }
214
+ }
215
+ if (progress != NULL)
216
+ progress->completed_extra_passes++;
217
+
218
+ /* Set up to read from the virtual array in top-to-bottom order */
219
+ switch (source->bits_per_pixel) {
220
+ case 8:
221
+ source->pub.get_pixel_rows = get_8bit_row;
222
+ break;
223
+ case 24:
224
+ source->pub.get_pixel_rows = get_24bit_row;
225
+ break;
226
+ default:
227
+ ERREXIT(cinfo, JERR_BMP_BADDEPTH);
228
+ }
229
+ source->source_row = cinfo->image_height;
230
+
231
+ /* And read the first row */
232
+ return (*source->pub.get_pixel_rows) (cinfo, sinfo);
233
+ }
234
+
235
+
236
+ /*
237
+ * Read the file header; return image size and component count.
238
+ */
239
+
240
+ METHODDEF(void)
241
+ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
242
+ {
243
+ bmp_source_ptr source = (bmp_source_ptr) sinfo;
244
+ U_CHAR bmpfileheader[14];
245
+ U_CHAR bmpinfoheader[64];
246
+ #define GET_2B(array,offset) ((unsigned int) UCH(array[offset]) + \
247
+ (((unsigned int) UCH(array[offset+1])) << 8))
248
+ #define GET_4B(array,offset) ((INT32) UCH(array[offset]) + \
249
+ (((INT32) UCH(array[offset+1])) << 8) + \
250
+ (((INT32) UCH(array[offset+2])) << 16) + \
251
+ (((INT32) UCH(array[offset+3])) << 24))
252
+ INT32 bfOffBits;
253
+ INT32 headerSize;
254
+ INT32 biWidth = 0; /* initialize to avoid compiler warning */
255
+ INT32 biHeight = 0;
256
+ unsigned int biPlanes;
257
+ INT32 biCompression;
258
+ INT32 biXPelsPerMeter,biYPelsPerMeter;
259
+ INT32 biClrUsed = 0;
260
+ int mapentrysize = 0; /* 0 indicates no colormap */
261
+ INT32 bPad;
262
+ JDIMENSION row_width;
263
+
264
+ /* Read and verify the bitmap file header */
265
+ if (! ReadOK(source->pub.input_file, bmpfileheader, 14))
266
+ ERREXIT(cinfo, JERR_INPUT_EOF);
267
+ if (GET_2B(bmpfileheader,0) != 0x4D42) /* 'BM' */
268
+ ERREXIT(cinfo, JERR_BMP_NOT);
269
+ bfOffBits = (INT32) GET_4B(bmpfileheader,10);
270
+ /* We ignore the remaining fileheader fields */
271
+
272
+ /* The infoheader might be 12 bytes (OS/2 1.x), 40 bytes (Windows),
273
+ * or 64 bytes (OS/2 2.x). Check the first 4 bytes to find out which.
274
+ */
275
+ if (! ReadOK(source->pub.input_file, bmpinfoheader, 4))
276
+ ERREXIT(cinfo, JERR_INPUT_EOF);
277
+ headerSize = (INT32) GET_4B(bmpinfoheader,0);
278
+ if (headerSize < 12 || headerSize > 64)
279
+ ERREXIT(cinfo, JERR_BMP_BADHEADER);
280
+ if (! ReadOK(source->pub.input_file, bmpinfoheader+4, headerSize-4))
281
+ ERREXIT(cinfo, JERR_INPUT_EOF);
282
+
283
+ switch ((int) headerSize) {
284
+ case 12:
285
+ /* Decode OS/2 1.x header (Microsoft calls this a BITMAPCOREHEADER) */
286
+ biWidth = (INT32) GET_2B(bmpinfoheader,4);
287
+ biHeight = (INT32) GET_2B(bmpinfoheader,6);
288
+ biPlanes = GET_2B(bmpinfoheader,8);
289
+ source->bits_per_pixel = (int) GET_2B(bmpinfoheader,10);
290
+
291
+ switch (source->bits_per_pixel) {
292
+ case 8: /* colormapped image */
293
+ mapentrysize = 3; /* OS/2 uses RGBTRIPLE colormap */
294
+ TRACEMS2(cinfo, 1, JTRC_BMP_OS2_MAPPED, (int) biWidth, (int) biHeight);
295
+ break;
296
+ case 24: /* RGB image */
297
+ TRACEMS2(cinfo, 1, JTRC_BMP_OS2, (int) biWidth, (int) biHeight);
298
+ break;
299
+ default:
300
+ ERREXIT(cinfo, JERR_BMP_BADDEPTH);
301
+ break;
302
+ }
303
+ if (biPlanes != 1)
304
+ ERREXIT(cinfo, JERR_BMP_BADPLANES);
305
+ break;
306
+ case 40:
307
+ case 64:
308
+ /* Decode Windows 3.x header (Microsoft calls this a BITMAPINFOHEADER) */
309
+ /* or OS/2 2.x header, which has additional fields that we ignore */
310
+ biWidth = GET_4B(bmpinfoheader,4);
311
+ biHeight = GET_4B(bmpinfoheader,8);
312
+ biPlanes = GET_2B(bmpinfoheader,12);
313
+ source->bits_per_pixel = (int) GET_2B(bmpinfoheader,14);
314
+ biCompression = GET_4B(bmpinfoheader,16);
315
+ biXPelsPerMeter = GET_4B(bmpinfoheader,24);
316
+ biYPelsPerMeter = GET_4B(bmpinfoheader,28);
317
+ biClrUsed = GET_4B(bmpinfoheader,32);
318
+ /* biSizeImage, biClrImportant fields are ignored */
319
+
320
+ switch (source->bits_per_pixel) {
321
+ case 8: /* colormapped image */
322
+ mapentrysize = 4; /* Windows uses RGBQUAD colormap */
323
+ TRACEMS2(cinfo, 1, JTRC_BMP_MAPPED, (int) biWidth, (int) biHeight);
324
+ break;
325
+ case 24: /* RGB image */
326
+ TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);
327
+ break;
328
+ default:
329
+ ERREXIT(cinfo, JERR_BMP_BADDEPTH);
330
+ break;
331
+ }
332
+ if (biPlanes != 1)
333
+ ERREXIT(cinfo, JERR_BMP_BADPLANES);
334
+ if (biCompression != 0)
335
+ ERREXIT(cinfo, JERR_BMP_COMPRESSED);
336
+
337
+ if (biXPelsPerMeter > 0 && biYPelsPerMeter > 0) {
338
+ /* Set JFIF density parameters from the BMP data */
339
+ cinfo->X_density = (UINT16) (biXPelsPerMeter/100); /* 100 cm per meter */
340
+ cinfo->Y_density = (UINT16) (biYPelsPerMeter/100);
341
+ cinfo->density_unit = 2; /* dots/cm */
342
+ }
343
+ break;
344
+ default:
345
+ ERREXIT(cinfo, JERR_BMP_BADHEADER);
346
+ break;
347
+ }
348
+
349
+ /* Compute distance to bitmap data --- will adjust for colormap below */
350
+ bPad = bfOffBits - (headerSize + 14);
351
+
352
+ /* Read the colormap, if any */
353
+ if (mapentrysize > 0) {
354
+ if (biClrUsed <= 0)
355
+ biClrUsed = 256; /* assume it's 256 */
356
+ else if (biClrUsed > 256)
357
+ ERREXIT(cinfo, JERR_BMP_BADCMAP);
358
+ /* Allocate space to store the colormap */
359
+ source->colormap = (*cinfo->mem->alloc_sarray)
360
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
361
+ (JDIMENSION) biClrUsed, (JDIMENSION) 3);
362
+ /* and read it from the file */
363
+ read_colormap(source, (int) biClrUsed, mapentrysize);
364
+ /* account for size of colormap */
365
+ bPad -= biClrUsed * mapentrysize;
366
+ }
367
+
368
+ /* Skip any remaining pad bytes */
369
+ if (bPad < 0) /* incorrect bfOffBits value? */
370
+ ERREXIT(cinfo, JERR_BMP_BADHEADER);
371
+ while (--bPad >= 0) {
372
+ (void) read_byte(source);
373
+ }
374
+
375
+ /* Compute row width in file, including padding to 4-byte boundary */
376
+ if (source->bits_per_pixel == 24)
377
+ row_width = (JDIMENSION) (biWidth * 3);
378
+ else
379
+ row_width = (JDIMENSION) biWidth;
380
+ while ((row_width & 3) != 0) row_width++;
381
+ source->row_width = row_width;
382
+
383
+ /* Allocate space for inversion array, prepare for preload pass */
384
+ source->whole_image = (*cinfo->mem->request_virt_sarray)
385
+ ((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
386
+ row_width, (JDIMENSION) biHeight, (JDIMENSION) 1);
387
+ source->pub.get_pixel_rows = preload_image;
388
+ if (cinfo->progress != NULL) {
389
+ cd_progress_ptr progress = (cd_progress_ptr) cinfo->progress;
390
+ progress->total_extra_passes++; /* count file input as separate pass */
391
+ }
392
+
393
+ /* Allocate one-row buffer for returned data */
394
+ source->pub.buffer = (*cinfo->mem->alloc_sarray)
395
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
396
+ (JDIMENSION) (biWidth * 3), (JDIMENSION) 1);
397
+ source->pub.buffer_height = 1;
398
+
399
+ cinfo->in_color_space = JCS_RGB;
400
+ cinfo->input_components = 3;
401
+ cinfo->data_precision = 8;
402
+ cinfo->image_width = (JDIMENSION) biWidth;
403
+ cinfo->image_height = (JDIMENSION) biHeight;
404
+ }
405
+
406
+
407
+ /*
408
+ * Finish up at the end of the file.
409
+ */
410
+
411
+ METHODDEF(void)
412
+ finish_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
413
+ {
414
+ /* no work */
415
+ }
416
+
417
+
418
+ /*
419
+ * The module selection routine for BMP format input.
420
+ */
421
+
422
+ GLOBAL(cjpeg_source_ptr)
423
+ jinit_read_bmp (j_compress_ptr cinfo)
424
+ {
425
+ bmp_source_ptr source;
426
+
427
+ /* Create module interface object */
428
+ source = (bmp_source_ptr)
429
+ (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
430
+ SIZEOF(bmp_source_struct));
431
+ source->cinfo = cinfo; /* make back link for subroutines */
432
+ /* Fill in method ptrs, except get_pixel_rows which start_input sets */
433
+ source->pub.start_input = start_input_bmp;
434
+ source->pub.finish_input = finish_input_bmp;
435
+
436
+ return (cjpeg_source_ptr) source;
437
+ }
438
+
439
+ #endif /* BMP_SUPPORTED */
@@ -0,0 +1,253 @@
1
+ /*
2
+ * rdcolmap.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 implements djpeg's "-map file" switch. It reads a source image
9
+ * and constructs a colormap to be supplied to the JPEG decompressor.
10
+ *
11
+ * Currently, these file formats are supported for the map file:
12
+ * GIF: the contents of the GIF's global colormap are used.
13
+ * PPM (either text or raw flavor): the entire file is read and
14
+ * each unique pixel value is entered in the map.
15
+ * Note that reading a large PPM file will be horrendously slow.
16
+ * Typically, a PPM-format map file should contain just one pixel
17
+ * of each desired color. Such a file can be extracted from an
18
+ * ordinary image PPM file with ppmtomap(1).
19
+ *
20
+ * Rescaling a PPM that has a maxval unequal to MAXJSAMPLE is not
21
+ * currently implemented.
22
+ */
23
+
24
+ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
25
+
26
+ #ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */
27
+
28
+ /* Portions of this code are based on the PBMPLUS library, which is:
29
+ **
30
+ ** Copyright (C) 1988 by Jef Poskanzer.
31
+ **
32
+ ** Permission to use, copy, modify, and distribute this software and its
33
+ ** documentation for any purpose and without fee is hereby granted, provided
34
+ ** that the above copyright notice appear in all copies and that both that
35
+ ** copyright notice and this permission notice appear in supporting
36
+ ** documentation. This software is provided "as is" without express or
37
+ ** implied warranty.
38
+ */
39
+
40
+
41
+ /*
42
+ * Add a (potentially) new color to the color map.
43
+ */
44
+
45
+ LOCAL(void)
46
+ add_map_entry (j_decompress_ptr cinfo, int R, int G, int B)
47
+ {
48
+ JSAMPROW colormap0 = cinfo->colormap[0];
49
+ JSAMPROW colormap1 = cinfo->colormap[1];
50
+ JSAMPROW colormap2 = cinfo->colormap[2];
51
+ int ncolors = cinfo->actual_number_of_colors;
52
+ int index;
53
+
54
+ /* Check for duplicate color. */
55
+ for (index = 0; index < ncolors; index++) {
56
+ if (GETJSAMPLE(colormap0[index]) == R &&
57
+ GETJSAMPLE(colormap1[index]) == G &&
58
+ GETJSAMPLE(colormap2[index]) == B)
59
+ return; /* color is already in map */
60
+ }
61
+
62
+ /* Check for map overflow. */
63
+ if (ncolors >= (MAXJSAMPLE+1))
64
+ ERREXIT1(cinfo, JERR_QUANT_MANY_COLORS, (MAXJSAMPLE+1));
65
+
66
+ /* OK, add color to map. */
67
+ colormap0[ncolors] = (JSAMPLE) R;
68
+ colormap1[ncolors] = (JSAMPLE) G;
69
+ colormap2[ncolors] = (JSAMPLE) B;
70
+ cinfo->actual_number_of_colors++;
71
+ }
72
+
73
+
74
+ /*
75
+ * Extract color map from a GIF file.
76
+ */
77
+
78
+ LOCAL(void)
79
+ read_gif_map (j_decompress_ptr cinfo, FILE * infile)
80
+ {
81
+ int header[13];
82
+ int i, colormaplen;
83
+ int R, G, B;
84
+
85
+ /* Initial 'G' has already been read by read_color_map */
86
+ /* Read the rest of the GIF header and logical screen descriptor */
87
+ for (i = 1; i < 13; i++) {
88
+ if ((header[i] = getc(infile)) == EOF)
89
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
90
+ }
91
+
92
+ /* Verify GIF Header */
93
+ if (header[1] != 'I' || header[2] != 'F')
94
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
95
+
96
+ /* There must be a global color map. */
97
+ if ((header[10] & 0x80) == 0)
98
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
99
+
100
+ /* OK, fetch it. */
101
+ colormaplen = 2 << (header[10] & 0x07);
102
+
103
+ for (i = 0; i < colormaplen; i++) {
104
+ R = getc(infile);
105
+ G = getc(infile);
106
+ B = getc(infile);
107
+ if (R == EOF || G == EOF || B == EOF)
108
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
109
+ add_map_entry(cinfo,
110
+ R << (BITS_IN_JSAMPLE-8),
111
+ G << (BITS_IN_JSAMPLE-8),
112
+ B << (BITS_IN_JSAMPLE-8));
113
+ }
114
+ }
115
+
116
+
117
+ /* Support routines for reading PPM */
118
+
119
+
120
+ LOCAL(int)
121
+ pbm_getc (FILE * infile)
122
+ /* Read next char, skipping over any comments */
123
+ /* A comment/newline sequence is returned as a newline */
124
+ {
125
+ register int ch;
126
+
127
+ ch = getc(infile);
128
+ if (ch == '#') {
129
+ do {
130
+ ch = getc(infile);
131
+ } while (ch != '\n' && ch != EOF);
132
+ }
133
+ return ch;
134
+ }
135
+
136
+
137
+ LOCAL(unsigned int)
138
+ read_pbm_integer (j_decompress_ptr cinfo, FILE * infile)
139
+ /* Read an unsigned decimal integer from the PPM file */
140
+ /* Swallows one trailing character after the integer */
141
+ /* Note that on a 16-bit-int machine, only values up to 64k can be read. */
142
+ /* This should not be a problem in practice. */
143
+ {
144
+ register int ch;
145
+ register unsigned int val;
146
+
147
+ /* Skip any leading whitespace */
148
+ do {
149
+ ch = pbm_getc(infile);
150
+ if (ch == EOF)
151
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
152
+ } while (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r');
153
+
154
+ if (ch < '0' || ch > '9')
155
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
156
+
157
+ val = ch - '0';
158
+ while ((ch = pbm_getc(infile)) >= '0' && ch <= '9') {
159
+ val *= 10;
160
+ val += ch - '0';
161
+ }
162
+ return val;
163
+ }
164
+
165
+
166
+ /*
167
+ * Extract color map from a PPM file.
168
+ */
169
+
170
+ LOCAL(void)
171
+ read_ppm_map (j_decompress_ptr cinfo, FILE * infile)
172
+ {
173
+ int c;
174
+ unsigned int w, h, maxval, row, col;
175
+ int R, G, B;
176
+
177
+ /* Initial 'P' has already been read by read_color_map */
178
+ c = getc(infile); /* save format discriminator for a sec */
179
+
180
+ /* while we fetch the remaining header info */
181
+ w = read_pbm_integer(cinfo, infile);
182
+ h = read_pbm_integer(cinfo, infile);
183
+ maxval = read_pbm_integer(cinfo, infile);
184
+
185
+ if (w <= 0 || h <= 0 || maxval <= 0) /* error check */
186
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
187
+
188
+ /* For now, we don't support rescaling from an unusual maxval. */
189
+ if (maxval != (unsigned int) MAXJSAMPLE)
190
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
191
+
192
+ switch (c) {
193
+ case '3': /* it's a text-format PPM file */
194
+ for (row = 0; row < h; row++) {
195
+ for (col = 0; col < w; col++) {
196
+ R = read_pbm_integer(cinfo, infile);
197
+ G = read_pbm_integer(cinfo, infile);
198
+ B = read_pbm_integer(cinfo, infile);
199
+ add_map_entry(cinfo, R, G, B);
200
+ }
201
+ }
202
+ break;
203
+
204
+ case '6': /* it's a raw-format PPM file */
205
+ for (row = 0; row < h; row++) {
206
+ for (col = 0; col < w; col++) {
207
+ R = getc(infile);
208
+ G = getc(infile);
209
+ B = getc(infile);
210
+ if (R == EOF || G == EOF || B == EOF)
211
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
212
+ add_map_entry(cinfo, R, G, B);
213
+ }
214
+ }
215
+ break;
216
+
217
+ default:
218
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
219
+ break;
220
+ }
221
+ }
222
+
223
+
224
+ /*
225
+ * Main entry point from djpeg.c.
226
+ * Input: opened input file (from file name argument on command line).
227
+ * Output: colormap and actual_number_of_colors fields are set in cinfo.
228
+ */
229
+
230
+ GLOBAL(void)
231
+ read_color_map (j_decompress_ptr cinfo, FILE * infile)
232
+ {
233
+ /* Allocate space for a color map of maximum supported size. */
234
+ cinfo->colormap = (*cinfo->mem->alloc_sarray)
235
+ ((j_common_ptr) cinfo, JPOOL_IMAGE,
236
+ (JDIMENSION) (MAXJSAMPLE+1), (JDIMENSION) 3);
237
+ cinfo->actual_number_of_colors = 0; /* initialize map to empty */
238
+
239
+ /* Read first byte to determine file format */
240
+ switch (getc(infile)) {
241
+ case 'G':
242
+ read_gif_map(cinfo, infile);
243
+ break;
244
+ case 'P':
245
+ read_ppm_map(cinfo, infile);
246
+ break;
247
+ default:
248
+ ERREXIT(cinfo, JERR_BAD_CMAP_FILE);
249
+ break;
250
+ }
251
+ }
252
+
253
+ #endif /* QUANT_2PASS_SUPPORTED */