home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / misc / volume34 / jpeg / part17 < prev    next >
Encoding:
Text File  |  1992-12-16  |  58.6 KB  |  1,544 lines

  1. Newsgroups: comp.sources.misc
  2. From: jpeg-info@uunet.uu.net (Independent JPEG Group)
  3. Subject:  v34i071:  jpeg - JPEG image compression, Part17/18
  4. Message-ID: <1992Dec17.165151.6951@sparky.imd.sterling.com>
  5. X-Md4-Signature: c879a52c664d36a6d89dc04fb3c5d17e
  6. Date: Thu, 17 Dec 1992 16:51:51 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: jpeg-info@uunet.uu.net (Independent JPEG Group)
  10. Posting-number: Volume 34, Issue 71
  11. Archive-name: jpeg/part17
  12. Environment: UNIX, VMS, MS-DOS, Mac, Amiga, Atari, Cray
  13. Supersedes: jpeg: Volume 29, Issue 1-18
  14.  
  15. #! /bin/sh
  16. # This is a shell archive.  Remove anything before this line, then feed it
  17. # into a shell via "sh file" or similar.  To overwrite existing files,
  18. # type "sh file -c".
  19. # Contents:  jcmcu.c jdmaster.c jdmcu.c jmemdos.h jmemsys.h
  20. #   makefile.mc5 makefile.sas testimg.jpg.U testorig.jpg.U
  21. # Wrapped by kent@sparky on Wed Dec 16 20:52:31 1992
  22. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  23. echo If this archive is complete, you will see the following message:
  24. echo '          "shar: End of archive 17 (of 18)."'
  25. if test -f 'jcmcu.c' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'jcmcu.c'\"
  27. else
  28.   echo shar: Extracting \"'jcmcu.c'\" \(5801 characters\)
  29.   sed "s/^X//" >'jcmcu.c' <<'END_OF_FILE'
  30. X/*
  31. X * jcmcu.c
  32. X *
  33. X * Copyright (C) 1991, 1992, Thomas G. Lane.
  34. X * This file is part of the Independent JPEG Group's software.
  35. X * For conditions of distribution and use, see the accompanying README file.
  36. X *
  37. X * This file contains MCU extraction routines and quantization scaling.
  38. X * These routines are invoked via the extract_MCUs and
  39. X * extract_init/term methods.
  40. X */
  41. X
  42. X#include "jinclude.h"
  43. X
  44. X
  45. X/*
  46. X * If this file is compiled with -DDCT_ERR_STATS, it will reverse-DCT each
  47. X * block and sum the total errors across the whole picture.  This provides
  48. X * a convenient method of using real picture data to test the roundoff error
  49. X * of a DCT algorithm.  DCT_ERR_STATS should *not* be defined for a production
  50. X * compression program, since compression is much slower with it defined.
  51. X * Also note that jrevdct.o must be linked into the compressor when this
  52. X * switch is defined.
  53. X */
  54. X
  55. X#ifdef DCT_ERR_STATS
  56. Xstatic int dcterrorsum;        /* these hold the error statistics */
  57. Xstatic int dcterrormax;
  58. Xstatic int dctcoefcount;    /* This will probably overflow on a 16-bit-int machine */
  59. X#endif
  60. X
  61. X
  62. X/* ZAG[i] is the natural-order position of the i'th element of zigzag order. */
  63. X
  64. Xstatic const short ZAG[DCTSIZE2] = {
  65. X  0,  1,  8, 16,  9,  2,  3, 10,
  66. X 17, 24, 32, 25, 18, 11,  4,  5,
  67. X 12, 19, 26, 33, 40, 48, 41, 34,
  68. X 27, 20, 13,  6,  7, 14, 21, 28,
  69. X 35, 42, 49, 56, 57, 50, 43, 36,
  70. X 29, 22, 15, 23, 30, 37, 44, 51,
  71. X 58, 59, 52, 45, 38, 31, 39, 46,
  72. X 53, 60, 61, 54, 47, 55, 62, 63
  73. X};
  74. X
  75. X
  76. XLOCAL void
  77. Xextract_block (JSAMPARRAY input_data, int start_row, long start_col,
  78. X           JBLOCK output_data, QUANT_TBL_PTR quanttbl)
  79. X/* Extract one 8x8 block from the specified location in the sample array; */
  80. X/* perform forward DCT, quantization scaling, and zigzag reordering on it. */
  81. X{
  82. X  /* This routine is heavily used, so it's worth coding it tightly. */
  83. X  DCTBLOCK block;
  84. X#ifdef DCT_ERR_STATS
  85. X  DCTBLOCK svblock;        /* saves input data for comparison */
  86. X#endif
  87. X
  88. X  { register JSAMPROW elemptr;
  89. X    register DCTELEM *localblkptr = block;
  90. X#if DCTSIZE != 8
  91. X    register int elemc;
  92. X#endif
  93. X    register int elemr;
  94. X
  95. X    for (elemr = DCTSIZE; elemr > 0; elemr--) {
  96. X      elemptr = input_data[start_row++] + start_col;
  97. X#if DCTSIZE == 8        /* unroll the inner loop */
  98. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  99. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  100. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  101. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  102. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  103. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  104. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  105. X      *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  106. X#else
  107. X      for (elemc = DCTSIZE; elemc > 0; elemc--) {
  108. X    *localblkptr++ = (DCTELEM) (GETJSAMPLE(*elemptr++) - CENTERJSAMPLE);
  109. X      }
  110. X#endif
  111. X    }
  112. X  }
  113. X
  114. X#ifdef DCT_ERR_STATS
  115. X  MEMCOPY(svblock, block, SIZEOF(DCTBLOCK));
  116. X#endif
  117. X
  118. X  j_fwd_dct(block);
  119. X
  120. X  { register JCOEF temp;
  121. X    register short i;
  122. X
  123. X    for (i = 0; i < DCTSIZE2; i++) {
  124. X      temp = (JCOEF) block[ZAG[i]];
  125. X      /* divide by *quanttbl, ensuring proper rounding */
  126. X      if (temp < 0) {
  127. X    temp = -temp;
  128. X    temp += *quanttbl>>1;
  129. X    temp /= *quanttbl;
  130. X    temp = -temp;
  131. X      } else {
  132. X    temp += *quanttbl>>1;
  133. X    temp /= *quanttbl;
  134. X      }
  135. X      *output_data++ = temp;
  136. X      quanttbl++;
  137. X    }
  138. X  }
  139. X
  140. X#ifdef DCT_ERR_STATS
  141. X  j_rev_dct(block);
  142. X
  143. X  { register int diff;
  144. X    register short i;
  145. X
  146. X    for (i = 0; i < DCTSIZE2; i++) {
  147. X      diff = block[i] - svblock[i];
  148. X      if (diff < 0) diff = -diff;
  149. X      dcterrorsum += diff;
  150. X      if (dcterrormax < diff) dcterrormax = diff;
  151. X    }
  152. X    dctcoefcount += DCTSIZE2;
  153. X  }
  154. X#endif
  155. X}
  156. X
  157. X
  158. X/*
  159. X * Extract samples in MCU order, process & hand off to output_method.
  160. X * The input is always exactly N MCU rows worth of data.
  161. X */
  162. X
  163. XMETHODDEF void
  164. Xextract_MCUs (compress_info_ptr cinfo,
  165. X          JSAMPIMAGE image_data,
  166. X          int num_mcu_rows,
  167. X          MCU_output_method_ptr output_method)
  168. X{
  169. X  JBLOCK MCU_data[MAX_BLOCKS_IN_MCU];
  170. X  int mcurow;
  171. X  long mcuindex;
  172. X  short blkn, ci, xpos, ypos;
  173. X  jpeg_component_info * compptr;
  174. X  QUANT_TBL_PTR quant_ptr;
  175. X
  176. X  for (mcurow = 0; mcurow < num_mcu_rows; mcurow++) {
  177. X    for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) {
  178. X      /* Extract data from the image array, DCT it, and quantize it */
  179. X      blkn = 0;
  180. X      for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  181. X    compptr = cinfo->cur_comp_info[ci];
  182. X    quant_ptr = cinfo->quant_tbl_ptrs[compptr->quant_tbl_no];
  183. X    for (ypos = 0; ypos < compptr->MCU_height; ypos++) {
  184. X      for (xpos = 0; xpos < compptr->MCU_width; xpos++) {
  185. X        extract_block(image_data[ci],
  186. X              (mcurow * compptr->MCU_height + ypos)*DCTSIZE,
  187. X              (mcuindex * compptr->MCU_width + xpos)*DCTSIZE,
  188. X              MCU_data[blkn], quant_ptr);
  189. X        blkn++;
  190. X      }
  191. X    }
  192. X      }
  193. X      /* Send the MCU whereever the pipeline controller wants it to go */
  194. X      (*output_method) (cinfo, MCU_data);
  195. X    }
  196. X  }
  197. X}
  198. X
  199. X
  200. X/*
  201. X * Initialize for processing a scan.
  202. X */
  203. X
  204. XMETHODDEF void
  205. Xextract_init (compress_info_ptr cinfo)
  206. X{
  207. X  /* no work for now */
  208. X#ifdef DCT_ERR_STATS
  209. X  dcterrorsum = dcterrormax = dctcoefcount = 0;
  210. X#endif
  211. X}
  212. X
  213. X
  214. X/*
  215. X * Clean up after a scan.
  216. X */
  217. X
  218. XMETHODDEF void
  219. Xextract_term (compress_info_ptr cinfo)
  220. X{
  221. X  /* no work for now */
  222. X#ifdef DCT_ERR_STATS
  223. X  TRACEMS3(cinfo->emethods, 0, "DCT roundoff errors = %d/%d,  max = %d",
  224. X       dcterrorsum, dctcoefcount, dcterrormax);
  225. X#endif
  226. X}
  227. X
  228. X
  229. X
  230. X/*
  231. X * The method selection routine for MCU extraction.
  232. X */
  233. X
  234. XGLOBAL void
  235. Xjselcmcu (compress_info_ptr cinfo)
  236. X{
  237. X  /* just one implementation for now */
  238. X  cinfo->methods->extract_init = extract_init;
  239. X  cinfo->methods->extract_MCUs = extract_MCUs;
  240. X  cinfo->methods->extract_term = extract_term;
  241. X}
  242. END_OF_FILE
  243.   if test 5801 -ne `wc -c <'jcmcu.c'`; then
  244.     echo shar: \"'jcmcu.c'\" unpacked with wrong size!
  245.   fi
  246.   # end of 'jcmcu.c'
  247. fi
  248. if test -f 'jdmaster.c' -a "${1}" != "-c" ; then 
  249.   echo shar: Will not clobber existing file \"'jdmaster.c'\"
  250. else
  251.   echo shar: Extracting \"'jdmaster.c'\" \(5623 characters\)
  252.   sed "s/^X//" >'jdmaster.c' <<'END_OF_FILE'
  253. X/*
  254. X * jdmaster.c
  255. X *
  256. X * Copyright (C) 1991, 1992, Thomas G. Lane.
  257. X * This file is part of the Independent JPEG Group's software.
  258. X * For conditions of distribution and use, see the accompanying README file.
  259. X *
  260. X * This file contains the main control for the JPEG decompressor.
  261. X * The system-dependent (user interface) code should call jpeg_decompress()
  262. X * after doing appropriate setup of the decompress_info_struct parameter.
  263. X */
  264. X
  265. X#include "jinclude.h"
  266. X
  267. X
  268. XMETHODDEF void
  269. Xd_per_scan_method_selection (decompress_info_ptr cinfo)
  270. X/* Central point for per-scan method selection */
  271. X{
  272. X  /* MCU disassembly */
  273. X  jseldmcu(cinfo);
  274. X  /* Upsampling of pixels */
  275. X  jselupsample(cinfo);
  276. X}
  277. X
  278. X
  279. XLOCAL void
  280. Xd_initial_method_selection (decompress_info_ptr cinfo)
  281. X/* Central point for initial method selection (after reading file header) */
  282. X{
  283. X  /* JPEG file scanning method selection is already done. */
  284. X  /* So is output file format selection (both are done by user interface). */
  285. X
  286. X  /* Entropy decoding: either Huffman or arithmetic coding. */
  287. X#ifdef D_ARITH_CODING_SUPPORTED
  288. X  jseldarithmetic(cinfo);
  289. X#else
  290. X  if (cinfo->arith_code) {
  291. X    ERREXIT(cinfo->emethods, "Arithmetic coding not supported");
  292. X  }
  293. X#endif
  294. X  jseldhuffman(cinfo);
  295. X  /* Cross-block smoothing */
  296. X#ifdef BLOCK_SMOOTHING_SUPPORTED
  297. X  jselbsmooth(cinfo);
  298. X#else
  299. X  cinfo->do_block_smoothing = FALSE;
  300. X#endif
  301. X  /* Gamma and color space conversion */
  302. X  jseldcolor(cinfo);
  303. X
  304. X  /* Color quantization selection rules */
  305. X#ifdef QUANT_1PASS_SUPPORTED
  306. X#ifdef QUANT_2PASS_SUPPORTED
  307. X  /* We have both, check for conditions in which 1-pass should be used */
  308. X  if (cinfo->num_components != 3 || cinfo->jpeg_color_space != CS_YCbCr)
  309. X    cinfo->two_pass_quantize = FALSE; /* 2-pass only handles YCbCr input */
  310. X  if (cinfo->out_color_space == CS_GRAYSCALE)
  311. X    cinfo->two_pass_quantize = FALSE; /* Should use 1-pass for grayscale out */
  312. X#else /* not QUANT_2PASS_SUPPORTED */
  313. X  cinfo->two_pass_quantize = FALSE; /* only have 1-pass */
  314. X#endif
  315. X#else /* not QUANT_1PASS_SUPPORTED */
  316. X#ifdef QUANT_2PASS_SUPPORTED
  317. X  cinfo->two_pass_quantize = TRUE; /* only have 2-pass */
  318. X#else /* not QUANT_2PASS_SUPPORTED */
  319. X  if (cinfo->quantize_colors) {
  320. X    ERREXIT(cinfo->emethods, "Color quantization was not compiled");
  321. X  }
  322. X#endif
  323. X#endif
  324. X
  325. X#ifdef QUANT_1PASS_SUPPORTED
  326. X  jsel1quantize(cinfo);
  327. X#endif
  328. X#ifdef QUANT_2PASS_SUPPORTED
  329. X  jsel2quantize(cinfo);
  330. X#endif
  331. X
  332. X  /* Pipeline control */
  333. X  jseldpipeline(cinfo);
  334. X  /* Overall control (that's me!) */
  335. X  cinfo->methods->d_per_scan_method_selection = d_per_scan_method_selection;
  336. X}
  337. X
  338. X
  339. XLOCAL void
  340. Xinitial_setup (decompress_info_ptr cinfo)
  341. X/* Do computations that are needed before initial method selection */
  342. X{
  343. X  short ci;
  344. X  jpeg_component_info *compptr;
  345. X
  346. X  /* Compute maximum sampling factors; check factor validity */
  347. X  cinfo->max_h_samp_factor = 1;
  348. X  cinfo->max_v_samp_factor = 1;
  349. X  for (ci = 0; ci < cinfo->num_components; ci++) {
  350. X    compptr = &cinfo->comp_info[ci];
  351. X    if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
  352. X    compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
  353. X      ERREXIT(cinfo->emethods, "Bogus sampling factors");
  354. X    cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
  355. X                   compptr->h_samp_factor);
  356. X    cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
  357. X                   compptr->v_samp_factor);
  358. X
  359. X  }
  360. X
  361. X  /* Compute logical downsampled dimensions of components */
  362. X  for (ci = 0; ci < cinfo->num_components; ci++) {
  363. X    compptr = &cinfo->comp_info[ci];
  364. X    compptr->true_comp_width = (cinfo->image_width * compptr->h_samp_factor
  365. X                + cinfo->max_h_samp_factor - 1)
  366. X                / cinfo->max_h_samp_factor;
  367. X    compptr->true_comp_height = (cinfo->image_height * compptr->v_samp_factor
  368. X                 + cinfo->max_v_samp_factor - 1)
  369. X                 / cinfo->max_v_samp_factor;
  370. X  }
  371. X}
  372. X
  373. X
  374. X/*
  375. X * This is the main entry point to the JPEG decompressor.
  376. X */
  377. X
  378. X
  379. XGLOBAL void
  380. Xjpeg_decompress (decompress_info_ptr cinfo)
  381. X{
  382. X  /* Init pass counts to 0 --- total_passes is adjusted in method selection */
  383. X  cinfo->total_passes = 0;
  384. X  cinfo->completed_passes = 0;
  385. X
  386. X  /* Read the JPEG file header markers; everything up through the first SOS
  387. X   * marker is read now.  NOTE: the user interface must have initialized the
  388. X   * read_file_header method pointer (eg, by calling jselrjfif or jselrtiff).
  389. X   * The other file reading methods (read_scan_header etc.) were probably
  390. X   * set at the same time, but could be set up by read_file_header itself.
  391. X   */
  392. X  (*cinfo->methods->read_file_header) (cinfo);
  393. X  if (! ((*cinfo->methods->read_scan_header) (cinfo)))
  394. X    ERREXIT(cinfo->emethods, "Empty JPEG file");
  395. X
  396. X  /* Give UI a chance to adjust decompression parameters and select */
  397. X  /* output file format based on info from file header. */
  398. X  (*cinfo->methods->d_ui_method_selection) (cinfo);
  399. X
  400. X  /* Now select methods for decompression steps. */
  401. X  initial_setup(cinfo);
  402. X  d_initial_method_selection(cinfo);
  403. X
  404. X  /* Initialize the output file & other modules as needed */
  405. X  /* (modules needing per-scan init are called by pipeline controller) */
  406. X
  407. X  (*cinfo->methods->output_init) (cinfo);
  408. X  (*cinfo->methods->colorout_init) (cinfo);
  409. X  if (cinfo->quantize_colors)
  410. X    (*cinfo->methods->color_quant_init) (cinfo);
  411. X
  412. X  /* And let the pipeline controller do the rest. */
  413. X  (*cinfo->methods->d_pipeline_controller) (cinfo);
  414. X
  415. X  /* Finish output file, release working storage, etc */
  416. X  if (cinfo->quantize_colors)
  417. X    (*cinfo->methods->color_quant_term) (cinfo);
  418. X  (*cinfo->methods->colorout_term) (cinfo);
  419. X  (*cinfo->methods->output_term) (cinfo);
  420. X  (*cinfo->methods->read_file_trailer) (cinfo);
  421. X
  422. X  (*cinfo->emethods->free_all) ();
  423. X
  424. X  /* My, that was easy, wasn't it? */
  425. X}
  426. END_OF_FILE
  427.   if test 5623 -ne `wc -c <'jdmaster.c'`; then
  428.     echo shar: \"'jdmaster.c'\" unpacked with wrong size!
  429.   fi
  430.   # end of 'jdmaster.c'
  431. fi
  432. if test -f 'jdmcu.c' -a "${1}" != "-c" ; then 
  433.   echo shar: Will not clobber existing file \"'jdmcu.c'\"
  434. else
  435.   echo shar: Extracting \"'jdmcu.c'\" \(6265 characters\)
  436.   sed "s/^X//" >'jdmcu.c' <<'END_OF_FILE'
  437. X/*
  438. X * jdmcu.c
  439. X *
  440. X * Copyright (C) 1991, 1992, Thomas G. Lane.
  441. X * This file is part of the Independent JPEG Group's software.
  442. X * For conditions of distribution and use, see the accompanying README file.
  443. X *
  444. X * This file contains MCU disassembly and IDCT control routines.
  445. X * These routines are invoked via the disassemble_MCU, reverse_DCT, and
  446. X * disassemble_init/term methods.
  447. X */
  448. X
  449. X#include "jinclude.h"
  450. X
  451. X
  452. X/*
  453. X * Fetch one MCU row from entropy_decode, build coefficient array.
  454. X * This version is used for noninterleaved (single-component) scans.
  455. X */
  456. X
  457. XMETHODDEF void
  458. Xdisassemble_noninterleaved_MCU (decompress_info_ptr cinfo,
  459. X                JBLOCKIMAGE image_data)
  460. X{
  461. X  JBLOCKROW MCU_data[1];
  462. X  long mcuindex;
  463. X
  464. X  /* this is pretty easy since there is one component and one block per MCU */
  465. X
  466. X  /* Pre-zero the target area to speed up entropy decoder */
  467. X  /* (we assume wholesale zeroing is faster than retail) */
  468. X  jzero_far((void FAR *) image_data[0][0],
  469. X        (size_t) (cinfo->MCUs_per_row * SIZEOF(JBLOCK)));
  470. X
  471. X  for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) {
  472. X    /* Point to the proper spot in the image array for this MCU */
  473. X    MCU_data[0] = image_data[0][0] + mcuindex;
  474. X    /* Fetch the coefficient data */
  475. X    (*cinfo->methods->entropy_decode) (cinfo, MCU_data);
  476. X  }
  477. X}
  478. X
  479. X
  480. X/*
  481. X * Fetch one MCU row from entropy_decode, build coefficient array.
  482. X * This version is used for interleaved (multi-component) scans.
  483. X */
  484. X
  485. XMETHODDEF void
  486. Xdisassemble_interleaved_MCU (decompress_info_ptr cinfo,
  487. X                 JBLOCKIMAGE image_data)
  488. X{
  489. X  JBLOCKROW MCU_data[MAX_BLOCKS_IN_MCU];
  490. X  long mcuindex;
  491. X  short blkn, ci, xpos, ypos;
  492. X  jpeg_component_info * compptr;
  493. X  JBLOCKROW image_ptr;
  494. X
  495. X  /* Pre-zero the target area to speed up entropy decoder */
  496. X  /* (we assume wholesale zeroing is faster than retail) */
  497. X  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  498. X    compptr = cinfo->cur_comp_info[ci];
  499. X    for (ypos = 0; ypos < compptr->MCU_height; ypos++) {
  500. X      jzero_far((void FAR *) image_data[ci][ypos],
  501. X        (size_t) (cinfo->MCUs_per_row * compptr->MCU_width * SIZEOF(JBLOCK)));
  502. X    }
  503. X  }
  504. X
  505. X  for (mcuindex = 0; mcuindex < cinfo->MCUs_per_row; mcuindex++) {
  506. X    /* Point to the proper spots in the image array for this MCU */
  507. X    blkn = 0;
  508. X    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  509. X      compptr = cinfo->cur_comp_info[ci];
  510. X      for (ypos = 0; ypos < compptr->MCU_height; ypos++) {
  511. X    image_ptr = image_data[ci][ypos] + (mcuindex * compptr->MCU_width);
  512. X    for (xpos = 0; xpos < compptr->MCU_width; xpos++) {
  513. X      MCU_data[blkn] = image_ptr;
  514. X      image_ptr++;
  515. X      blkn++;
  516. X    }
  517. X      }
  518. X    }
  519. X    /* Fetch the coefficient data */
  520. X    (*cinfo->methods->entropy_decode) (cinfo, MCU_data);
  521. X  }
  522. X}
  523. X
  524. X
  525. X/*
  526. X * Perform inverse DCT on each block in an MCU row's worth of data;
  527. X * output the results into a sample array starting at row start_row.
  528. X * NB: start_row can only be nonzero when dealing with a single-component
  529. X * scan; otherwise we'd have to pass different offsets for different
  530. X * components, since the heights of interleaved MCU rows can vary.
  531. X * But the pipeline controller logic is such that this is not necessary.
  532. X */
  533. X
  534. XMETHODDEF void
  535. Xreverse_DCT (decompress_info_ptr cinfo,
  536. X         JBLOCKIMAGE coeff_data, JSAMPIMAGE output_data, int start_row)
  537. X{
  538. X  DCTBLOCK block;
  539. X  JBLOCKROW browptr;
  540. X  JSAMPARRAY srowptr;
  541. X  long blocksperrow, bi;
  542. X  short numrows, ri;
  543. X  short ci;
  544. X
  545. X  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
  546. X    /* calculate size of an MCU row in this component */
  547. X    blocksperrow = cinfo->cur_comp_info[ci]->downsampled_width / DCTSIZE;
  548. X    numrows = cinfo->cur_comp_info[ci]->MCU_height;
  549. X    /* iterate through all blocks in MCU row */
  550. X    for (ri = 0; ri < numrows; ri++) {
  551. X      browptr = coeff_data[ci][ri];
  552. X      srowptr = output_data[ci] + (ri * DCTSIZE + start_row);
  553. X      for (bi = 0; bi < blocksperrow; bi++) {
  554. X    /* copy the data into a local DCTBLOCK.  This allows for change of
  555. X     * representation (if DCTELEM != JCOEF).  On 80x86 machines it also
  556. X     * brings the data back from FAR storage to NEAR storage.
  557. X     */
  558. X    { register JCOEFPTR elemptr = browptr[bi];
  559. X      register DCTELEM *localblkptr = block;
  560. X      register int elem = DCTSIZE2;
  561. X
  562. X      while (--elem >= 0)
  563. X        *localblkptr++ = (DCTELEM) *elemptr++;
  564. X    }
  565. X
  566. X    j_rev_dct(block);    /* perform inverse DCT */
  567. X
  568. X    /* Output the data into the sample array.
  569. X     * Note change from signed to unsigned representation:
  570. X     * DCT calculation works with values +-CENTERJSAMPLE,
  571. X     * but sample arrays always hold 0..MAXJSAMPLE.
  572. X     * We have to do range-limiting because of quantization errors in the
  573. X     * DCT/IDCT phase.  We use the sample_range_limit[] table to do this
  574. X     * quickly; the CENTERJSAMPLE offset is folded into table indexing.
  575. X     */
  576. X    { register JSAMPROW elemptr;
  577. X      register DCTELEM *localblkptr = block;
  578. X      register JSAMPLE *range_limit = cinfo->sample_range_limit +
  579. X                        CENTERJSAMPLE;
  580. X#if DCTSIZE != 8
  581. X      register int elemc;
  582. X#endif
  583. X      register int elemr;
  584. X
  585. X      for (elemr = 0; elemr < DCTSIZE; elemr++) {
  586. X        elemptr = srowptr[elemr] + (bi * DCTSIZE);
  587. X#if DCTSIZE == 8        /* unroll the inner loop */
  588. X        *elemptr++ = range_limit[*localblkptr++];
  589. X        *elemptr++ = range_limit[*localblkptr++];
  590. X        *elemptr++ = range_limit[*localblkptr++];
  591. X        *elemptr++ = range_limit[*localblkptr++];
  592. X        *elemptr++ = range_limit[*localblkptr++];
  593. X        *elemptr++ = range_limit[*localblkptr++];
  594. X        *elemptr++ = range_limit[*localblkptr++];
  595. X        *elemptr++ = range_limit[*localblkptr++];
  596. X#else
  597. X        for (elemc = DCTSIZE; elemc > 0; elemc--) {
  598. X          *elemptr++ = range_limit[*localblkptr++];
  599. X        }
  600. X#endif
  601. X      }
  602. X    }
  603. X      }
  604. X    }
  605. X  }
  606. X}
  607. X
  608. X
  609. X/*
  610. X * Initialize for processing a scan.
  611. X */
  612. X
  613. XMETHODDEF void
  614. Xdisassemble_init (decompress_info_ptr cinfo)
  615. X{
  616. X  /* no work for now */
  617. X}
  618. X
  619. X
  620. X/*
  621. X * Clean up after a scan.
  622. X */
  623. X
  624. XMETHODDEF void
  625. Xdisassemble_term (decompress_info_ptr cinfo)
  626. X{
  627. X  /* no work for now */
  628. X}
  629. X
  630. X
  631. X
  632. X/*
  633. X * The method selection routine for MCU disassembly.
  634. X */
  635. X
  636. XGLOBAL void
  637. Xjseldmcu (decompress_info_ptr cinfo)
  638. X{
  639. X  if (cinfo->comps_in_scan == 1)
  640. X    cinfo->methods->disassemble_MCU = disassemble_noninterleaved_MCU;
  641. X  else
  642. X    cinfo->methods->disassemble_MCU = disassemble_interleaved_MCU;
  643. X  cinfo->methods->reverse_DCT = reverse_DCT;
  644. X  cinfo->methods->disassemble_init = disassemble_init;
  645. X  cinfo->methods->disassemble_term = disassemble_term;
  646. X}
  647. END_OF_FILE
  648.   if test 6265 -ne `wc -c <'jdmcu.c'`; then
  649.     echo shar: \"'jdmcu.c'\" unpacked with wrong size!
  650.   fi
  651.   # end of 'jdmcu.c'
  652. fi
  653. if test -f 'jmemdos.h' -a "${1}" != "-c" ; then 
  654.   echo shar: Will not clobber existing file \"'jmemdos.h'\"
  655. else
  656.   echo shar: Extracting \"'jmemdos.h'\" \(5694 characters\)
  657.   sed "s/^X//" >'jmemdos.h' <<'END_OF_FILE'
  658. X/*
  659. X * jmemdos.h  (jmemsys.h)
  660. X *
  661. X * Copyright (C) 1992, Thomas G. Lane.
  662. X * This file is part of the Independent JPEG Group's software.
  663. X * For conditions of distribution and use, see the accompanying README file.
  664. X *
  665. X * This include file defines the interface between the system-independent
  666. X * and system-dependent portions of the JPEG memory manager.  (The system-
  667. X * independent portion is jmemmgr.c; there are several different versions
  668. X * of the system-dependent portion, and of this file for that matter.)
  669. X *
  670. X * This version is suitable for MS-DOS (80x86) implementations.
  671. X */
  672. X
  673. X
  674. X/*
  675. X * These two functions are used to allocate and release small chunks of
  676. X * memory (typically the total amount requested through jget_small is
  677. X * no more than 20Kb or so).  Behavior should be the same as for the
  678. X * standard library functions malloc and free; in particular, jget_small
  679. X * returns NULL on failure.  On most systems, these ARE malloc and free.
  680. X * On an 80x86 machine using small-data memory model, these manage near heap.
  681. X */
  682. X
  683. XEXTERN void * jget_small PP((size_t sizeofobject));
  684. XEXTERN void jfree_small PP((void * object));
  685. X
  686. X/*
  687. X * These two functions are used to allocate and release large chunks of
  688. X * memory (up to the total free space designated by jmem_available).
  689. X * The interface is the same as above, except that on an 80x86 machine,
  690. X * far pointers are used.  On other systems these ARE the same as above.
  691. X */
  692. X
  693. X#ifdef NEED_FAR_POINTERS    /* typically not needed except on 80x86 */
  694. XEXTERN void FAR * jget_large PP((size_t sizeofobject));
  695. XEXTERN void jfree_large PP((void FAR * object));
  696. X#else
  697. X#define jget_large(sizeofobject)    jget_small(sizeofobject)
  698. X#define jfree_large(object)        jfree_small(object)
  699. X#endif
  700. X
  701. X/*
  702. X * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
  703. X * be requested in a single call on jget_large (and jget_small for that
  704. X * matter, but that case should never come into play).  This macro is needed
  705. X * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
  706. X * On machines with flat address spaces, any large constant may be used here.
  707. X */
  708. X
  709. X#define MAX_ALLOC_CHUNK        65440L    /* leave room for malloc overhead */
  710. X
  711. X/*
  712. X * This routine computes the total space available for allocation by
  713. X * jget_large.  If more space than this is needed, backing store will be used.
  714. X * NOTE: any memory already allocated must not be counted.
  715. X *
  716. X * There is a minimum space requirement, corresponding to the minimum
  717. X * feasible buffer sizes; jmemmgr.c will request that much space even if
  718. X * jmem_available returns zero.  The maximum space needed, enough to hold
  719. X * all working storage in memory, is also passed in case it is useful.
  720. X *
  721. X * It is OK for jmem_available to underestimate the space available (that'll
  722. X * just lead to more backing-store access than is really necessary).
  723. X * However, an overestimate will lead to failure.  Hence it's wise to subtract
  724. X * a slop factor from the true available space, especially if jget_small space
  725. X * comes from the same pool.  5% should be enough.
  726. X *
  727. X * On machines with lots of virtual memory, any large constant may be returned.
  728. X * Conversely, zero may be returned to always use the minimum amount of memory.
  729. X */
  730. X
  731. XEXTERN long jmem_available PP((long min_bytes_needed, long max_bytes_needed));
  732. X
  733. X
  734. X/*
  735. X * This structure holds whatever state is needed to access a single
  736. X * backing-store object.  The read/write/close method pointers are called
  737. X * by jmemmgr.c to manipulate the backing-store object; all other fields
  738. X * are private to the system-dependent backing store routines.
  739. X */
  740. X
  741. X#define TEMP_NAME_LENGTH   64    /* max length of a temporary file's name */
  742. X
  743. Xtypedef unsigned short XMSH;    /* type of extended-memory handles */
  744. Xtypedef unsigned short EMSH;    /* type of expanded-memory handles */
  745. X
  746. Xtypedef union {
  747. X    short file_handle;    /* DOS file handle if it's a temp file */
  748. X    XMSH xms_handle;    /* handle if it's a chunk of XMS */
  749. X    EMSH ems_handle;    /* handle if it's a chunk of EMS */
  750. X      } handle_union;
  751. X
  752. Xtypedef struct backing_store_struct * backing_store_ptr;
  753. X
  754. Xtypedef struct backing_store_struct {
  755. X    /* Methods for reading/writing/closing this backing-store object */
  756. X    METHOD(void, read_backing_store, (backing_store_ptr info,
  757. X                      void FAR * buffer_address,
  758. X                      long file_offset, long byte_count));
  759. X    METHOD(void, write_backing_store, (backing_store_ptr info,
  760. X                       void FAR * buffer_address,
  761. X                       long file_offset, long byte_count));
  762. X    METHOD(void, close_backing_store, (backing_store_ptr info));
  763. X    /* Private fields for system-dependent backing-store management */
  764. X    /* For the MS-DOS environment, we need: */
  765. X    handle_union handle;    /* reference to backing-store storage object */
  766. X    char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */
  767. X      } backing_store_info;
  768. X
  769. X/*
  770. X * Initial opening of a backing-store object.  This must fill in the
  771. X * read/write/close pointers in the object.  The read/write routines
  772. X * may take an error exit if the specified maximum file size is exceeded.
  773. X * (If jmem_available always returns a large value, this routine can just
  774. X * take an error exit.)
  775. X */
  776. X
  777. XEXTERN void jopen_backing_store PP((backing_store_ptr info,
  778. X                    long total_bytes_needed));
  779. X
  780. X
  781. X/*
  782. X * These routines take care of any system-dependent initialization and
  783. X * cleanup required.  The system methods struct address should be saved
  784. X * by jmem_init in case an error exit must be taken.  jmem_term may assume
  785. X * that all requested memory has been freed and that all opened backing-
  786. X * store objects have been closed.
  787. X * NB: jmem_term may be called more than once, and must behave reasonably
  788. X * if that happens.
  789. X */
  790. X
  791. XEXTERN void jmem_init PP((external_methods_ptr emethods));
  792. XEXTERN void jmem_term PP((void));
  793. END_OF_FILE
  794.   if test 5694 -ne `wc -c <'jmemdos.h'`; then
  795.     echo shar: \"'jmemdos.h'\" unpacked with wrong size!
  796.   fi
  797.   # end of 'jmemdos.h'
  798. fi
  799. if test -f 'jmemsys.h' -a "${1}" != "-c" ; then 
  800.   echo shar: Will not clobber existing file \"'jmemsys.h'\"
  801. else
  802.   echo shar: Extracting \"'jmemsys.h'\" \(5401 characters\)
  803.   sed "s/^X//" >'jmemsys.h' <<'END_OF_FILE'
  804. X/*
  805. X * jmemsys.h
  806. X *
  807. X * Copyright (C) 1992, Thomas G. Lane.
  808. X * This file is part of the Independent JPEG Group's software.
  809. X * For conditions of distribution and use, see the accompanying README file.
  810. X *
  811. X * This include file defines the interface between the system-independent
  812. X * and system-dependent portions of the JPEG memory manager.  (The system-
  813. X * independent portion is jmemmgr.c; there are several different versions
  814. X * of the system-dependent portion, and of this file for that matter.)
  815. X *
  816. X * This is a "generic" skeleton that may need to be modified for particular
  817. X * systems.  It should be usable as-is on the majority of non-MSDOS machines.
  818. X */
  819. X
  820. X
  821. X/*
  822. X * These two functions are used to allocate and release small chunks of
  823. X * memory (typically the total amount requested through jget_small is
  824. X * no more than 20Kb or so).  Behavior should be the same as for the
  825. X * standard library functions malloc and free; in particular, jget_small
  826. X * returns NULL on failure.  On most systems, these ARE malloc and free.
  827. X * On an 80x86 machine using small-data memory model, these manage near heap.
  828. X */
  829. X
  830. XEXTERN void * jget_small PP((size_t sizeofobject));
  831. XEXTERN void jfree_small PP((void * object));
  832. X
  833. X/*
  834. X * These two functions are used to allocate and release large chunks of
  835. X * memory (up to the total free space designated by jmem_available).
  836. X * The interface is the same as above, except that on an 80x86 machine,
  837. X * far pointers are used.  On other systems these ARE the same as above.
  838. X */
  839. X
  840. X#ifdef NEED_FAR_POINTERS    /* typically not needed except on 80x86 */
  841. XEXTERN void FAR * jget_large PP((size_t sizeofobject));
  842. XEXTERN void jfree_large PP((void FAR * object));
  843. X#else
  844. X#define jget_large(sizeofobject)    jget_small(sizeofobject)
  845. X#define jfree_large(object)        jfree_small(object)
  846. X#endif
  847. X
  848. X/*
  849. X * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may
  850. X * be requested in a single call on jget_large (and jget_small for that
  851. X * matter, but that case should never come into play).  This macro is needed
  852. X * to model the 64Kb-segment-size limit of far addressing on 80x86 machines.
  853. X * On machines with flat address spaces, any large constant may be used here.
  854. X */
  855. X
  856. X#define MAX_ALLOC_CHUNK        1000000000L
  857. X
  858. X/*
  859. X * This routine computes the total space available for allocation by
  860. X * jget_large.  If more space than this is needed, backing store will be used.
  861. X * NOTE: any memory already allocated must not be counted.
  862. X *
  863. X * There is a minimum space requirement, corresponding to the minimum
  864. X * feasible buffer sizes; jmemmgr.c will request that much space even if
  865. X * jmem_available returns zero.  The maximum space needed, enough to hold
  866. X * all working storage in memory, is also passed in case it is useful.
  867. X *
  868. X * It is OK for jmem_available to underestimate the space available (that'll
  869. X * just lead to more backing-store access than is really necessary).
  870. X * However, an overestimate will lead to failure.  Hence it's wise to subtract
  871. X * a slop factor from the true available space, especially if jget_small space
  872. X * comes from the same pool.  5% should be enough.
  873. X *
  874. X * On machines with lots of virtual memory, any large constant may be returned.
  875. X * Conversely, zero may be returned to always use the minimum amount of memory.
  876. X */
  877. X
  878. XEXTERN long jmem_available PP((long min_bytes_needed, long max_bytes_needed));
  879. X
  880. X
  881. X/*
  882. X * This structure holds whatever state is needed to access a single
  883. X * backing-store object.  The read/write/close method pointers are called
  884. X * by jmemmgr.c to manipulate the backing-store object; all other fields
  885. X * are private to the system-dependent backing store routines.
  886. X */
  887. X
  888. X#define TEMP_NAME_LENGTH   64    /* max length of a temporary file's name */
  889. X
  890. Xtypedef struct backing_store_struct * backing_store_ptr;
  891. X
  892. Xtypedef struct backing_store_struct {
  893. X    /* Methods for reading/writing/closing this backing-store object */
  894. X    METHOD(void, read_backing_store, (backing_store_ptr info,
  895. X                      void FAR * buffer_address,
  896. X                      long file_offset, long byte_count));
  897. X    METHOD(void, write_backing_store, (backing_store_ptr info,
  898. X                       void FAR * buffer_address,
  899. X                       long file_offset, long byte_count));
  900. X    METHOD(void, close_backing_store, (backing_store_ptr info));
  901. X    /* Private fields for system-dependent backing-store management */
  902. X    /* For a typical implementation with temp files, we might need: */
  903. X    FILE * temp_file;    /* stdio reference to temp file */
  904. X    char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */
  905. X      } backing_store_info;
  906. X
  907. X/*
  908. X * Initial opening of a backing-store object.  This must fill in the
  909. X * read/write/close pointers in the object.  The read/write routines
  910. X * may take an error exit if the specified maximum file size is exceeded.
  911. X * (If jmem_available always returns a large value, this routine can just
  912. X * take an error exit.)
  913. X */
  914. X
  915. XEXTERN void jopen_backing_store PP((backing_store_ptr info,
  916. X                    long total_bytes_needed));
  917. X
  918. X
  919. X/*
  920. X * These routines take care of any system-dependent initialization and
  921. X * cleanup required.  The system methods struct address should be saved
  922. X * by jmem_init in case an error exit must be taken.  jmem_term may assume
  923. X * that all requested memory has been freed and that all opened backing-
  924. X * store objects have been closed.
  925. X * NB: jmem_term may be called more than once, and must behave reasonably
  926. X * if that happens.
  927. X */
  928. X
  929. XEXTERN void jmem_init PP((external_methods_ptr emethods));
  930. XEXTERN void jmem_term PP((void));
  931. END_OF_FILE
  932.   if test 5401 -ne `wc -c <'jmemsys.h'`; then
  933.     echo shar: \"'jmemsys.h'\" unpacked with wrong size!
  934.   fi
  935.   # end of 'jmemsys.h'
  936. fi
  937. if test -f 'makefile.mc5' -a "${1}" != "-c" ; then 
  938.   echo shar: Will not clobber existing file \"'makefile.mc5'\"
  939. else
  940.   echo shar: Extracting \"'makefile.mc5'\" \(5929 characters\)
  941.   sed "s/^X//" >'makefile.mc5' <<'END_OF_FILE'
  942. X# Makefile for Independent JPEG Group's software
  943. X
  944. X# This makefile is for Microsoft C for MS-DOS, version 5.x.
  945. X
  946. X# Read SETUP instructions before saying "make" !!
  947. X
  948. X# Microsoft's brain-damaged version of make uses nonstandard syntax (a blank
  949. X# line is needed to terminate a command list) and it simply scans the rules
  950. X# in order, rather than doing a true dependency-tree walk.  Furthermore,
  951. X# expanded command lines can't exceed 128 chars (this is a DOS bug, not
  952. X# make's fault); so we can't just name all the objectfiles in the link steps.
  953. X# Instead we shove each objectfile into a library as it is made, and link
  954. X# from the library.  The objectfiles are also kept separately as timestamps.
  955. X
  956. X# You may need to adjust these cc options:
  957. XCFLAGS=  /AS /I. /W3 /Oail /Gs   # NB: /Gs turns off stack oflo checks
  958. XLDFLAGS= /Fm /F 2000             # /F hhhh  sets stack size (in hex)
  959. X# In particular:
  960. X#   Add /DMSDOS if your compiler doesn't automatically #define MSDOS.
  961. X#   Add /DMEM_STATS to enable gathering of memory usage statistics.
  962. X# You might also want to add /G2 if you have an 80286, etc.
  963. X
  964. X
  965. X# source files (independently compilable files)
  966. XSOURCES= jbsmooth.c jcarith.c jccolor.c jcdeflts.c jcexpand.c jchuff.c \
  967. X        jcmain.c jcmaster.c jcmcu.c jcpipe.c jcsample.c jdarith.c jdcolor.c \
  968. X        jddeflts.c jdhuff.c jdmain.c jdmaster.c jdmcu.c jdpipe.c jdsample.c \
  969. X        jerror.c jquant1.c jquant2.c jfwddct.c jrevdct.c jutils.c jmemmgr.c \
  970. X        jrdjfif.c jrdgif.c jrdppm.c jrdrle.c jrdtarga.c jwrjfif.c jwrgif.c \
  971. X        jwrppm.c jwrrle.c jwrtarga.c
  972. X# virtual source files (not present in distribution file, see SETUP)
  973. XVIRTSOURCES= jmemsys.c
  974. X# system-dependent implementations of virtual source files
  975. XSYSDEPFILES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemdos.h \
  976. X        jmemdosa.asm
  977. X# files included by source files
  978. XINCLUDES= jinclude.h jconfig.h jpegdata.h jversion.h jmemsys.h
  979. X# documentation, test, and support files
  980. XDOCS= README SETUP USAGE CHANGELOG cjpeg.1 djpeg.1 architecture codingrules
  981. XMAKEFILES= makefile.ansi makefile.unix makefile.manx makefile.sas \
  982. X        makcjpeg.st makdjpeg.st makljpeg.st makefile.mc5 makefile.mc6 \
  983. X        makefile.bcc makefile.mms makefile.vms makvms.opt
  984. XOTHERFILES= ansi2knr.c ckconfig.c example.c
  985. XTESTFILES= testorig.jpg testimg.ppm testimg.gif testimg.jpg
  986. XDISTFILES= $(DOCS) $(MAKEFILES) $(SOURCES) $(SYSDEPFILES) $(INCLUDES) \
  987. X        $(OTHERFILES) $(TESTFILES)
  988. X# objectfiles common to cjpeg and djpeg
  989. XCOMOBJECTS= jutils.obj jerror.obj jmemmgr.obj jmemsys.obj jmemdosa.obj
  990. X# compression objectfiles
  991. XCLIBOBJECTS= jcmaster.obj jcdeflts.obj jcarith.obj jccolor.obj jcexpand.obj \
  992. X        jchuff.obj jcmcu.obj jcpipe.obj jcsample.obj jfwddct.obj \
  993. X        jwrjfif.obj jrdgif.obj jrdppm.obj jrdrle.obj jrdtarga.obj
  994. XCOBJECTS= jcmain.obj $(CLIBOBJECTS) $(COMOBJECTS)
  995. X# decompression objectfiles
  996. XDLIBOBJECTS= jdmaster.obj jddeflts.obj jbsmooth.obj jdarith.obj jdcolor.obj \
  997. X        jdhuff.obj jdmcu.obj jdpipe.obj jdsample.obj jquant1.obj \
  998. X        jquant2.obj jrevdct.obj jrdjfif.obj jwrgif.obj jwrppm.obj \
  999. X        jwrrle.obj jwrtarga.obj
  1000. XDOBJECTS= jdmain.obj $(DLIBOBJECTS) $(COMOBJECTS)
  1001. X# These objectfiles are included in libjpeg.lib
  1002. XLIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS)
  1003. X
  1004. X
  1005. X# inference rule used for all compilations except jcmain.c, jdmain.c
  1006. X# notice that objectfile is also inserted into libjpeg.lib
  1007. X.c.obj:
  1008. X    cl $(CFLAGS) /c $*.c
  1009. X    lib libjpeg -+$*.obj;
  1010. X
  1011. X# inference rule for assembly code
  1012. X.asm.obj:
  1013. X    masm /mx $*;
  1014. X    lib libjpeg -+$*.obj;
  1015. X
  1016. X
  1017. Xjbsmooth.obj : jbsmooth.c jinclude.h jconfig.h jpegdata.h
  1018. X
  1019. Xjcarith.obj : jcarith.c jinclude.h jconfig.h jpegdata.h
  1020. X
  1021. Xjccolor.obj : jccolor.c jinclude.h jconfig.h jpegdata.h
  1022. X
  1023. Xjcdeflts.obj : jcdeflts.c jinclude.h jconfig.h jpegdata.h
  1024. X
  1025. Xjcexpand.obj : jcexpand.c jinclude.h jconfig.h jpegdata.h
  1026. X
  1027. Xjchuff.obj : jchuff.c jinclude.h jconfig.h jpegdata.h
  1028. X
  1029. Xjcmain.obj : jcmain.c jinclude.h jconfig.h jpegdata.h jversion.h
  1030. X    cl $(CFLAGS) /c $*.c
  1031. X
  1032. Xjcmaster.obj : jcmaster.c jinclude.h jconfig.h jpegdata.h
  1033. X
  1034. Xjcmcu.obj : jcmcu.c jinclude.h jconfig.h jpegdata.h
  1035. X
  1036. Xjcpipe.obj : jcpipe.c jinclude.h jconfig.h jpegdata.h
  1037. X
  1038. Xjcsample.obj : jcsample.c jinclude.h jconfig.h jpegdata.h
  1039. X
  1040. Xjdarith.obj : jdarith.c jinclude.h jconfig.h jpegdata.h
  1041. X
  1042. Xjdcolor.obj : jdcolor.c jinclude.h jconfig.h jpegdata.h
  1043. X
  1044. Xjddeflts.obj : jddeflts.c jinclude.h jconfig.h jpegdata.h
  1045. X
  1046. Xjdhuff.obj : jdhuff.c jinclude.h jconfig.h jpegdata.h
  1047. X
  1048. Xjdmain.obj : jdmain.c jinclude.h jconfig.h jpegdata.h jversion.h
  1049. X    cl $(CFLAGS) /c $*.c
  1050. X
  1051. Xjdmaster.obj : jdmaster.c jinclude.h jconfig.h jpegdata.h
  1052. X
  1053. Xjdmcu.obj : jdmcu.c jinclude.h jconfig.h jpegdata.h
  1054. X
  1055. Xjdpipe.obj : jdpipe.c jinclude.h jconfig.h jpegdata.h
  1056. X
  1057. Xjdsample.obj : jdsample.c jinclude.h jconfig.h jpegdata.h
  1058. X
  1059. Xjerror.obj : jerror.c jinclude.h jconfig.h jpegdata.h
  1060. X
  1061. Xjquant1.obj : jquant1.c jinclude.h jconfig.h jpegdata.h
  1062. X
  1063. Xjquant2.obj : jquant2.c jinclude.h jconfig.h jpegdata.h
  1064. X
  1065. Xjfwddct.obj : jfwddct.c jinclude.h jconfig.h jpegdata.h
  1066. X
  1067. Xjrevdct.obj : jrevdct.c jinclude.h jconfig.h jpegdata.h
  1068. X
  1069. Xjutils.obj : jutils.c jinclude.h jconfig.h jpegdata.h
  1070. X
  1071. Xjmemmgr.obj : jmemmgr.c jinclude.h jconfig.h jpegdata.h jmemsys.h
  1072. X
  1073. Xjrdjfif.obj : jrdjfif.c jinclude.h jconfig.h jpegdata.h
  1074. X
  1075. Xjrdgif.obj : jrdgif.c jinclude.h jconfig.h jpegdata.h
  1076. X
  1077. Xjrdppm.obj : jrdppm.c jinclude.h jconfig.h jpegdata.h
  1078. X
  1079. Xjrdrle.obj : jrdrle.c jinclude.h jconfig.h jpegdata.h
  1080. X
  1081. Xjrdtarga.obj : jrdtarga.c jinclude.h jconfig.h jpegdata.h
  1082. X
  1083. Xjwrjfif.obj : jwrjfif.c jinclude.h jconfig.h jpegdata.h
  1084. X
  1085. Xjwrgif.obj : jwrgif.c jinclude.h jconfig.h jpegdata.h
  1086. X
  1087. Xjwrppm.obj : jwrppm.c jinclude.h jconfig.h jpegdata.h
  1088. X
  1089. Xjwrrle.obj : jwrrle.c jinclude.h jconfig.h jpegdata.h
  1090. X
  1091. Xjwrtarga.obj : jwrtarga.c jinclude.h jconfig.h jpegdata.h
  1092. X
  1093. Xjmemsys.obj : jmemsys.c jinclude.h jconfig.h jpegdata.h jmemsys.h
  1094. X
  1095. Xjmemdosa.obj : jmemdosa.asm
  1096. X
  1097. X
  1098. Xcjpeg.exe: $(COBJECTS)
  1099. X    cl /Fecjpeg.exe jcmain.obj libjpeg.lib $(LDFLAGS)
  1100. X
  1101. Xdjpeg.exe: $(DOBJECTS)
  1102. X    cl /Fedjpeg.exe jdmain.obj libjpeg.lib $(LDFLAGS)
  1103. END_OF_FILE
  1104.   if test 5929 -ne `wc -c <'makefile.mc5'`; then
  1105.     echo shar: \"'makefile.mc5'\" unpacked with wrong size!
  1106.   fi
  1107.   # end of 'makefile.mc5'
  1108. fi
  1109. if test -f 'makefile.sas' -a "${1}" != "-c" ; then 
  1110.   echo shar: Will not clobber existing file \"'makefile.sas'\"
  1111. else
  1112.   echo shar: Extracting \"'makefile.sas'\" \(6399 characters\)
  1113.   sed "s/^X//" >'makefile.sas' <<'END_OF_FILE'
  1114. X# Makefile for Independent JPEG Group's software
  1115. X
  1116. X# This makefile is for Amiga systems using SAS C 5.10b.
  1117. X# Use jmemname.c as the system-dependent memory manager.
  1118. X# Contributed by Ed Hanway (sisd!jeh@uunet.uu.net).
  1119. X
  1120. X# Read SETUP instructions before saying "make" !!
  1121. X
  1122. X# The name of your C compiler:
  1123. XCC= lc
  1124. X
  1125. X# Uncomment the following lines for generic 680x0 version
  1126. XARCHFLAGS=
  1127. XSUFFIX=
  1128. X
  1129. X# Uncomment the following lines for 68030-only version
  1130. X#ARCHFLAGS= -m3
  1131. X#SUFFIX=.030
  1132. X
  1133. X# You may need to adjust these cc options:
  1134. XCFLAGS= -v -b -rr -O -j104 $(ARCHFLAGS) -DHAVE_STDC -DINCLUDES_ARE_ANSI \
  1135. X    -DAMIGA -DTWO_FILE_COMMANDLINE -DINCOMPLETE_TYPES_BROKEN \
  1136. X    -DNO_MKTEMP -DNEED_SIGNAL_CATCHER -DSHORTxSHORT_32
  1137. X# -j104 disables warnings for mismatched const qualifiers
  1138. X
  1139. X# Link-time cc options:
  1140. XLDFLAGS= SC SD ND BATCH
  1141. X
  1142. X# To link any special libraries, add the necessary commands here.
  1143. XLDLIBS= LIB LIB:lcr.lib
  1144. X
  1145. X# miscellaneous OS-dependent stuff
  1146. X# linker
  1147. XLN= blink
  1148. X# file deletion command
  1149. XRM= delete quiet
  1150. X# library (.lib) file creation command
  1151. XAR= oml
  1152. X
  1153. X
  1154. X# source files (independently compilable files)
  1155. XSOURCES= jbsmooth.c jcarith.c jccolor.c jcdeflts.c jcexpand.c jchuff.c \
  1156. X        jcmain.c jcmaster.c jcmcu.c jcpipe.c jcsample.c jdarith.c jdcolor.c \
  1157. X        jddeflts.c jdhuff.c jdmain.c jdmaster.c jdmcu.c jdpipe.c jdsample.c \
  1158. X        jerror.c jquant1.c jquant2.c jfwddct.c jrevdct.c jutils.c jmemmgr.c \
  1159. X        jrdjfif.c jrdgif.c jrdppm.c jrdrle.c jrdtarga.c jwrjfif.c jwrgif.c \
  1160. X        jwrppm.c jwrrle.c jwrtarga.c
  1161. X# virtual source files (not present in distribution file, see SETUP)
  1162. XVIRTSOURCES= jmemsys.c
  1163. X# system-dependent implementations of virtual source files
  1164. XSYSDEPFILES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemdos.h \
  1165. X        jmemdosa.asm
  1166. X# files included by source files
  1167. XINCLUDES= jinclude.h jconfig.h jpegdata.h jversion.h jmemsys.h
  1168. X# documentation, test, and support files
  1169. XDOCS= README SETUP USAGE CHANGELOG cjpeg.1 djpeg.1 architecture codingrules
  1170. XMAKEFILES= makefile.ansi makefile.unix makefile.manx makefile.sas \
  1171. X        makcjpeg.st makdjpeg.st makljpeg.st makefile.mc5 makefile.mc6 \
  1172. X        makefile.bcc makefile.mms makefile.vms makvms.opt
  1173. XOTHERFILES= ansi2knr.c ckconfig.c example.c
  1174. XTESTFILES= testorig.jpg testimg.ppm testimg.gif testimg.jpg
  1175. XDISTFILES= $(DOCS) $(MAKEFILES) $(SOURCES) $(SYSDEPFILES) $(INCLUDES) \
  1176. X        $(OTHERFILES) $(TESTFILES)
  1177. X# objectfiles common to cjpeg and djpeg
  1178. XCOMOBJECTS= jutils.o jerror.o jmemmgr.o jmemsys.o
  1179. X# compression objectfiles
  1180. XCLIBOBJECTS= jcmaster.o jcdeflts.o jcarith.o jccolor.o jcexpand.o jchuff.o \
  1181. X        jcmcu.o jcpipe.o jcsample.o jfwddct.o jwrjfif.o jrdgif.o jrdppm.o \
  1182. X        jrdrle.o jrdtarga.o
  1183. XCOBJECTS= jcmain.o $(CLIBOBJECTS) $(COMOBJECTS)
  1184. X# decompression objectfiles
  1185. XDLIBOBJECTS= jdmaster.o jddeflts.o jbsmooth.o jdarith.o jdcolor.o jdhuff.o \
  1186. X        jdmcu.o jdpipe.o jdsample.o jquant1.o jquant2.o jrevdct.o jrdjfif.o \
  1187. X        jwrgif.o jwrppm.o jwrrle.o jwrtarga.o
  1188. XDOBJECTS= jdmain.o $(DLIBOBJECTS) $(COMOBJECTS)
  1189. X# These objectfiles are included in libjpeg.lib
  1190. XLIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS)
  1191. X
  1192. X
  1193. Xall: cjpeg$(SUFFIX) djpeg$(SUFFIX)
  1194. X# By default, libjpeg.lib is not built unless you explicitly request it.
  1195. X# You can add libjpeg.lib to the line above if you want it built by default.
  1196. X
  1197. X
  1198. Xcjpeg$(SUFFIX): $(COBJECTS)
  1199. X    $(LN) <WITH <
  1200. X$(LDFLAGS)
  1201. XTO cjpeg$(SUFFIX)
  1202. XFROM LIB:c.o $(COBJECTS)
  1203. X$(LDLIBS)
  1204. X<
  1205. X
  1206. Xdjpeg$(SUFFIX): $(DOBJECTS)
  1207. X    $(LN) <WITH <
  1208. X$(LDFLAGS)
  1209. XTO djpeg$(SUFFIX)
  1210. XFROM LIB:c.o $(DOBJECTS)
  1211. X$(LDLIBS)
  1212. X<
  1213. X
  1214. X# libjpeg.lib is useful if you are including the JPEG software in a larger
  1215. X# program; you'd include it in your link, rather than the individual modules.
  1216. Xlibjpeg.lib: $(LIBOBJECTS)
  1217. X    -$(RM) libjpeg.lib
  1218. X    $(AR) libjpeg.lib r $(LIBOBJECTS)
  1219. X
  1220. Xjmemsys.c:
  1221. X    echo You must select a system-dependent jmemsys.c file.
  1222. X    echo Please read the SETUP directions.
  1223. X    exit 1
  1224. X
  1225. Xclean:
  1226. X    -$(RM) *.o cjpeg djpeg cjpeg.030 djpeg.030 libjpeg.lib core testout.*
  1227. X
  1228. Xdistribute:
  1229. X    -$(RM) jpegsrc.tar*
  1230. X    tar cvf jpegsrc.tar $(DISTFILES)
  1231. X    compress -v jpegsrc.tar
  1232. X
  1233. Xtest: cjpeg djpeg
  1234. X    -$(RM) testout.ppm testout.gif testout.jpg
  1235. X    djpeg testorig.jpg testout.ppm
  1236. X    djpeg -gif testorig.jpg testout.gif
  1237. X    cjpeg testimg.ppm testout.jpg
  1238. X    cmp testimg.ppm testout.ppm
  1239. X    cmp testimg.gif testout.gif
  1240. X    cmp testimg.jpg testout.jpg
  1241. X
  1242. X
  1243. Xjbsmooth.o : jbsmooth.c jinclude.h jconfig.h jpegdata.h 
  1244. Xjcarith.o : jcarith.c jinclude.h jconfig.h jpegdata.h 
  1245. Xjccolor.o : jccolor.c jinclude.h jconfig.h jpegdata.h 
  1246. Xjcdeflts.o : jcdeflts.c jinclude.h jconfig.h jpegdata.h 
  1247. Xjcexpand.o : jcexpand.c jinclude.h jconfig.h jpegdata.h 
  1248. Xjchuff.o : jchuff.c jinclude.h jconfig.h jpegdata.h 
  1249. Xjcmain.o : jcmain.c jinclude.h jconfig.h jpegdata.h jversion.h 
  1250. Xjcmaster.o : jcmaster.c jinclude.h jconfig.h jpegdata.h 
  1251. Xjcmcu.o : jcmcu.c jinclude.h jconfig.h jpegdata.h 
  1252. Xjcpipe.o : jcpipe.c jinclude.h jconfig.h jpegdata.h 
  1253. Xjcsample.o : jcsample.c jinclude.h jconfig.h jpegdata.h 
  1254. Xjdarith.o : jdarith.c jinclude.h jconfig.h jpegdata.h 
  1255. Xjdcolor.o : jdcolor.c jinclude.h jconfig.h jpegdata.h 
  1256. Xjddeflts.o : jddeflts.c jinclude.h jconfig.h jpegdata.h 
  1257. Xjdhuff.o : jdhuff.c jinclude.h jconfig.h jpegdata.h 
  1258. Xjdmain.o : jdmain.c jinclude.h jconfig.h jpegdata.h jversion.h 
  1259. Xjdmaster.o : jdmaster.c jinclude.h jconfig.h jpegdata.h 
  1260. Xjdmcu.o : jdmcu.c jinclude.h jconfig.h jpegdata.h 
  1261. Xjdpipe.o : jdpipe.c jinclude.h jconfig.h jpegdata.h 
  1262. Xjdsample.o : jdsample.c jinclude.h jconfig.h jpegdata.h 
  1263. Xjerror.o : jerror.c jinclude.h jconfig.h jpegdata.h 
  1264. Xjquant1.o : jquant1.c jinclude.h jconfig.h jpegdata.h 
  1265. Xjquant2.o : jquant2.c jinclude.h jconfig.h jpegdata.h 
  1266. Xjfwddct.o : jfwddct.c jinclude.h jconfig.h jpegdata.h 
  1267. Xjrevdct.o : jrevdct.c jinclude.h jconfig.h jpegdata.h 
  1268. Xjutils.o : jutils.c jinclude.h jconfig.h jpegdata.h 
  1269. Xjmemmgr.o : jmemmgr.c jinclude.h jconfig.h jpegdata.h jmemsys.h 
  1270. Xjrdjfif.o : jrdjfif.c jinclude.h jconfig.h jpegdata.h 
  1271. Xjrdgif.o : jrdgif.c jinclude.h jconfig.h jpegdata.h 
  1272. Xjrdppm.o : jrdppm.c jinclude.h jconfig.h jpegdata.h 
  1273. Xjrdrle.o : jrdrle.c jinclude.h jconfig.h jpegdata.h 
  1274. Xjrdtarga.o : jrdtarga.c jinclude.h jconfig.h jpegdata.h 
  1275. Xjwrjfif.o : jwrjfif.c jinclude.h jconfig.h jpegdata.h 
  1276. Xjwrgif.o : jwrgif.c jinclude.h jconfig.h jpegdata.h 
  1277. Xjwrppm.o : jwrppm.c jinclude.h jconfig.h jpegdata.h 
  1278. Xjwrrle.o : jwrrle.c jinclude.h jconfig.h jpegdata.h 
  1279. Xjwrtarga.o : jwrtarga.c jinclude.h jconfig.h jpegdata.h 
  1280. Xjmemsys.o : jmemsys.c jinclude.h jconfig.h jpegdata.h jmemsys.h 
  1281. END_OF_FILE
  1282.   if test 6399 -ne `wc -c <'makefile.sas'`; then
  1283.     echo shar: \"'makefile.sas'\" unpacked with wrong size!
  1284.   fi
  1285.   # end of 'makefile.sas'
  1286. fi
  1287. if test -f 'testimg.jpg.U' -a "${1}" != "-c" ; then 
  1288.   echo shar: Will not clobber existing file \"'testimg.jpg.U'\"
  1289. else
  1290.   echo shar: Extracting \"'testimg.jpg.U'\" \(6056 characters\)
  1291.   sed "s/^X//" >'testimg.jpg.U' <<'END_OF_FILE'
  1292. Xbegin 666 testimg.jpg
  1293. XM_]C_X  02D9)1@ ! 0   0 !  #_VP!#  @&!@<&!0@'!P<)"0@*#!0-# L+
  1294. XM#!D2$P\4'1H?'AT:'!P@)"XG("(L(QP<*#<I+# Q-#0T'R<Y/3@R/"XS-#+_
  1295. XMVP!# 0D)"0P+#!@-#1@R(1PA,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R
  1296. XM,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C+_P  1" !] 'T# 2(  A$! Q$!_\0 
  1297. XM'P   04! 0$! 0$           $" P0%!@<("0H+_\0 M1   @$# P($ P4%
  1298. XM! 0   %] 0(#  01!1(A,4$&$U%A!R)Q%#*!D:$((T*QP152T? D,V)R@@D*
  1299. XM%A<8&1HE)B<H*2HT-38W.#DZ0T1%1D=(24I35%565UA96F-D969G:&EJ<W1U
  1300. XM=G=X>7J#A(6&AXB)BI*3E)66EYB9FJ*CI*6FIZBIJK*SM+6VM[BYNL+#Q,7&
  1301. XMQ\C)RM+3U-76U]C9VN'BX^3EYN?HZ>KQ\O/T]?;W^/GZ_\0 'P$  P$! 0$!
  1302. XM 0$! 0        $" P0%!@<("0H+_\0 M1$  @$"! 0#! <%! 0  0)W  $"
  1303. XM Q$$!2$Q!A)!40=A<1,B,H$(%$*1H;'!"2,S4O 58G+1"A8D-.$E\1<8&1HF
  1304. XM)R@I*C4V-S@Y.D-$149'2$E*4U155E=865IC9&5F9VAI:G-T=79W>'EZ@H.$
  1305. XMA8:'B(F*DI.4E9:7F)F:HJ.DI::GJ*FJLK.TM;:WN+FZPL/$Q<;'R,G*TM/4
  1306. XMU=;7V-G:XN/DY>;GZ.GJ\O/T]?;W^/GZ_]H # ,!  (1 Q$ /P"1I?N)&H#8
  1307. XM^51T J5 D"DL<N<9;U-01*+>(LQ)D8\GO0#N^=^N>!7%8^K+<;DG<^>?NJ.K
  1308. XM5,;J. KYC$S$'"*,D#Z>E4FE\@#(S(QPJ^A_R*HW=]'!^ZEF D?EROWC[ =J
  1309. XMTIT^9F<]#8_MJW567>4?'1QC)]JF-^T4JI/%Y2LI*S%LC/I7GUYJ,#7"(D<K
  1310. XMRAP?F?@^@ 'X5KWVL74L4$$D\<4[\8QDC_/^>U=7U5-'-*=F=FD\6T,KB09/
  1311. XMS Y_#CI22ZC!!!YCRCRQSN'/;/:O-I[J:*6-1<-N?DRAL$\$XX[?3\S531-.
  1312. XMU#7KHS&>2*TC($EP3@CV'JW/2D\+&.K>A'M+]#UB*Z-R4\AA+O&593D8]<^E
  1313. XM:%M9EN2?,QW/W0?;UJEH>E0Z?IMO;;72W1?EC8_.W/5O\.U;A95&%  Z8 KC
  1314. XMDU>RV(G/HA%41'(&]_5JD&^3EN:;G)%2;U1"S,%4#DGH*$C!MCT0**661+:W
  1315. XM>9^BC\SZ5S>L^,;>PC5;&,73L#B3.$'^-<K->Z]XA)$CNL1/"J-JXJM36GAY
  1316. XM3U>B-:[UV&2Z:!"9YY6PPC[^V>PI/$OC%_!<6GVJ0I)<W$;2RI_<7("_^S?E
  1317. XM59AIW@>P34+W%Q>.<0P X)/?Z#WKS35[^[U_5;C4KJ15EF;)'. .P'L!Q6E.
  1318. XMGSN[V-II?"MCT#YW/FL#GLO84NY53S'+#CC;V]Z;N0#=*WS@?=SP*YO4M8\P
  1319. XMW%ML(6,DO(#V[#CK13@I:';.7*M2W<ZQ<NOD*N) Q*2<$^G;V/M6"LAN[AX8
  1320. XM96'REI9>^T#)Y_I3+2]=R\9( 9?E_P *(]EK.[?,8FVJY'4J<Y%=\(**LCCG
  1321. XM)R9'82^0);W'S)Q$I[$C /X5<M;N,RSSW ,DY1F+?W% Z#T/:J>J6[65RV'4
  1322. XMP@ QX89VD9''7O6AH>GW^I+Y[>:T#_NXTSS(>O'MQR:?,H[DVNM"WI^CM-J=
  1323. XMM<7?F>68OX!_$PXC7Z \FO4-(T>.PMXFDCC3RQ^[A3[L8_J?>LG0-)-OGS9M
  1324. XM\L;8/3 )]/PQ6]<RF(! Q)/6N+%3YI66QDFTK(F9_F+$YQ21NSD'^$^M5V8@
  1325. XMJO5CU&>@J_;6_P N7.2>@["N;0.5VN-EF,4$DB1F1D7(4'&?QKS.[UO4=8NF
  1326. XM_M!V2W5R/L\60H7MGN6!YYKU@1$H1CBO(/&2OI6J221#:K'YE[,#VK2BUSV9
  1327. XMM3IIQ;ZHZ+1U7>;=T#D8*DC/7T_SWJ]K?B#3O#-N&N1YUTW^KM5.#]6]!6!X
  1328. XM8NVN;5RCG,0.UL\A2,C^H_"O/=0F:ZU*><L6WN3D\FKE04ZEWL6FU&Q-J>IW
  1329. XMFN:E)?WK[I'.% X5%[ #L*K2$ CZ=JE11M] *JOEV)%=2LM$*QT>IZ@E[>>5
  1330. XM$-@;<-_)R ,G K&C=IHYH9"?,D*LHQDMC/R_J*T8(T.HI(?EB13!!N_B<@_I
  1331. XMD_RK-M)'A0-OV,[;>1D^_P#.M%!05D3*HY-M@Z$7 BP X(7 [$U;M)5!F1X_
  1332. XM-WKE?H%))^M4A_H]\4F+!E;YF'8^M6UA>>>WL+8J\CH(PV<@+]XM].?T---)
  1333. XM7$RY8Z9%XAELI\L((H_+N 6RS$'Y5'U!'Y5ZGH]A%;J$V*D@3:%7HB_W1_6J
  1334. XM'AKP_%9Q1;4&%4B(XYYZN?<]O05NAH;:::YE<1V\0V[FXR:\VM5=26FPW:*<
  1335. XM5N,MXUBU";<,(H5MQ[\8X_*HI9S([&,8R>,CI6/J>K?;6!AO5M( P '&6/09
  1336. XM/8>U9\FMZAI]P4:.*ZC7KL;D5#?-L:TZ#6LMSL+6/8X)Y/4DUL18 'I7-Z=K
  1337. XM$&H6XD16C8<%''(-;<$A:$$<UEL[!5B^IIQ8Q7G'Q,T_?&)% Y%=A>Z[:Z7'
  1338. XMNG9BW9$&2:X#Q9X@FUVU:.*-8$5L NXW?I6D+\R:%0A)2OT,'P!<$:D]L6^_
  1339. XM&R#GOU'\C^=<_<ILO9D P%8@?G5[PE(UMXFM,]YE!^A./ZU)KD(AUR\C' W;
  1340. XMA]"?\37H/XR3+D.R(C&,]*@#", '/-2SMF0*!]VKNFZ<UZ96"[@N #CZTU;J
  1341. XM(FUI!:BRC"\([-GUP0O]*S9 )]/+])8Y?F&>26 Y_-3^==#K@@ETS<J@-&2N
  1342. XM".$+,2<GOUP![>U<JI(/!.3SS6TM&90U1//=1W$,?FQD3JN/-7^/' !']:[#
  1343. XMP+HJ?-<W'+2#)&#Q'V4>[']!7*Z1IQU+5%1P1;0C?*1Z>GU)XKVG2K2/3].\
  1344. XMZZV11Q@RRN> ..GX#  KDQ%2RY>II\*YC31X[.TDN9W$: 9)(Q@?2O*O%^KZ
  1345. XMC?W"E4>&S5L1KV&>Y]_Y5T=UJ\NNWF_!CM%/[J/U_P!H^_\ *K)TY9H#&R!D
  1346. XM]#7'%J+.FEAW%<T]W^!YM_9=W)?QP,SRLY "J?F;TQ_GBNKUSP;<>';ZWO-/
  1347. XMNV,,C8=)/FY]_49K=MK"ZM+A6MV*A<A<@$C\:OW/VB>V/VQEE8 _,1C'Y5LZ
  1348. XMEUH'(U43OH8MA."^57:3VKLHYTL-!EOIE)6-<A1_$>P_.N,5#$RL>I.37;>0
  1349. XME]X6,+J&4D9!Z&N=*YIB[**]3R*\N=6US6=E\TB)(^T10GH<\#'Y<_C65K=C
  1350. XM_8NKRVJ2%XQRI/7\:]#GBGLG+V^Q'"E5?;DC\37%:Q9S,)+JY?S)F(RQ[<UU
  1351. XM1J1T2(5.6YF:$Q&N6TN>?.CR?^!BMKQ3%MUN[?@;6(_4'^M86FMLFA8\'SD_
  1352. XM]"KI?' \K4I,=951OTQ_A6[^)'.<<2<ESZUW_A*S2UT</+RTS;Q]*X2UC$T\
  1353. XM40&3)(%Q[5ZA;6H6%8D&%C4*,5%:5E8<=[G(Z5=-JUU=17C(T"<0J0 JDG@^
  1354. XMY]S7.:E#)8ZA-;S1LCHYX(Q^5=7:7-AH=F[3+'<QW4# NK@88]@/;-9-A;WO
  1355. XMB:^M9I8VDM[)%25@,E@"2![FJ4W=R>Q+BDK(Z_P/H9\N$.OSG%Q-QW_@7^OY
  1356. XMU!XV\2?;M5CT.S?%I;N/M#*?]9(/X?H/Y_2M+5=>/ACPB\MJ#_:%Z^U7QCR_
  1357. XM<9ZD#]37F^EQEHVF8DL)AD_4&L(KFO.0XKFJ)=$=_9*$5,= *Z&TD' /0USE
  1358. XMD?W2]JV;:3 %<AZLXW1NX4KN]JI7KKLVXXHCG)&#T[52U&<+$Q/0#FE=G-"'
  1359. XMO%&XVY&.]=EH;"30)5SRHS7#NKO&' ]Z['PE()()8F(VE3FKB]1XN/[KT,74
  1360. XM!NR>]<=XD=8[!LXR2*ZV\8?-ST.*X#Q;=!I8K8'_ &C5TH\TTAN7+2,)7$=N
  1361. XMC]"LJ?XUUOQ"5MUE<@<?<)^@!'\S7)7/&GICJ75OTKL_%2_;/"5I=+T CD)]
  1362. XM>,5V-^\CB9S_ (8M#-K:$C*0J6)]Z].M8]D(8_Q\UQ?@JU)L9;HCF9L#Z"NW
  1363. XMW; %7H*Y,1*\[%=$><0Z#<Z^\"VT7DV:QA8L#KURS#IG/>NJ\+&V\.Z=>(62
  1364. XM2TMRTLUR?XFP.!ZDX %:.I,^C6B:1;N);Z51&2@_U:] ![FO/=;OTFNH](@E
  1365. XM_P!#BD_>R+TEEZ9^@Z#\3WK=MU7;H9)77KM_F4M9U.Z\0ZC+=W)95_Y8Q Y5
  1366. XM!Z58T6(-9SDCD3+Q6;;8:;G@<@BM'1G\H7B'LP'X@-_A6D[<K2-::LTSL+4;
  1367. XM44<XK4@; &1638R"6$-[5I1,",5YO4]9ZHT(FR,TVZA$T94]Q5*6[2S4-*VT
  1368. XM$X'%"ZG;NH(F0CV-!BXN]T0#2)[NZ!CDE#A< (Y"_E70Z187&FV+SO/DNN-H
  1369. XM&,51T[7[&UN0V?,.,8%6KKQ+8FWDMHA(S 9Z=SVJD8UG4E[J6AE:A,L,4CL<
  1370. XM(H)/L*\NNIVOM0>=LY=N!Z#M76>,=1,5G':*<23<L/1?_KFN0@4&7/8#G\J[
  1371. XML/#EBY'/6G=J"+%U%B! .> <?AG^M=4K_;/AW"IR66-H_P 0P KFKM=RX'4Y
  1372. XM &/0?_6KH?"W^D>%S!CE;KD>WWOZ42?NW[,F2U1T&@68L]+M80NTA=S#W/-:
  1373. XMK'FHK=-JX] !3R>:X&^9W8Y:.QS7B?5#I7F)YRRZS=*3+(/^6"'L/0D?D,5P
  1374. XM!3&P@@'-37<\EU=S7$TIEDD<LSMU8GO32I'DCGDUZ<(<D;/<QO=W"(<EL\$Y
  1375. XMJY:MMN)<'[Q#?7@_XUGAF7:>W0U,&.X,#T%$D6F=1I5X#  3R*W+>;=T(KA(
  1376. XMKF2W!D3G:V2/8UT.E:M%/@$@>H/%<-6DT[H]&E54E8ZA]LT9R.:I>2L;9"#\
  1377. XM!UJQ!*DF/F&#[UHV\$3@'C<*RL7[3D*MO>6T:C_0XV<>L>:2^NHH4ENYD2)0
  1378. XMH^11T]*UWCC"G@+@5P7C6](:UM4) 8F5\=\=!6L$YOE,)U5:]CD[^]DU'4I;
  1379. XMF0DEC\H]!V%,@1A(L?=G /O38HB'YZFK%FHDU"WX_P"6@)_.O0DK*R."+N[E
  1380. XMV509HCV\S^9_PK?\")FSOD/:13^A%8LJ?.F!G&3^M;_@5=LFI ^D1Y]\FN:;
  1381. XM_=LUENF=6HQGZT8IL;KY8&1GO1NKC42)2U/-?$.BQ:==/)9.6M1)Y;(?O1-Z
  1382. XM'U!['V-9\@#7%JH/\.>!_GTKHH";^2WDE Q?2O:S*!P<, ''H><^Y%<RAS?1
  1383. XMYYV@@?D:]>29C3>EB <\9]ZDA.#M'_ZJ:5"LI'KBI"H$N!Q29:9-;L3=*I/R
  1384. XMMQS74V.D68A5GB#,>>:YIT"RVS#J3C]:[&R&85/^R#7)6;231V4%=V9<M[6V
  1385. XMC \N%5QZ$UIPR+&@XYJE;J&4,>_:IQ_K O:N5MF[BC2@*W3;63@]2":BU?P'
  1386. XM8:R%E6:6"=5PISN7\0:M62A",5M1.:2J2B[HX*]]D>-:WX-UC0LRR0^?;#K-
  1387. XM",@#W'45AZ;(K7RG<,J<U]'1MG"D AN#FO,/B-X7L-'\G6-/7R'F<"2)1\I)
  1388. XM[CTKLIU_::2W.>,K-)G,2L/-QZ%@:W?"?[NRU"53DDHH_)O_ *U<L92\\F1W
  1389. XM;^==5X1.[1YF/5KLJ?H *516BSJZ%G;<Q'<&SGK]:#J$\?# DUJ.@/&*K/"F
  1390. X)[I6*);3W/__9
  1391. Xend
  1392. END_OF_FILE
  1393.   if test 6056 -ne `wc -c <'testimg.jpg.U'`; then
  1394.     echo shar: \"'testimg.jpg.U'\" unpacked with wrong size!
  1395.   else
  1396.     echo shar: Uudecoding \"'testimg.jpg'\" \(4374 characters\)
  1397.     cat testimg.jpg.U | uudecode
  1398.     if test 4374 -ne `wc -c <'testimg.jpg'`; then
  1399.       echo shar: \"'testimg.jpg'\" uudecoded with wrong size!
  1400.     else
  1401.       rm testimg.jpg.U
  1402.     fi
  1403.   fi
  1404.   # end of 'testimg.jpg.U'
  1405. fi
  1406. if test -f 'testorig.jpg.U' -a "${1}" != "-c" ; then 
  1407.   echo shar: Will not clobber existing file \"'testorig.jpg.U'\"
  1408. else
  1409.   echo shar: Extracting \"'testorig.jpg.U'\" \(6057 characters\)
  1410.   sed "s/^X//" >'testorig.jpg.U' <<'END_OF_FILE'
  1411. Xbegin 666 testorig.jpg
  1412. XM_]C_X  02D9)1@ ! 0   0 !  #_VP!#  @&!@<&!0@'!P<)"0@*#!0-# L+
  1413. XM#!D2$P\4'1H?'AT:'!P@)"XG("(L(QP<*#<I+# Q-#0T'R<Y/3@R/"XS-#+_
  1414. XMVP!# 0D)"0P+#!@-#1@R(1PA,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C(R
  1415. XM,C(R,C(R,C(R,C(R,C(R,C(R,C(R,C+_P  1" !] 'T# 2(  A$! Q$!_\0 
  1416. XM'P   04! 0$! 0$           $" P0%!@<("0H+_\0 M1   @$# P($ P4%
  1417. XM! 0   %] 0(#  01!1(A,4$&$U%A!R)Q%#*!D:$((T*QP152T? D,V)R@@D*
  1418. XM%A<8&1HE)B<H*2HT-38W.#DZ0T1%1D=(24I35%565UA96F-D969G:&EJ<W1U
  1419. XM=G=X>7J#A(6&AXB)BI*3E)66EYB9FJ*CI*6FIZBIJK*SM+6VM[BYNL+#Q,7&
  1420. XMQ\C)RM+3U-76U]C9VN'BX^3EYN?HZ>KQ\O/T]?;W^/GZ_\0 'P$  P$! 0$!
  1421. XM 0$! 0        $" P0%!@<("0H+_\0 M1$  @$"! 0#! <%! 0  0)W  $"
  1422. XM Q$$!2$Q!A)!40=A<1,B,H$(%$*1H;'!"2,S4O 58G+1"A8D-.$E\1<8&1HF
  1423. XM)R@I*C4V-S@Y.D-$149'2$E*4U155E=865IC9&5F9VAI:G-T=79W>'EZ@H.$
  1424. XMA8:'B(F*DI.4E9:7F)F:HJ.DI::GJ*FJLK.TM;:WN+FZPL/$Q<;'R,G*TM/4
  1425. XMU=;7V-G:XN/DY>;GZ.GJ\O/T]?;W^/GZ_]H # ,!  (1 Q$ /P"1I?N)&H#8
  1426. XM^51T J5 D"DL<N<9;U-01*+>(LQ)D8\GO0#N^=^N>!7%8^K+<;DG<^>?NJ.K
  1427. XM5,;J. KYC$S$'"*,D#Z>E4FE\@#(S(QPJ^A_R*HW=]'!^ZEF D?EROWC[ =J
  1428. XMTIT^9F<]#8_MJW567>4?'1QC)]JF-^T4JI/%Y2LI*S%LC/I7GUYJ,#7"(D<K
  1429. XMRAP?F?@^@ 'X5KWVL74L4$$D\<4[\8QDC_/^>U=7U5-'-*=F=FD\6T,KB09/
  1430. XMS Y_#CI22ZC!!!YCRCRQSN'/;/:O-I[J:*6-1<-N?DRAL$\$XX[?3\S531-.
  1431. XMU#7KHS&>2*TC($EP3@CV'JW/2D\+&.K>A'M+]#UB*Z-R4\AA+O&593D8]<^E
  1432. XM:%M9EN2?,QW/W0?;UJEH>E0Z?IMO;;72W1?EC8_.W/5O\.U;A95&%  Z8 KC
  1433. XMDU>RV(G/HA%41'(&]_5JD&^3EN:;G)%2;U1"S,%4#DGH*$C!MCT0**661+:W
  1434. XM>9^BC\SZ5S>L^,;>PC5;&,73L#B3.$'^-<K->Z]XA)$CNL1/"J-JXJM36GAY
  1435. XM3U>B-:[UV&2Z:!"9YY6PPC[^V>PI?$?C!O!D5A:K"DES/&TLJ?\ /-<@+_[-
  1436. XM^55&&G>![!-0O<7%XYQ# #@D]_H/>O--7U"YU[5;C4KP_O9FS@9PH[ >P'%:
  1437. XM4J:F[O8VFD_=6QZ!\[GS6!SV7L*7<JIYCEAQQM[>]-W(!NE;YP/NYX%<WJ6L
  1438. XM>8;BVV$+&27D![=AQUHIP4M#MG+E6I;N=8N77R%7$@8E)."?3M['VK!60W=P
  1439. XM\,,K#Y2TLO?:!D\_TIEI>NY>,D ,OR_X41[+6=V^8Q-M5R.I4YR*[X0459''
  1440. XM.3DR.PE\@2WN/F3B)3V)& ?PJY:W<9EGGN 9)RC,6_N*!T'H>U4]4MVLKEL.
  1441. XMIA !CPPSM(R..O>M#0]/O]27SV\UH'_=QIGF0]>/;CDT^91W)M=:%O3]':;4
  1442. XM[:XN_,\LQ?P#^)AQ&OT!Y->H:1H\=A;Q-)'&GEC]W"GW8Q_4^]9.@:2;?/FS
  1443. XM;Y8VP>F 3Z?ABMZYE,0"!B2>M<6*GS2LMC)-I61,S_,6)SBDC=G(/\)]:KLQ
  1444. XM!5>K'J,]!5^VM_ERYR3T'85S:!RNUQLLQB@DD2,R,BY"@XS^->9W>MZCK%TW
  1445. XM]H.R6ZN1]GBR%"]L]RP//->L"(E",<5Y!XR5]*U222(;58_,O9@>U:46N>S-
  1446. XMJ=-.+?5'1:.J[S;N@<C!4D9Z^G^>]7M;\0:=X9MPUR/.NF_U=JIP?JWH*P/#
  1447. XM%VUS:N4<YB!VMGD*1D?U'X5Y[J$S76I3SEBV]R<GDU<J"G4N]BTVHV)M3U.\
  1448. XMUS4I+^]?=(YPH'"HO8 =A5=V"D?3M4B*-OH!55\NQ(KJ5EHA6.CU/4$O;SRH
  1449. XMAL#;AOY.0!DX%8T;M-'-#(3YDA5E&,EL9^7]16C!&AU%)#\L2*8(-W\3D'],
  1450. XMG^59MI(\*!M^QG;;R,GW_G6B@H*R)E4<FVP="+@18 <$+@=B:MVDJ@S(\?F[
  1451. XMUROT"DD_6J0_T>^*3%@RM\S#L?6K:PO//;V%L5>1T$8;.0%^\6^G/Z&FFDKB
  1452. XM9<L=,B\0RV4^6$$4?EW +99B#\JCZ@C\J]3T>PBMU";%20)M"KT1?[H_K5#P
  1453. XMUX?BLXHMJ#"J1$<<\]7/N>WH*W0T-M--<RN([>(;=S<9->;6JNI+38;M%.*W
  1454. XM&6\:Q:A-N&$4*VX]^,<?E44LYD=C&,9/&1TK'U/5OMK PWJVD 8 #C+'H,GL
  1455. XM/:L^36]0T^X*-'%=1KUV-R*AOFV-:>':UEN=A:Q['!/)ZDFMB+  ]*YO3M8@
  1456. XMU"W$B*T;#@HXY!K;@D+0@CFLMG8*L7U-.+&*\X^)FG[XQ(H'(KL+W7;72X]T
  1457. XM[,6[(@R37 >+/$$VNVK1Q1K BM@%W&[]*N%^9-"P\)*5^A@^ +@C4GMBWWXV
  1458. XM0<]^H_D?SKG[E-E[,@& K$#\ZO>$I&MO$UIGO,H/T)Q_6I-<A$.N7D8X&[</
  1459. XMH3_B:]%_&09<AV1$8QGI4 81@ YYJ6=LR!0/NU<T[36OO-8#(7 !Q]::MU G
  1460. XMUI!:BRC"\([-GUP0O]*S9 )]/+])8Y?F&>26 Y_-3^==#K@@ETS<J@-&2N".
  1461. XM$+,2<GOUP![>U<JI(/!.3SS6TM&90U1//=1W$,?FQD3JN/-7^/' !']:[#P+
  1462. XMHJ?-<W'+2#)&#Q'V4>[']!7*Z1IQU+5%1P1;0C?*1Z>GU)XKVG2K2/3].\ZZ
  1463. XMV11Q@RRN> ..GX#  KDQ%2RY>II\*YC31X[.TDN9W$: 9)(Q@?2O*O%^KZC?
  1464. XMW"E4>&S5L1KV&>Y]_P"5='=:O+KMYOP8[13^ZC]?]H^_\JLG3EF@,;(&3T-<
  1465. XM<6HLZ:6'<5S3W?X'FW]EW<E_' S/*SD *I^9O3'^>*ZO7/!MQX=OK>\T^[8P
  1466. XMR-ATD^;GW]1FMVVL+JTN%:W8J%R%R 2/QJ_<_:)[8_;&65@#\Q&,?E6SJW6@
  1467. XM<C51.^ABV$X+Y5=I/:NRCG2PT&6^F4E8UR%'\1[#\ZXQ4,3*QZDY-=MY"7WA
  1468. XM8PNH921D'H:YTKFF+LHKU/(KRYU;7-9V7S2(DC[1%">ASP,?ES^-96MV/]BZ
  1469. XMO+:I(7C'*D]?QKT.>*>R<O;[$<*55]N2/Q-<5K%G,PDNKE_,F8C+'MS75&I'
  1470. XM1(A4Y;F9H3$:Y;2YY\Z/)_X&*VO%,6W6[M^!M8C]0?ZUA::VR:%CP?.3_P!"
  1471. XMKI?' \K4I,=951OTQ_A6[^)'.<<2<ESZUWWA.S%MHX=^6F;?^%<+:QB:>*(#
  1472. XM)DD"X]J]1M;8+"L2#"QJ%&*SKRM&PX[W.0TJZ;5KJZBO&1H$XA4@!5)/!]S[
  1473. XMFN<U*&2QU":WFC9'1SP1C\JZNTN;#0[-VF6.YCNH&!=7 PQ[ >V:R;"WO?$U
  1474. XM]:S2QM);V2*DK 9+ $D#W-6IN[D]B7%)61U_@?0SY<(=?G.+B;CO_ O]?SJ#
  1475. XMQMXD^W:K'H=F^+2W<?:&4_ZR0?P_0?S^E:6JZ\?#'A%Y;4'^T+U]JOC'E^XS
  1476. XMU('ZFO-]+C+1M,Q)83#)^H-817->I(<5S5$NB._LE"*F.@%=#:2#@'H:YRR/
  1477. XM[I>U;-M)@"N0]6<;HW<*5W>U4KUUV;<<41SDC!Z=JI:C.%B8GH!S2NSFA#WB
  1478. XMC<;<C'>NRT-A)H$JYY49KAW5WC#@>]=CX2D$D$L3$;2IS5Q>H8R/[GT,74!N
  1479. XMR>]<=XD=8[!LXR2*ZV\8?-ST.*X#Q;=!I8K8'_:-72CS32*<N6D82N([='Z%
  1480. XM94_QKK?B$K;K*Y X^X3] "/YFN2N>-/3'4NK?I79^*E^V>$K2Z7H!'(3Z\8K
  1481. XML;]Y'$SG_#%H9M;0D92%2Q/O7IUK'LA#'^/FN+\%6I-C+=$<S-@?05V^=H"C
  1482. XMH*Y,1*\[%=$><0Z#<Z^\"VT7DV:QA8L#KURS#IG/>NJ\+&V\.Z=>(622TMRT
  1483. XMLUR?XFP.!ZDX %:.I,^C6B:1;N);Z51&2@_U:] ![FO/=;OTFNH](@E_T.*3
  1484. XM][(O267IGZ#H/Q/>MVW5=NADE=>NW^92UG4[KQ#J,MW<EE7_ )8Q Y5!Z58T
  1485. XM6(-9SDCD3+Q6;;8:;G@<@BM'1G\H7B'LP'X@-_A6D[<K2-::LTSL+4;44<XK
  1486. XM4@; &1638R"6$-[5I1,",5YG4]9ZHT(FR,TVZA$T94]Q5*6[2S4-*VT$X'%"
  1487. XMZG;NH(F0CV-,Q<7>Z(!I$]W= QR2APN $<A?RKH=(L+C3;%YWGR77&T#&*HZ
  1488. XM=K]C:W(;/F'&,"K5UXEL3;R6T0D9@,].Y[52,:SJR]U+0RM0F6&*1V.$4$GV
  1489. XM%>774[7VH/.V<NW ]!VKK/&.HF*SCM%.))N6'HO_ -<UR$"@RY[ <_E7=AX<
  1490. XML7(YZ\[M018NHL0(!SP#C\,_UKJE?[9\.X5.2RQM'^(8 5S5VNY<#J<@#'H/
  1491. XM_K5T/A;_ $CPN8,<K=<CV^]_2B3]V_9DR6J.@T"S%GI=K"%VD+N8>YYK58\U
  1492. XM%;IM7'H *>3S7!?F=V.6CL<UXGU0Z5YB><LNLW2DRR#_ )8(>P]"1^0Q7 %,
  1493. XM;"" <U-=SR75W-<32F621RS.W5B>]-*D>2.>37IPAR1L]S&]W<(AR6SP3FKE
  1494. XMJVVXEP?O$-]>#_C6>&9=I[=#4P8[@P/0421:9U&E7@, !/(K<MYMW0BN$BN9
  1495. XM+<&1.=K9(]C70Z5JT4^ 2!Z@\5PU:33NCT:5525CJ'VS1G(YJEY*QMD(/P'6
  1496. XMK$$J28^88/O6C;P1. >-PK*Q?M.0JV]Y;1J/]#C9QZQYI+ZZBA26[F1(E"CY
  1497. XM%'3TK7>.,*> N!7!>-;TAK6U0D!B97QWQT%:P3F^4PG55KV.3O[V34=2EN9"
  1498. XM26/RCT'84R!&$BQ]V< ^]-BB(?GJ:L6:B34+?C_EH"?SKT)*RLC@B[NY=E4&
  1499. XM:(]O,_F?\*W_  (F;.^0]I%/Z$5BRI\Z8&<9/ZUO^!5VR:D#Z1'GWR:YIO\ 
  1500. XM=LUENF=6HQGZT8IL;KY8&1GO1NKC42)2U/-?$.BQ:==/)9.6M1)Y;(?O1-Z'
  1501. XMU!['V-9\@#7%JH/\.>!_GTKHX0;Z2WDFVXOIY+.90."5(PX]#SGW(KF$.;Z,
  1502. XM'G:"!^1KUY)F--Z6(!SQGWJ2$X.T?_JIN &4CUQ4A4"; XI,M,FMV)NE4GY6
  1503. XMXYKJ;'2+,0JSQ!F//-<U)&$EM6[L<?K78V0S"I_V0:Y*S:2:.R@KNS+EO:VT
  1504. XM8'EPJN/0FM.&18T''-4K< J&/?M4X^^!VKE;9NXHTH"MTVUDX/4@FHM7\!V&
  1505. XMLA95FE@G5<*<[E_$&K5D A&*VHI#25247='!7OLCQK6_!NL:%F62'S[8=9H1
  1506. XMD >XZBL/39%:^4[AE3FOHZ([A@@$'@YKS'XB^%K#2!%K.GKY#RRA)(E'RDGN
  1507. XM/2NRGB/:>[+<YXRY6DSEY6'FX]"P-;OA/]W9:A*IR244?DW_ -:N5,Q>>3([
  1508. XMM_.NK\(G=H\S'JUT0?H *516BSJZ%G;<Q'<&SGK]:#J$\?!!)K4= >,56>)-
  1509. X)W2L42VGN?__9
  1510. Xend
  1511. END_OF_FILE
  1512.   if test 6057 -ne `wc -c <'testorig.jpg.U'`; then
  1513.     echo shar: \"'testorig.jpg.U'\" unpacked with wrong size!
  1514.   else
  1515.     echo shar: Uudecoding \"'testorig.jpg'\" \(4374 characters\)
  1516.     cat testorig.jpg.U | uudecode
  1517.     if test 4374 -ne `wc -c <'testorig.jpg'`; then
  1518.       echo shar: \"'testorig.jpg'\" uudecoded with wrong size!
  1519.     else
  1520.       rm testorig.jpg.U
  1521.     fi
  1522.   fi
  1523.   # end of 'testorig.jpg.U'
  1524. fi
  1525. echo shar: End of archive 17 \(of 18\).
  1526. cp /dev/null ark17isdone
  1527. MISSING=""
  1528. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ; do
  1529.     if test ! -f ark${I}isdone ; then
  1530.     MISSING="${MISSING} ${I}"
  1531.     fi
  1532. done
  1533. if test "${MISSING}" = "" ; then
  1534.     echo You have unpacked all 18 archives.
  1535.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1536. else
  1537.     echo You still must unpack the following archives:
  1538.     echo "        " ${MISSING}
  1539. fi
  1540. exit 0
  1541. exit 0 # Just in case...
  1542.