]> git.pld-linux.org Git - packages/libjpeg.git/commitdiff
- up to version 7
authorArkadiusz Miśkiewicz <arekm@maven.pl>
Fri, 10 Jul 2009 12:08:42 +0000 (12:08 +0000)
committercvs2git <feedback@pld-linux.org>
Sun, 24 Jun 2012 12:13:13 +0000 (12:13 +0000)
Changed files:
    libjpeg-DESTDIR.patch -> 1.2
    libjpeg-arith.patch -> 1.2
    libjpeg-arm.patch -> 1.2
    libjpeg-c++.patch -> 1.3
    libjpeg-crop.patch -> 1.2
    libjpeg-include.patch -> 1.2
    libjpeg-libtool.patch -> 1.2
    libjpeg.spec -> 1.67

libjpeg-DESTDIR.patch [deleted file]
libjpeg-arith.patch [deleted file]
libjpeg-arm.patch [deleted file]
libjpeg-c++.patch [deleted file]
libjpeg-crop.patch [deleted file]
libjpeg-include.patch [deleted file]
libjpeg-libtool.patch [deleted file]
libjpeg.spec

diff --git a/libjpeg-DESTDIR.patch b/libjpeg-DESTDIR.patch
deleted file mode 100644 (file)
index 62902ec..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-diff -ur jpeg-6b.old/makefile.cfg jpeg-6b/makefile.cfg
---- jpeg-6b.old/makefile.cfg   Sat Mar 21 20:08:57 1998
-+++ jpeg-6b/makefile.cfg       Thu Jun 24 10:37:57 1999
-@@ -17,7 +17,7 @@
- binprefix =
- manprefix =
- manext = 1
--mandir = $(prefix)/man/man$(manext)
-+mandir = @mandir@/man$(manext)
- # The name of your C compiler:
- CC= @CC@
-@@ -191,25 +191,25 @@
- # Installation rules:
- install: cjpeg djpeg jpegtran rdjpgcom wrjpgcom @FORCE_INSTALL_LIB@
--      $(INSTALL_PROGRAM) cjpeg $(bindir)/$(binprefix)cjpeg
--      $(INSTALL_PROGRAM) djpeg $(bindir)/$(binprefix)djpeg
--      $(INSTALL_PROGRAM) jpegtran $(bindir)/$(binprefix)jpegtran
--      $(INSTALL_PROGRAM) rdjpgcom $(bindir)/$(binprefix)rdjpgcom
--      $(INSTALL_PROGRAM) wrjpgcom $(bindir)/$(binprefix)wrjpgcom
--      $(INSTALL_DATA) $(srcdir)/cjpeg.1 $(mandir)/$(manprefix)cjpeg.$(manext)
--      $(INSTALL_DATA) $(srcdir)/djpeg.1 $(mandir)/$(manprefix)djpeg.$(manext)
--      $(INSTALL_DATA) $(srcdir)/jpegtran.1 $(mandir)/$(manprefix)jpegtran.$(manext)
--      $(INSTALL_DATA) $(srcdir)/rdjpgcom.1 $(mandir)/$(manprefix)rdjpgcom.$(manext)
--      $(INSTALL_DATA) $(srcdir)/wrjpgcom.1 $(mandir)/$(manprefix)wrjpgcom.$(manext)
-+      $(INSTALL_PROGRAM) cjpeg $(DESTDIR)$(bindir)/$(binprefix)cjpeg
-+      $(INSTALL_PROGRAM) djpeg $(DESTDIR)$(bindir)/$(binprefix)djpeg
-+      $(INSTALL_PROGRAM) jpegtran $(DESTDIR)$(bindir)/$(binprefix)jpegtran
-+      $(INSTALL_PROGRAM) rdjpgcom $(DESTDIR)$(bindir)/$(binprefix)rdjpgcom
-+      $(INSTALL_PROGRAM) wrjpgcom $(DESTDIR)$(bindir)/$(binprefix)wrjpgcom
-+      $(INSTALL_DATA) $(srcdir)/cjpeg.1 $(DESTDIR)$(mandir)/$(manprefix)cjpeg.$(manext)
-+      $(INSTALL_DATA) $(srcdir)/djpeg.1 $(DESTDIR)$(mandir)/$(manprefix)djpeg.$(manext)
-+      $(INSTALL_DATA) $(srcdir)/jpegtran.1 $(DESTDIR)$(mandir)/$(manprefix)jpegtran.$(manext)
-+      $(INSTALL_DATA) $(srcdir)/rdjpgcom.1 $(DESTDIR)$(mandir)/$(manprefix)rdjpgcom.$(manext)
-+      $(INSTALL_DATA) $(srcdir)/wrjpgcom.1 $(DESTDIR)$(mandir)/$(manprefix)wrjpgcom.$(manext)
- install-lib: libjpeg.$(A) install-headers
--      $(INSTALL_LIB) libjpeg.$(A) $(libdir)/$(binprefix)libjpeg.$(A)
-+      $(INSTALL_LIB) libjpeg.$(A) $(DESTDIR)$(libdir)/$(binprefix)libjpeg.$(A)
- install-headers: jconfig.h
--      $(INSTALL_DATA) jconfig.h $(includedir)/jconfig.h
--      $(INSTALL_DATA) $(srcdir)/jpeglib.h $(includedir)/jpeglib.h
--      $(INSTALL_DATA) $(srcdir)/jmorecfg.h $(includedir)/jmorecfg.h
--      $(INSTALL_DATA) $(srcdir)/jerror.h $(includedir)/jerror.h
-+      $(INSTALL_DATA) jconfig.h $(DESTDIR)$(includedir)/jconfig.h
-+      $(INSTALL_DATA) $(srcdir)/jpeglib.h $(DESTDIR)$(includedir)/jpeglib.h
-+      $(INSTALL_DATA) $(srcdir)/jmorecfg.h $(DESTDIR)$(includedir)/jmorecfg.h
-+      $(INSTALL_DATA) $(srcdir)/jerror.h $(DESTDIR)$(includedir)/jerror.h
- clean:
-       $(RM) *.o *.lo libjpeg.a libjpeg.la
diff --git a/libjpeg-arith.patch b/libjpeg-arith.patch
deleted file mode 100644 (file)
index 6e64549..0000000
+++ /dev/null
@@ -1,2255 +0,0 @@
-diff -Nur jpeg-6b.orig/jaricom.c jpeg-6b/jaricom.c
---- jpeg-6b.orig/jaricom.c     1970-01-01 01:00:00.000000000 +0100
-+++ jpeg-6b/jaricom.c  1997-08-10 18:40:45.000000000 +0200
-@@ -0,0 +1,149 @@
-+/*
-+ * jaricom.c
-+ *
-+ * Copyright (C) 1997, Guido Vollbeding <guivol@esc.de>.
-+ * This file is NOT part of the Independent JPEG Group's software
-+ * for legal reasons.
-+ * See the accompanying README file for conditions of distribution and use.
-+ *
-+ * This file contains probability estimation tables for common use in
-+ * arithmetic entropy encoding and decoding routines.
-+ *
-+ * This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1
-+ * and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec
-+ * (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82).
-+ */
-+
-+#define JPEG_INTERNALS
-+#include "jinclude.h"
-+#include "jpeglib.h"
-+
-+/* The following #define specifies the packing of the four components
-+ * into the compact INT32 representation.
-+ * Note that this formula must match the actual arithmetic encoder
-+ * and decoder implementation. The implementation has to be changed
-+ * if this formula is changed.
-+ * The current organisation is leaned on Markus Kuhn's JBIG
-+ * implementation (jbig_tab.c).
-+ */
-+
-+#define V(a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)
-+
-+const INT32 jaritab[113] = {
-+/*
-+ * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS
-+ */
-+/*   0 */  V( 0x5a1d,   1,   1, 1 ),
-+/*   1 */  V( 0x2586,  14,   2, 0 ),
-+/*   2 */  V( 0x1114,  16,   3, 0 ),
-+/*   3 */  V( 0x080b,  18,   4, 0 ),
-+/*   4 */  V( 0x03d8,  20,   5, 0 ),
-+/*   5 */  V( 0x01da,  23,   6, 0 ),
-+/*   6 */  V( 0x00e5,  25,   7, 0 ),
-+/*   7 */  V( 0x006f,  28,   8, 0 ),
-+/*   8 */  V( 0x0036,  30,   9, 0 ),
-+/*   9 */  V( 0x001a,  33,  10, 0 ),
-+/*  10 */  V( 0x000d,  35,  11, 0 ),
-+/*  11 */  V( 0x0006,   9,  12, 0 ),
-+/*  12 */  V( 0x0003,  10,  13, 0 ),
-+/*  13 */  V( 0x0001,  12,  13, 0 ),
-+/*  14 */  V( 0x5a7f,  15,  15, 1 ),
-+/*  15 */  V( 0x3f25,  36,  16, 0 ),
-+/*  16 */  V( 0x2cf2,  38,  17, 0 ),
-+/*  17 */  V( 0x207c,  39,  18, 0 ),
-+/*  18 */  V( 0x17b9,  40,  19, 0 ),
-+/*  19 */  V( 0x1182,  42,  20, 0 ),
-+/*  20 */  V( 0x0cef,  43,  21, 0 ),
-+/*  21 */  V( 0x09a1,  45,  22, 0 ),
-+/*  22 */  V( 0x072f,  46,  23, 0 ),
-+/*  23 */  V( 0x055c,  48,  24, 0 ),
-+/*  24 */  V( 0x0406,  49,  25, 0 ),
-+/*  25 */  V( 0x0303,  51,  26, 0 ),
-+/*  26 */  V( 0x0240,  52,  27, 0 ),
-+/*  27 */  V( 0x01b1,  54,  28, 0 ),
-+/*  28 */  V( 0x0144,  56,  29, 0 ),
-+/*  29 */  V( 0x00f5,  57,  30, 0 ),
-+/*  30 */  V( 0x00b7,  59,  31, 0 ),
-+/*  31 */  V( 0x008a,  60,  32, 0 ),
-+/*  32 */  V( 0x0068,  62,  33, 0 ),
-+/*  33 */  V( 0x004e,  63,  34, 0 ),
-+/*  34 */  V( 0x003b,  32,  35, 0 ),
-+/*  35 */  V( 0x002c,  33,   9, 0 ),
-+/*  36 */  V( 0x5ae1,  37,  37, 1 ),
-+/*  37 */  V( 0x484c,  64,  38, 0 ),
-+/*  38 */  V( 0x3a0d,  65,  39, 0 ),
-+/*  39 */  V( 0x2ef1,  67,  40, 0 ),
-+/*  40 */  V( 0x261f,  68,  41, 0 ),
-+/*  41 */  V( 0x1f33,  69,  42, 0 ),
-+/*  42 */  V( 0x19a8,  70,  43, 0 ),
-+/*  43 */  V( 0x1518,  72,  44, 0 ),
-+/*  44 */  V( 0x1177,  73,  45, 0 ),
-+/*  45 */  V( 0x0e74,  74,  46, 0 ),
-+/*  46 */  V( 0x0bfb,  75,  47, 0 ),
-+/*  47 */  V( 0x09f8,  77,  48, 0 ),
-+/*  48 */  V( 0x0861,  78,  49, 0 ),
-+/*  49 */  V( 0x0706,  79,  50, 0 ),
-+/*  50 */  V( 0x05cd,  48,  51, 0 ),
-+/*  51 */  V( 0x04de,  50,  52, 0 ),
-+/*  52 */  V( 0x040f,  50,  53, 0 ),
-+/*  53 */  V( 0x0363,  51,  54, 0 ),
-+/*  54 */  V( 0x02d4,  52,  55, 0 ),
-+/*  55 */  V( 0x025c,  53,  56, 0 ),
-+/*  56 */  V( 0x01f8,  54,  57, 0 ),
-+/*  57 */  V( 0x01a4,  55,  58, 0 ),
-+/*  58 */  V( 0x0160,  56,  59, 0 ),
-+/*  59 */  V( 0x0125,  57,  60, 0 ),
-+/*  60 */  V( 0x00f6,  58,  61, 0 ),
-+/*  61 */  V( 0x00cb,  59,  62, 0 ),
-+/*  62 */  V( 0x00ab,  61,  63, 0 ),
-+/*  63 */  V( 0x008f,  61,  32, 0 ),
-+/*  64 */  V( 0x5b12,  65,  65, 1 ),
-+/*  65 */  V( 0x4d04,  80,  66, 0 ),
-+/*  66 */  V( 0x412c,  81,  67, 0 ),
-+/*  67 */  V( 0x37d8,  82,  68, 0 ),
-+/*  68 */  V( 0x2fe8,  83,  69, 0 ),
-+/*  69 */  V( 0x293c,  84,  70, 0 ),
-+/*  70 */  V( 0x2379,  86,  71, 0 ),
-+/*  71 */  V( 0x1edf,  87,  72, 0 ),
-+/*  72 */  V( 0x1aa9,  87,  73, 0 ),
-+/*  73 */  V( 0x174e,  72,  74, 0 ),
-+/*  74 */  V( 0x1424,  72,  75, 0 ),
-+/*  75 */  V( 0x119c,  74,  76, 0 ),
-+/*  76 */  V( 0x0f6b,  74,  77, 0 ),
-+/*  77 */  V( 0x0d51,  75,  78, 0 ),
-+/*  78 */  V( 0x0bb6,  77,  79, 0 ),
-+/*  79 */  V( 0x0a40,  77,  48, 0 ),
-+/*  80 */  V( 0x5832,  80,  81, 1 ),
-+/*  81 */  V( 0x4d1c,  88,  82, 0 ),
-+/*  82 */  V( 0x438e,  89,  83, 0 ),
-+/*  83 */  V( 0x3bdd,  90,  84, 0 ),
-+/*  84 */  V( 0x34ee,  91,  85, 0 ),
-+/*  85 */  V( 0x2eae,  92,  86, 0 ),
-+/*  86 */  V( 0x299a,  93,  87, 0 ),
-+/*  87 */  V( 0x2516,  86,  71, 0 ),
-+/*  88 */  V( 0x5570,  88,  89, 1 ),
-+/*  89 */  V( 0x4ca9,  95,  90, 0 ),
-+/*  90 */  V( 0x44d9,  96,  91, 0 ),
-+/*  91 */  V( 0x3e22,  97,  92, 0 ),
-+/*  92 */  V( 0x3824,  99,  93, 0 ),
-+/*  93 */  V( 0x32b4,  99,  94, 0 ),
-+/*  94 */  V( 0x2e17,  93,  86, 0 ),
-+/*  95 */  V( 0x56a8,  95,  96, 1 ),
-+/*  96 */  V( 0x4f46, 101,  97, 0 ),
-+/*  97 */  V( 0x47e5, 102,  98, 0 ),
-+/*  98 */  V( 0x41cf, 103,  99, 0 ),
-+/*  99 */  V( 0x3c3d, 104, 100, 0 ),
-+/* 100 */  V( 0x375e,  99,  93, 0 ),
-+/* 101 */  V( 0x5231, 105, 102, 0 ),
-+/* 102 */  V( 0x4c0f, 106, 103, 0 ),
-+/* 103 */  V( 0x4639, 107, 104, 0 ),
-+/* 104 */  V( 0x415e, 103,  99, 0 ),
-+/* 105 */  V( 0x5627, 105, 106, 1 ),
-+/* 106 */  V( 0x50e7, 108, 107, 0 ),
-+/* 107 */  V( 0x4b85, 109, 103, 0 ),
-+/* 108 */  V( 0x5597, 110, 109, 0 ),
-+/* 109 */  V( 0x504f, 111, 107, 0 ),
-+/* 110 */  V( 0x5a10, 110, 111, 1 ),
-+/* 111 */  V( 0x5522, 112, 109, 0 ),
-+/* 112 */  V( 0x59eb, 112, 111, 1 )
-+};
-diff -Nur jpeg-6b.orig/jcarith.c jpeg-6b/jcarith.c
---- jpeg-6b.orig/jcarith.c     1970-01-01 01:00:00.000000000 +0100
-+++ jpeg-6b/jcarith.c  1997-08-10 18:40:45.000000000 +0200
-@@ -0,0 +1,922 @@
-+/*
-+ * jcarith.c
-+ *
-+ * Copyright (C) 1997, Guido Vollbeding <guivol@esc.de>.
-+ * This file is NOT part of the Independent JPEG Group's software
-+ * for legal reasons.
-+ * See the accompanying README file for conditions of distribution and use.
-+ *
-+ * This file contains portable arithmetic entropy encoding routines for JPEG
-+ * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
-+ *
-+ * Both sequential and progressive modes are supported in this single module.
-+ *
-+ * Suspension is not currently supported in this module.
-+ */
-+
-+#define JPEG_INTERNALS
-+#include "jinclude.h"
-+#include "jpeglib.h"
-+
-+
-+/* Expanded entropy encoder object for arithmetic encoding. */
-+
-+typedef struct {
-+  struct jpeg_entropy_encoder pub; /* public fields */
-+
-+  INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */
-+  INT32 a;               /* A register, normalized size of coding interval */
-+  INT32 sc;        /* counter for stacked 0xFF values which might overflow */
-+  INT32 zc;          /* counter for pending 0x00 output values which might *
-+                          * be discarded at the end ("Pacman" termination) */
-+  int ct;  /* bit shift counter, determines when next byte will be written */
-+  int buffer;                /* buffer for most recent output byte != 0xFF */
-+
-+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-+  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
-+
-+  unsigned int restarts_to_go;        /* MCUs left in this restart interval */
-+  int next_restart_num;               /* next restart number to write (0-7) */
-+
-+  /* Pointers to statistics areas (these workspaces have image lifespan) */
-+  unsigned char * dc_stats[NUM_ARITH_TBLS];
-+  unsigned char * ac_stats[NUM_ARITH_TBLS];
-+} arith_entropy_encoder;
-+
-+typedef arith_entropy_encoder * arith_entropy_ptr;
-+
-+/* The following two definitions specify the allocation chunk size
-+ * for the statistics area.
-+ * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
-+ * 49 statistics bins for DC, and 245 statistics bins for AC coding.
-+ * Note that we use one additional AC bin for codings with fixed
-+ * probability (0.5), thus the minimum number for AC is 246.
-+ *
-+ * We use a compact representation with 1 byte per statistics bin,
-+ * thus the numbers directly represent byte sizes.
-+ * This 1 byte per statistics bin contains the meaning of the MPS
-+ * (more probable symbol) in the highest bit (mask 0x80), and the
-+ * index into the probability estimation state machine table
-+ * in the lower bits (mask 0x7F).
-+ */
-+
-+#define DC_STAT_BINS 64
-+#define AC_STAT_BINS 256
-+
-+/* NOTE: Uncomment the following #define if you want to use the
-+ * given formula for calculating the AC conditioning parameter Kx
-+ * for spectral selection progressive coding in section G.1.3.2
-+ * of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
-+ * Although the spec and P&M authors claim that this "has proven
-+ * to give good results for 8 bit precision samples", I'm not
-+ * convinced yet that this is really beneficial.
-+ * Early tests gave only very marginal compression enhancements
-+ * (a few - around 5 or so - bytes even for very large files),
-+ * which would turn out rather negative if we'd suppress the
-+ * DAC (Define Arithmetic Conditioning) marker segments for
-+ * the default parameters in the future.
-+ * Note that currently the marker writing module emits 12-byte
-+ * DAC segments for a full-component scan in a color image.
-+ * This is not worth worrying about IMHO. However, since the
-+ * spec defines the default values to be used if the tables
-+ * are omitted (unlike Huffman tables, which are required
-+ * anyway), one might optimize this behaviour in the future,
-+ * and then it would be disadvantageous to use custom tables if
-+ * they don't provide sufficient gain to exceed the DAC size.
-+ *
-+ * On the other hand, I'd consider it as a reasonable result
-+ * that the conditioning has no significant influence on the
-+ * compression performance. This means that the basic
-+ * statistical model is already rather stable.
-+ *
-+ * Thus, at the moment, we use the default conditioning values
-+ * anyway, and do not use the custom formula.
-+ *
-+#define CALCULATE_SPECTRAL_CONDITIONING
-+ */
-+
-+/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
-+ * We assume that int right shift is unsigned if INT32 right shift is,
-+ * which should be safe.
-+ */
-+
-+#ifdef RIGHT_SHIFT_IS_UNSIGNED
-+#define ISHIFT_TEMPS  int ishift_temp;
-+#define IRIGHT_SHIFT(x,shft)  \
-+      ((ishift_temp = (x)) < 0 ? \
-+       (ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
-+       (ishift_temp >> (shft)))
-+#else
-+#define ISHIFT_TEMPS
-+#define IRIGHT_SHIFT(x,shft)  ((x) >> (shft))
-+#endif
-+
-+
-+LOCAL(void)
-+emit_byte (int val, j_compress_ptr cinfo)
-+/* Write next output byte; we do not support suspension in this module. */
-+{
-+  struct jpeg_destination_mgr * dest = cinfo->dest;
-+
-+  *dest->next_output_byte++ = (JOCTET) val;
-+  if (--dest->free_in_buffer == 0)
-+    if (! (*dest->empty_output_buffer) (cinfo))
-+      ERREXIT(cinfo, JERR_CANT_SUSPEND);
-+}
-+
-+
-+/*
-+ * Finish up at the end of an arithmetic-compressed scan.
-+ */
-+
-+METHODDEF(void)
-+finish_pass (j_compress_ptr cinfo)
-+{
-+  arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
-+  INT32 temp;
-+
-+  /* Section D.1.8: Termination of encoding */
-+
-+  /* Find the e->c in the coding interval with the largest
-+   * number of trailing zero bits */
-+  if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)
-+    e->c = temp + 0x8000L;
-+  else
-+    e->c = temp;
-+  /* Send remaining bytes to output */
-+  e->c <<= e->ct;
-+  if (e->c & 0xF8000000L) {
-+    /* One final overflow has to be handled */
-+    if (e->buffer >= 0) {
-+      if (e->zc)
-+      do emit_byte(0x00, cinfo);
-+      while (--e->zc);
-+      emit_byte(e->buffer + 1, cinfo);
-+      if (e->buffer + 1 == 0xFF)
-+      emit_byte(0x00, cinfo);
-+    }
-+    e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
-+    e->sc = 0;
-+  } else {
-+    if (e->buffer == 0)
-+      ++e->zc;
-+    else if (e->buffer >= 0) {
-+      if (e->zc)
-+      do emit_byte(0x00, cinfo);
-+      while (--e->zc);
-+      emit_byte(e->buffer, cinfo);
-+    }
-+    if (e->sc) {
-+      if (e->zc)
-+      do emit_byte(0x00, cinfo);
-+      while (--e->zc);
-+      do {
-+      emit_byte(0xFF, cinfo);
-+      emit_byte(0x00, cinfo);
-+      } while (--e->sc);
-+    }
-+  }
-+  /* Output final bytes only if they are not 0x00 */
-+  if (e->c & 0x7FFF800L) {
-+    if (e->zc)  /* output final pending zero bytes */
-+      do emit_byte(0x00, cinfo);
-+      while (--e->zc);
-+    emit_byte((e->c >> 19) & 0xFF, cinfo);
-+    if (((e->c >> 19) & 0xFF) == 0xFF)
-+      emit_byte(0x00, cinfo);
-+    if (e->c & 0x7F800L) {
-+      emit_byte((e->c >> 11) & 0xFF, cinfo);
-+      if (((e->c >> 11) & 0xFF) == 0xFF)
-+      emit_byte(0x00, cinfo);
-+    }
-+  }
-+}
-+
-+
-+/*
-+ * The core arithmetic encoding routine (common in JPEG and JBIG).
-+ * This needs to go as fast as possible.
-+ * Machine-dependent optimization facilities
-+ * are not utilized in this portable implementation.
-+ * However, this code should be fairly efficient and
-+ * may be a good base for further optimizations anyway.
-+ *
-+ * Parameter 'val' to be encoded may be 0 or 1 (binary decision).
-+ *
-+ * Note: I've added full "Pacman" termination support to the
-+ * byte output routines, which is equivalent to the optional
-+ * Discard_final_zeros procedure (Figure D.15) in the spec.
-+ * Thus, we always produce the shortest possible output
-+ * stream compliant to the spec (no trailing zero bytes,
-+ * except for FF stuffing).
-+ *
-+ * I've also introduced a new scheme for accessing
-+ * the probability estimation state machine table,
-+ * derived from Markus Kuhn's JBIG implementation.
-+ */
-+
-+LOCAL(void)
-+arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) 
-+{
-+  extern const INT32 jaritab[];
-+  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
-+  register unsigned char nl, nm;
-+  register INT32 qe, temp;
-+  register int sv;
-+
-+  /* Fetch values from our compact representation of Table D.2:
-+   * Qe values and probability estimation state machine
-+   */
-+  sv = *st;
-+  qe = jaritab[sv & 0x7F];    /* => Qe_Value */
-+  nl = qe & 0xFF; qe >>= 8;   /* Next_Index_LPS + Switch_MPS */
-+  nm = qe & 0xFF; qe >>= 8;   /* Next_Index_MPS */
-+
-+  /* Encode & estimation procedures per sections D.1.4 & D.1.5 */
-+  e->a -= qe;
-+  if (val != (sv >> 7)) {
-+    /* Encode the less probable symbol */
-+    if (e->a >= qe) {
-+      /* If the interval size (qe) for the less probable symbol (LPS)
-+       * is larger than the interval size for the MPS, then exchange
-+       * the two symbols for coding efficiency, otherwise code the LPS
-+       * as usual: */
-+      e->c += e->a;
-+      e->a = qe;
-+    }
-+    *st = (sv & 0x80) ^ nl;   /* Estimate_after_LPS */
-+  } else {
-+    /* Encode the more probable symbol */
-+    if (e->a >= 0x8000L)
-+      return;  /* A >= 0x8000 -> ready, no renormalization required */
-+    if (e->a < qe) {
-+      /* If the interval size (qe) for the less probable symbol (LPS)
-+       * is larger than the interval size for the MPS, then exchange
-+       * the two symbols for coding efficiency: */
-+      e->c += e->a;
-+      e->a = qe;
-+    }
-+    *st = (sv & 0x80) ^ nm;   /* Estimate_after_MPS */
-+  }
-+
-+  /* Renormalization & data output per section D.1.6 */
-+  do {
-+    e->a <<= 1;
-+    e->c <<= 1;
-+    if (--e->ct == 0) {
-+      /* Another byte is ready for output */
-+      temp = e->c >> 19;
-+      if (temp > 0xFF) {
-+      /* Handle overflow over all stacked 0xFF bytes */
-+      if (e->buffer >= 0) {
-+        if (e->zc)
-+          do emit_byte(0x00, cinfo);
-+          while (--e->zc);
-+        emit_byte(e->buffer + 1, cinfo);
-+        if (e->buffer + 1 == 0xFF)
-+          emit_byte(0x00, cinfo);
-+      }
-+      e->zc += e->sc;  /* carry-over converts stacked 0xFF bytes to 0x00 */
-+      e->sc = 0;
-+      /* Note: The 3 spacer bits in the C register guarantee
-+       * that the new buffer byte can't be 0xFF here
-+       * (see page 160 in the P&M JPEG book). */
-+      e->buffer = temp & 0xFF;  /* new output byte, might overflow later */
-+      } else if (temp == 0xFF) {
-+      ++e->sc;  /* stack 0xFF byte (which might overflow later) */
-+      } else {
-+      /* Output all stacked 0xFF bytes, they will not overflow any more */
-+      if (e->buffer == 0)
-+        ++e->zc;
-+      else if (e->buffer >= 0) {
-+        if (e->zc)
-+          do emit_byte(0x00, cinfo);
-+          while (--e->zc);
-+        emit_byte(e->buffer, cinfo);
-+      }
-+      if (e->sc) {
-+        if (e->zc)
-+          do emit_byte(0x00, cinfo);
-+          while (--e->zc);
-+        do {
-+          emit_byte(0xFF, cinfo);
-+          emit_byte(0x00, cinfo);
-+        } while (--e->sc);
-+      }
-+      e->buffer = temp & 0xFF;  /* new output byte (can still overflow) */
-+      }
-+      e->c &= 0x7FFFFL;
-+      e->ct += 8;
-+    }
-+  } while (e->a < 0x8000L);
-+}
-+
-+
-+/*
-+ * Emit a restart marker & resynchronize predictions.
-+ */
-+
-+LOCAL(void)
-+emit_restart (j_compress_ptr cinfo, int restart_num)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  int ci;
-+  jpeg_component_info * compptr;
-+
-+  finish_pass(cinfo);
-+
-+  emit_byte(0xFF, cinfo);
-+  emit_byte(JPEG_RST0 + restart_num, cinfo);
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Re-initialize statistics areas */
-+    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
-+      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
-+      /* Reset DC predictions to 0 */
-+      entropy->last_dc_val[ci] = 0;
-+      entropy->dc_context[ci] = 0;
-+    }
-+    if (cinfo->progressive_mode == 0 || cinfo->Ss) {
-+      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
-+    }
-+  }
-+
-+  /* Reset arithmetic encoding variables */
-+  entropy->c = 0;
-+  entropy->a = 0x10000L;
-+  entropy->sc = 0;
-+  entropy->zc = 0;
-+  entropy->ct = 11;
-+  entropy->buffer = -1;  /* empty */
-+}
-+
-+
-+/*
-+ * MCU encoding for DC initial scan (either spectral selection,
-+ * or first pass of successive approximation).
-+ */
-+
-+METHODDEF(boolean)
-+encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int blkn, ci, tbl;
-+  int v, v2, m;
-+  ISHIFT_TEMPS
-+
-+  /* Emit restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0) {
-+      emit_restart(cinfo, entropy->next_restart_num);
-+      entropy->restarts_to_go = cinfo->restart_interval;
-+      entropy->next_restart_num++;
-+      entropy->next_restart_num &= 7;
-+    }
-+    entropy->restarts_to_go--;
-+  }
-+
-+  /* Encode the MCU data blocks */
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    block = MCU_data[blkn];
-+    ci = cinfo->MCU_membership[blkn];
-+    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
-+
-+    /* Compute the DC value after the required point transform by Al.
-+     * This is simply an arithmetic right shift.
-+     */
-+    m = IRIGHT_SHIFT((int) ((*block)[0]), cinfo->Al);
-+
-+    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
-+
-+    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
-+    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
-+
-+    /* Figure F.4: Encode_DC_DIFF */
-+    if ((v = m - entropy->last_dc_val[ci]) == 0) {
-+      arith_encode(cinfo, st, 0);
-+      entropy->dc_context[ci] = 0;    /* zero diff category */
-+    } else {
-+      entropy->last_dc_val[ci] = m;
-+      arith_encode(cinfo, st, 1);
-+      /* Figure F.6: Encoding nonzero value v */
-+      /* Figure F.7: Encoding the sign of v */
-+      if (v > 0) {
-+      arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
-+      st += 2;                        /* Table F.4: SP = S0 + 2 */
-+      entropy->dc_context[ci] = 4;    /* small positive diff category */
-+      } else {
-+      v = -v;
-+      arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
-+      st += 3;                        /* Table F.4: SN = S0 + 3 */
-+      entropy->dc_context[ci] = 8;    /* small negative diff category */
-+      }
-+      /* Figure F.8: Encoding the magnitude category of v */
-+      m = 0;
-+      if (v -= 1) {
-+      arith_encode(cinfo, st, 1);
-+      m = 1;
-+      v2 = v;
-+      st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
-+      while (v2 >>= 1) {
-+        arith_encode(cinfo, st, 1);
-+        m <<= 1;
-+        st += 1;
-+      }
-+      }
-+      arith_encode(cinfo, st, 0);
-+      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
-+      if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;    /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
-+      entropy->dc_context[ci] += 8;   /* large diff category */
-+      /* Figure F.9: Encoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      arith_encode(cinfo, st, (m & v) ? 1 : 0);
-+    }
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU encoding for AC initial scan (either spectral selection,
-+ * or first pass of successive approximation).
-+ */
-+
-+METHODDEF(boolean)
-+encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int tbl, k, ke;
-+  int v, v2, m;
-+
-+  /* Emit restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0) {
-+      emit_restart(cinfo, entropy->next_restart_num);
-+      entropy->restarts_to_go = cinfo->restart_interval;
-+      entropy->next_restart_num++;
-+      entropy->next_restart_num &= 7;
-+    }
-+    entropy->restarts_to_go--;
-+  }
-+
-+  /* Encode the MCU data block */
-+  block = MCU_data[0];
-+  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
-+
-+  /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
-+
-+  /* Establish EOB (end-of-block) index */
-+  for (ke = cinfo->Se + 1; ke > 1; ke--)
-+    /* We must apply the point transform by Al.  For AC coefficients this
-+     * is an integer division with rounding towards 0.  To do this portably
-+     * in C, we shift after obtaining the absolute value.
-+     */
-+    if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {
-+      if (v >>= cinfo->Al) break;
-+    } else {
-+      v = -v;
-+      if (v >>= cinfo->Al) break;
-+    }
-+
-+  /* Figure F.5: Encode_AC_Coefficients */
-+  for (k = cinfo->Ss; k < ke; k++) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    arith_encode(cinfo, st, 0);               /* EOB decision */
-+    entropy->ac_stats[tbl][245] = 0;
-+    for (;;) {
-+      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
-+      if (v >>= cinfo->Al) {
-+        arith_encode(cinfo, st + 1, 1);
-+        arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
-+        break;
-+      }
-+      } else {
-+      v = -v;
-+      if (v >>= cinfo->Al) {
-+        arith_encode(cinfo, st + 1, 1);
-+        arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
-+        break;
-+      }
-+      }
-+      arith_encode(cinfo, st + 1, 0); st += 3; k++;
-+    }
-+    st += 2;
-+    /* Figure F.8: Encoding the magnitude category of v */
-+    m = 0;
-+    if (v -= 1) {
-+      arith_encode(cinfo, st, 1);
-+      m = 1;
-+      v2 = v;
-+      if (v2 >>= 1) {
-+      arith_encode(cinfo, st, 1);
-+      m <<= 1;
-+      st = entropy->ac_stats[tbl] +
-+           (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
-+      while (v2 >>= 1) {
-+        arith_encode(cinfo, st, 1);
-+        m <<= 1;
-+        st += 1;
-+      }
-+      }
-+    }
-+    arith_encode(cinfo, st, 0);
-+    /* Figure F.9: Encoding the magnitude bit pattern of v */
-+    st += 14;
-+    while (m >>= 1)
-+      arith_encode(cinfo, st, (m & v) ? 1 : 0);
-+  }
-+  /* Encode EOB decision only if k <= cinfo->Se */
-+  if (k <= cinfo->Se) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    arith_encode(cinfo, st, 1);
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU encoding for DC successive approximation refinement scan.
-+ */
-+
-+METHODDEF(boolean)
-+encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  unsigned char st[4];
-+  int Al, blkn;
-+
-+  /* Emit restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0) {
-+      emit_restart(cinfo, entropy->next_restart_num);
-+      entropy->restarts_to_go = cinfo->restart_interval;
-+      entropy->next_restart_num++;
-+      entropy->next_restart_num &= 7;
-+    }
-+    entropy->restarts_to_go--;
-+  }
-+
-+  Al = cinfo->Al;
-+
-+  /* Encode the MCU data blocks */
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    st[0] = 0;        /* use fixed probability estimation */
-+    /* We simply emit the Al'th bit of the DC coefficient value. */
-+    arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU encoding for AC successive approximation refinement scan.
-+ */
-+
-+METHODDEF(boolean)
-+encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int tbl, k, ke, kex;
-+  int v;
-+
-+  /* Emit restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0) {
-+      emit_restart(cinfo, entropy->next_restart_num);
-+      entropy->restarts_to_go = cinfo->restart_interval;
-+      entropy->next_restart_num++;
-+      entropy->next_restart_num &= 7;
-+    }
-+    entropy->restarts_to_go--;
-+  }
-+
-+  /* Encode the MCU data block */
-+  block = MCU_data[0];
-+  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
-+
-+  /* Section G.1.3.3: Encoding of AC coefficients */
-+
-+  /* Establish EOB (end-of-block) index */
-+  for (ke = cinfo->Se + 1; ke > 1; ke--)
-+    /* We must apply the point transform by Al.  For AC coefficients this
-+     * is an integer division with rounding towards 0.  To do this portably
-+     * in C, we shift after obtaining the absolute value.
-+     */
-+    if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) {
-+      if (v >>= cinfo->Al) break;
-+    } else {
-+      v = -v;
-+      if (v >>= cinfo->Al) break;
-+    }
-+
-+  /* Establish EOBx (previous stage end-of-block) index */
-+  for (kex = ke; kex > 1; kex--)
-+    if ((v = (*block)[jpeg_natural_order[kex - 1]]) >= 0) {
-+      if (v >>= cinfo->Ah) break;
-+    } else {
-+      v = -v;
-+      if (v >>= cinfo->Ah) break;
-+    }
-+
-+  /* Figure G.10: Encode_AC_Coefficients_SA */
-+  for (k = cinfo->Ss; k < ke; k++) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    if (k >= kex)
-+      arith_encode(cinfo, st, 0);     /* EOB decision */
-+    entropy->ac_stats[tbl][245] = 0;
-+    for (;;) {
-+      if ((v = (*block)[jpeg_natural_order[k]]) >= 0) {
-+      if (v >>= cinfo->Al) {
-+        if (v >> 1)           /* previously nonzero coef */
-+          arith_encode(cinfo, st + 2, (v & 1));
-+        else {                /* newly nonzero coef */
-+          arith_encode(cinfo, st + 1, 1);
-+          arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
-+        }
-+        break;
-+      }
-+      } else {
-+      v = -v;
-+      if (v >>= cinfo->Al) {
-+        if (v >> 1)           /* previously nonzero coef */
-+          arith_encode(cinfo, st + 2, (v & 1));
-+        else {                /* newly nonzero coef */
-+          arith_encode(cinfo, st + 1, 1);
-+          arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
-+        }
-+        break;
-+      }
-+      }
-+      arith_encode(cinfo, st + 1, 0); st += 3; k++;
-+    }
-+  }
-+  /* Encode EOB decision only if k <= cinfo->Se */
-+  if (k <= cinfo->Se) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    arith_encode(cinfo, st, 1);
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * Encode and output one MCU's worth of arithmetic-compressed coefficients.
-+ */
-+
-+METHODDEF(boolean)
-+encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  jpeg_component_info * compptr;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int blkn, ci, tbl, k, ke;
-+  int v, v2, m;
-+
-+  /* Emit restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0) {
-+      emit_restart(cinfo, entropy->next_restart_num);
-+      entropy->restarts_to_go = cinfo->restart_interval;
-+      entropy->next_restart_num++;
-+      entropy->next_restart_num &= 7;
-+    }
-+    entropy->restarts_to_go--;
-+  }
-+
-+  /* Encode the MCU data blocks */
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    block = MCU_data[blkn];
-+    ci = cinfo->MCU_membership[blkn];
-+    compptr = cinfo->cur_comp_info[ci];
-+
-+    /* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
-+
-+    tbl = compptr->dc_tbl_no;
-+
-+    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
-+    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
-+
-+    /* Figure F.4: Encode_DC_DIFF */
-+    if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
-+      arith_encode(cinfo, st, 0);
-+      entropy->dc_context[ci] = 0;    /* zero diff category */
-+    } else {
-+      entropy->last_dc_val[ci] = (*block)[0];
-+      arith_encode(cinfo, st, 1);
-+      /* Figure F.6: Encoding nonzero value v */
-+      /* Figure F.7: Encoding the sign of v */
-+      if (v > 0) {
-+      arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
-+      st += 2;                        /* Table F.4: SP = S0 + 2 */
-+      entropy->dc_context[ci] = 4;    /* small positive diff category */
-+      } else {
-+      v = -v;
-+      arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
-+      st += 3;                        /* Table F.4: SN = S0 + 3 */
-+      entropy->dc_context[ci] = 8;    /* small negative diff category */
-+      }
-+      /* Figure F.8: Encoding the magnitude category of v */
-+      m = 0;
-+      if (v -= 1) {
-+      arith_encode(cinfo, st, 1);
-+      m = 1;
-+      v2 = v;
-+      st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
-+      while (v2 >>= 1) {
-+        arith_encode(cinfo, st, 1);
-+        m <<= 1;
-+        st += 1;
-+      }
-+      }
-+      arith_encode(cinfo, st, 0);
-+      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
-+      if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;    /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
-+      entropy->dc_context[ci] += 8;   /* large diff category */
-+      /* Figure F.9: Encoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      arith_encode(cinfo, st, (m & v) ? 1 : 0);
-+    }
-+
-+    /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
-+
-+    tbl = compptr->ac_tbl_no;
-+
-+    /* Establish EOB (end-of-block) index */
-+    for (ke = DCTSIZE2; ke > 1; ke--)
-+      if ((*block)[jpeg_natural_order[ke - 1]]) break;
-+
-+    /* Figure F.5: Encode_AC_Coefficients */
-+    for (k = 1; k < ke; k++) {
-+      st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+      arith_encode(cinfo, st, 0);     /* EOB decision */
-+      while ((v = (*block)[jpeg_natural_order[k]]) == 0) {
-+      arith_encode(cinfo, st + 1, 0); st += 3; k++;
-+      }
-+      arith_encode(cinfo, st + 1, 1);
-+      /* Figure F.6: Encoding nonzero value v */
-+      /* Figure F.7: Encoding the sign of v */
-+      entropy->ac_stats[tbl][245] = 0;
-+      if (v > 0) {
-+      arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0);
-+      } else {
-+      v = -v;
-+      arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1);
-+      }
-+      st += 2;
-+      /* Figure F.8: Encoding the magnitude category of v */
-+      m = 0;
-+      if (v -= 1) {
-+      arith_encode(cinfo, st, 1);
-+      m = 1;
-+      v2 = v;
-+      if (v2 >>= 1) {
-+        arith_encode(cinfo, st, 1);
-+        m <<= 1;
-+        st = entropy->ac_stats[tbl] +
-+             (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
-+        while (v2 >>= 1) {
-+          arith_encode(cinfo, st, 1);
-+          m <<= 1;
-+          st += 1;
-+        }
-+      }
-+      }
-+      arith_encode(cinfo, st, 0);
-+      /* Figure F.9: Encoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      arith_encode(cinfo, st, (m & v) ? 1 : 0);
-+    }
-+    /* Encode EOB decision only if k < DCTSIZE2 */
-+    if (k < DCTSIZE2) {
-+      st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+      arith_encode(cinfo, st, 1);
-+    }
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * Initialize for an arithmetic-compressed scan.
-+ */
-+
-+METHODDEF(void)
-+start_pass (j_compress_ptr cinfo, boolean gather_statistics)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  int ci, tbl;
-+  jpeg_component_info * compptr;
-+
-+  if (gather_statistics)
-+    /* Make sure to avoid that in the master control logic!
-+     * We are fully adaptive here and need no extra
-+     * statistics gathering pass!
-+     */
-+    ERREXIT(cinfo, JERR_NOT_COMPILED);
-+
-+  /* We assume jcmaster.c already validated the progressive scan parameters. */
-+
-+  /* Select execution routines */
-+  if (cinfo->progressive_mode) {
-+    if (cinfo->Ah == 0) {
-+      if (cinfo->Ss == 0)
-+      entropy->pub.encode_mcu = encode_mcu_DC_first;
-+      else
-+      entropy->pub.encode_mcu = encode_mcu_AC_first;
-+    } else {
-+      if (cinfo->Ss == 0)
-+      entropy->pub.encode_mcu = encode_mcu_DC_refine;
-+      else
-+      entropy->pub.encode_mcu = encode_mcu_AC_refine;
-+    }
-+  } else
-+    entropy->pub.encode_mcu = encode_mcu;
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Allocate & initialize requested statistics areas */
-+    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
-+      tbl = compptr->dc_tbl_no;
-+      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
-+      ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
-+      if (entropy->dc_stats[tbl] == NULL)
-+      entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
-+        ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
-+      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
-+      /* Initialize DC predictions to 0 */
-+      entropy->last_dc_val[ci] = 0;
-+      entropy->dc_context[ci] = 0;
-+    }
-+    if (cinfo->progressive_mode == 0 || cinfo->Ss) {
-+      tbl = compptr->ac_tbl_no;
-+      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
-+      ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
-+      if (entropy->ac_stats[tbl] == NULL)
-+      entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
-+        ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
-+      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
-+#ifdef CALCULATE_SPECTRAL_CONDITIONING
-+      if (cinfo->progressive_mode)
-+      /* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
-+      cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
-+#endif
-+    }
-+  }
-+
-+  /* Initialize arithmetic encoding variables */
-+  entropy->c = 0;
-+  entropy->a = 0x10000L;
-+  entropy->sc = 0;
-+  entropy->zc = 0;
-+  entropy->ct = 11;
-+  entropy->buffer = -1;  /* empty */
-+
-+  /* Initialize restart stuff */
-+  entropy->restarts_to_go = cinfo->restart_interval;
-+  entropy->next_restart_num = 0;
-+}
-+
-+
-+/*
-+ * Module initialization routine for arithmetic entropy encoding.
-+ */
-+
-+GLOBAL(void)
-+jinit_arith_encoder (j_compress_ptr cinfo)
-+{
-+  arith_entropy_ptr entropy;
-+  int i;
-+
-+  entropy = (arith_entropy_ptr)
-+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-+                              SIZEOF(arith_entropy_encoder));
-+  cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
-+  entropy->pub.start_pass = start_pass;
-+  entropy->pub.finish_pass = finish_pass;
-+
-+  /* Mark tables unallocated */
-+  for (i = 0; i < NUM_ARITH_TBLS; i++) {
-+    entropy->dc_stats[i] = NULL;
-+    entropy->ac_stats[i] = NULL;
-+  }
-+}
-diff -Nur jpeg-6b.orig/jcinit.c jpeg-6b/jcinit.c
---- jpeg-6b.orig/jcinit.c      1997-09-07 22:50:40.000000000 +0200
-+++ jpeg-6b/jcinit.c   1997-10-21 17:50:14.000000000 +0200
-@@ -41,9 +41,9 @@
-   /* Forward DCT */
-   jinit_forward_dct(cinfo);
-   /* Entropy encoding: either Huffman or arithmetic coding. */
--  if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
--  } else {
-+  if (cinfo->arith_code)
-+    jinit_arith_encoder(cinfo);
-+  else {
-     if (cinfo->progressive_mode) {
- #ifdef C_PROGRESSIVE_SUPPORTED
-       jinit_phuff_encoder(cinfo);
-diff -Nur jpeg-6b.orig/jcmarker.c jpeg-6b/jcmarker.c
---- jpeg-6b.orig/jcmarker.c    1998-02-21 22:54:00.000000000 +0100
-+++ jpeg-6b/jcmarker.c 1998-02-23 16:15:08.000000000 +0100
-@@ -529,7 +529,10 @@
-   /* Emit the proper SOF marker */
-   if (cinfo->arith_code) {
--    emit_sof(cinfo, M_SOF9);  /* SOF code for arithmetic coding */
-+    if (cinfo->progressive_mode)
-+      emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */
-+    else
-+      emit_sof(cinfo, M_SOF9);  /* SOF code for sequential arithmetic */
-   } else {
-     if (cinfo->progressive_mode)
-       emit_sof(cinfo, M_SOF2);        /* SOF code for progressive Huffman */
-diff -Nur jpeg-6b.orig/jcmaster.c jpeg-6b/jcmaster.c
---- jpeg-6b.orig/jcmaster.c    1997-08-11 01:40:57.000000000 +0200
-+++ jpeg-6b/jcmaster.c 1997-10-21 18:06:05.000000000 +0200
-@@ -433,7 +433,7 @@
-     /* Do Huffman optimization for a scan after the first one. */
-     select_scan_parameters(cinfo);
-     per_scan_setup(cinfo);
--    if (cinfo->Ss != 0 || cinfo->Ah == 0 || cinfo->arith_code) {
-+    if (cinfo->Ss != 0 || cinfo->Ah == 0) {
-       (*cinfo->entropy->start_pass) (cinfo, TRUE);
-       (*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
-       master->pub.call_pass_startup = FALSE;
-@@ -567,7 +567,7 @@
-     cinfo->num_scans = 1;
-   }
--  if (cinfo->progressive_mode)        /*  TEMPORARY HACK ??? */
-+  if (cinfo->progressive_mode && cinfo->arith_code == 0)      /*  TEMPORARY HACK ??? */
-     cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */
-   /* Initialize my private state */
-diff -Nur jpeg-6b.orig/jctrans.c jpeg-6b/jctrans.c
---- jpeg-6b.orig/jctrans.c     1998-02-21 21:03:25.000000000 +0100
-+++ jpeg-6b/jctrans.c  1998-02-23 16:20:16.000000000 +0100
-@@ -167,7 +167,7 @@
-   /* Entropy encoding: either Huffman or arithmetic coding. */
-   if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-+    jinit_arith_encoder(cinfo);
-   } else {
-     if (cinfo->progressive_mode) {
- #ifdef C_PROGRESSIVE_SUPPORTED
-diff -Nur jpeg-6b.orig/jdarith.c jpeg-6b/jdarith.c
---- jpeg-6b.orig/jdarith.c     1970-01-01 01:00:00.000000000 +0100
-+++ jpeg-6b/jdarith.c  1997-08-10 18:40:45.000000000 +0200
-@@ -0,0 +1,762 @@
-+/*
-+ * jdarith.c
-+ *
-+ * Copyright (C) 1997, Guido Vollbeding <guivol@esc.de>.
-+ * This file is NOT part of the Independent JPEG Group's software
-+ * for legal reasons.
-+ * See the accompanying README file for conditions of distribution and use.
-+ *
-+ * This file contains portable arithmetic entropy decoding routines for JPEG
-+ * (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
-+ *
-+ * Both sequential and progressive modes are supported in this single module.
-+ *
-+ * Suspension is not currently supported in this module.
-+ */
-+
-+#define JPEG_INTERNALS
-+#include "jinclude.h"
-+#include "jpeglib.h"
-+
-+
-+/* Expanded entropy decoder object for arithmetic decoding. */
-+
-+typedef struct {
-+  struct jpeg_entropy_decoder pub; /* public fields */
-+
-+  INT32 c;       /* C register, base of coding interval + input bit buffer */
-+  INT32 a;               /* A register, normalized size of coding interval */
-+  int ct;     /* bit shift counter, # of bits left in bit buffer part of C */
-+                                                         /* init: ct = -16 */
-+                                                         /* run: ct = 0..7 */
-+                                                         /* error: ct = -1 */
-+  int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
-+  int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
-+
-+  unsigned int restarts_to_go;        /* MCUs left in this restart interval */
-+
-+  /* Pointers to statistics areas (these workspaces have image lifespan) */
-+  unsigned char * dc_stats[NUM_ARITH_TBLS];
-+  unsigned char * ac_stats[NUM_ARITH_TBLS];
-+} arith_entropy_decoder;
-+
-+typedef arith_entropy_decoder * arith_entropy_ptr;
-+
-+/* The following two definitions specify the allocation chunk size
-+ * for the statistics area.
-+ * According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
-+ * 49 statistics bins for DC, and 245 statistics bins for AC coding.
-+ * Note that we use one additional AC bin for codings with fixed
-+ * probability (0.5), thus the minimum number for AC is 246.
-+ *
-+ * We use a compact representation with 1 byte per statistics bin,
-+ * thus the numbers directly represent byte sizes.
-+ * This 1 byte per statistics bin contains the meaning of the MPS
-+ * (more probable symbol) in the highest bit (mask 0x80), and the
-+ * index into the probability estimation state machine table
-+ * in the lower bits (mask 0x7F).
-+ */
-+
-+#define DC_STAT_BINS 64
-+#define AC_STAT_BINS 256
-+
-+
-+LOCAL(int)
-+get_byte (j_decompress_ptr cinfo)
-+/* Read next input byte; we do not support suspension in this module. */
-+{
-+  struct jpeg_source_mgr * src = cinfo->src;
-+
-+  if (src->bytes_in_buffer == 0)
-+    if (! (*src->fill_input_buffer) (cinfo))
-+      ERREXIT(cinfo, JERR_CANT_SUSPEND);
-+  src->bytes_in_buffer--;
-+  return GETJOCTET(*src->next_input_byte++);
-+}
-+
-+
-+/*
-+ * The core arithmetic decoding routine (common in JPEG and JBIG).
-+ * This needs to go as fast as possible.
-+ * Machine-dependent optimization facilities
-+ * are not utilized in this portable implementation.
-+ * However, this code should be fairly efficient and
-+ * may be a good base for further optimizations anyway.
-+ *
-+ * Return value is 0 or 1 (binary decision).
-+ *
-+ * Note: I've changed the handling of the code base & bit
-+ * buffer register C compared to other implementations
-+ * based on the standards layout & procedures.
-+ * While it also contains both the actual base of the
-+ * coding interval (16 bits) and the next-bits buffer,
-+ * the cut-point between these two parts is floating
-+ * (instead of fixed) with the bit shift counter CT.
-+ * Thus, we also need only one (variable instead of
-+ * fixed size) shift for the LPS/MPS decision, and
-+ * we can get away with any renormalization update
-+ * of C (except for new data insertion, of course).
-+ *
-+ * I've also introduced a new scheme for accessing
-+ * the probability estimation state machine table,
-+ * derived from Markus Kuhn's JBIG implementation.
-+ */
-+
-+LOCAL(int)
-+arith_decode (j_decompress_ptr cinfo, unsigned char *st)
-+{
-+  extern const INT32 jaritab[];
-+  register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
-+  register unsigned char nl, nm;
-+  register INT32 qe, temp;
-+  register int sv, data;
-+
-+  /* Renormalization & data input per section D.2.6 */
-+  while (e->a < 0x8000L) {
-+    if (--e->ct < 0) {
-+      /* Need to fetch next data byte */
-+      if (cinfo->unread_marker)
-+      data = 0;               /* stuff zero data */
-+      else {
-+      data = get_byte(cinfo); /* read next input byte */
-+      if (data == 0xFF) {     /* zero stuff or marker code */
-+        do data = get_byte(cinfo);
-+        while (data == 0xFF); /* swallow extra 0xFF bytes */
-+        if (data == 0)
-+          data = 0xFF;        /* discard stuffed zero byte */
-+        else {
-+          /* Note: Different from the Huffman decoder, hitting
-+           * a marker while processing the compressed data
-+           * segment is legal in arithmetic coding.
-+           * The convention is to supply zero data
-+           * then until decoding is complete.
-+           */
-+          cinfo->unread_marker = data;
-+          data = 0;
-+        }
-+      }
-+      }
-+      e->c = (e->c << 8) | data; /* insert data into C register */
-+      if ((e->ct += 8) < 0)    /* update bit shift counter */
-+      /* Need more initial bytes */
-+      if (++e->ct == 0)
-+        /* Got 2 initial bytes -> re-init A and exit loop */
-+        e->a = 0x8000L; /* => e->a = 0x10000L after loop exit */
-+    }
-+    e->a <<= 1;
-+  }
-+
-+  /* Fetch values from our compact representation of Table D.2:
-+   * Qe values and probability estimation state machine
-+   */
-+  sv = *st;
-+  qe = jaritab[sv & 0x7F];    /* => Qe_Value */
-+  nl = qe & 0xFF; qe >>= 8;   /* Next_Index_LPS + Switch_MPS */
-+  nm = qe & 0xFF; qe >>= 8;   /* Next_Index_MPS */
-+
-+  /* Decode & estimation procedures per sections D.2.4 & D.2.5 */
-+  temp = e->a - qe;
-+  e->a = temp;
-+  temp <<= e->ct;
-+  if (e->c >= temp) {
-+    e->c -= temp;
-+    /* Conditional LPS (less probable symbol) exchange */
-+    if (e->a < qe) {
-+      e->a = qe;
-+      *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
-+    } else {
-+      e->a = qe;
-+      *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
-+      sv ^= 0x80;             /* Exchange LPS/MPS */
-+    }
-+  } else if (e->a < 0x8000L) {
-+    /* Conditional MPS (more probable symbol) exchange */
-+    if (e->a < qe) {
-+      *st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
-+      sv ^= 0x80;             /* Exchange LPS/MPS */
-+    } else {
-+      *st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
-+    }
-+  }
-+
-+  return sv >> 7;
-+}
-+
-+
-+/*
-+ * Check for a restart marker & resynchronize decoder.
-+ */
-+
-+LOCAL(void)
-+process_restart (j_decompress_ptr cinfo)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  int ci;
-+  jpeg_component_info * compptr;
-+
-+  /* Advance past the RSTn marker */
-+  if (! (*cinfo->marker->read_restart_marker) (cinfo))
-+    ERREXIT(cinfo, JERR_CANT_SUSPEND);
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Re-initialize statistics areas */
-+    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
-+      MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
-+      /* Reset DC predictions to 0 */
-+      entropy->last_dc_val[ci] = 0;
-+      entropy->dc_context[ci] = 0;
-+    }
-+    if (cinfo->progressive_mode == 0 || cinfo->Ss) {
-+      MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
-+    }
-+  }
-+
-+  /* Reset arithmetic decoding variables */
-+  entropy->c = 0;
-+  entropy->a = 0;
-+  entropy->ct = -16;  /* force reading 2 initial bytes to fill C */
-+
-+  /* Reset restart counter */
-+  entropy->restarts_to_go = cinfo->restart_interval;
-+}
-+
-+
-+/*
-+ * Arithmetic MCU decoding.
-+ * Each of these routines decodes and returns one MCU's worth of
-+ * arithmetic-compressed coefficients.
-+ * The coefficients are reordered from zigzag order into natural array order,
-+ * but are not dequantized.
-+ *
-+ * The i'th block of the MCU is stored into the block pointed to by
-+ * MCU_data[i].  WE ASSUME THIS AREA IS INITIALLY ZEROED BY THE CALLER.
-+ */
-+
-+/*
-+ * MCU decoding for DC initial scan (either spectral selection,
-+ * or first pass of successive approximation).
-+ */
-+
-+METHODDEF(boolean)
-+decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int blkn, ci, tbl, sign;
-+  int v, m;
-+
-+  /* Process restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0)
-+      process_restart(cinfo);
-+    entropy->restarts_to_go--;
-+  }
-+
-+  if (entropy->ct == -1) return TRUE; /* if error do nothing */
-+
-+  /* Outer loop handles each block in the MCU */
-+
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    block = MCU_data[blkn];
-+    ci = cinfo->MCU_membership[blkn];
-+    tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
-+
-+    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
-+
-+    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
-+    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
-+
-+    /* Figure F.19: Decode_DC_DIFF */
-+    if (arith_decode(cinfo, st) == 0)
-+      entropy->dc_context[ci] = 0;
-+    else {
-+      /* Figure F.21: Decoding nonzero value v */
-+      /* Figure F.22: Decoding the sign of v */
-+      sign = arith_decode(cinfo, st + 1);
-+      st += 2; st += sign;
-+      /* Figure F.23: Decoding the magnitude category of v */
-+      if ((m = arith_decode(cinfo, st)) != 0) {
-+      st = entropy->dc_stats[tbl] + 20;       /* Table F.4: X1 = 20 */
-+      while (arith_decode(cinfo, st)) {
-+        if ((m <<= 1) == 0x8000) {
-+          WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+          entropy->ct = -1;                   /* magnitude overflow */
-+          return TRUE;
-+        }
-+        st += 1;
-+      }
-+      }
-+      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
-+      if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;               /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
-+      entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
-+      else
-+      entropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */
-+      v = m;
-+      /* Figure F.24: Decoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      if (arith_decode(cinfo, st)) v |= m;
-+      v += 1; if (sign) v = -v;
-+      entropy->last_dc_val[ci] += v;
-+    }
-+
-+    /* Scale and output the DC coefficient (assumes jpeg_natural_order[0]=0) */
-+    (*block)[0] = (JCOEF) (entropy->last_dc_val[ci] << cinfo->Al);
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU decoding for AC initial scan (either spectral selection,
-+ * or first pass of successive approximation).
-+ */
-+
-+METHODDEF(boolean)
-+decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int tbl, sign, k;
-+  int v, m;
-+
-+  /* Process restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0)
-+      process_restart(cinfo);
-+    entropy->restarts_to_go--;
-+  }
-+
-+  if (entropy->ct == -1) return TRUE; /* if error do nothing */
-+
-+  /* There is always only one block per MCU */
-+  block = MCU_data[0];
-+  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
-+
-+  /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
-+
-+  /* Figure F.20: Decode_AC_coefficients */
-+  for (k = cinfo->Ss; k <= cinfo->Se; k++) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    if (arith_decode(cinfo, st)) break;               /* EOB flag */
-+    while (arith_decode(cinfo, st + 1) == 0) {
-+      st += 3; k++;
-+      if (k > cinfo->Se) {
-+      WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+      entropy->ct = -1;                       /* spectral overflow */
-+      return TRUE;
-+      }
-+    }
-+    /* Figure F.21: Decoding nonzero value v */
-+    /* Figure F.22: Decoding the sign of v */
-+    entropy->ac_stats[tbl][245] = 0;
-+    sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
-+    st += 2;
-+    /* Figure F.23: Decoding the magnitude category of v */
-+    if ((m = arith_decode(cinfo, st)) != 0) {
-+      if (arith_decode(cinfo, st)) {
-+      m <<= 1;
-+      st = entropy->ac_stats[tbl] +
-+           (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
-+      while (arith_decode(cinfo, st)) {
-+        if ((m <<= 1) == 0x8000) {
-+          WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+          entropy->ct = -1;                   /* magnitude overflow */
-+          return TRUE;
-+        }
-+        st += 1;
-+      }
-+      }
-+    }
-+    v = m;
-+    /* Figure F.24: Decoding the magnitude bit pattern of v */
-+    st += 14;
-+    while (m >>= 1)
-+      if (arith_decode(cinfo, st)) v |= m;
-+    v += 1; if (sign) v = -v;
-+    /* Scale and output coefficient in natural (dezigzagged) order */
-+    (*block)[jpeg_natural_order[k]] = (JCOEF) (v << cinfo->Al);
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU decoding for DC successive approximation refinement scan.
-+ */
-+
-+METHODDEF(boolean)
-+decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  unsigned char st[4];
-+  int p1, blkn;
-+
-+  /* Process restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0)
-+      process_restart(cinfo);
-+    entropy->restarts_to_go--;
-+  }
-+
-+  p1 = 1 << cinfo->Al;                /* 1 in the bit position being coded */
-+
-+  /* Outer loop handles each block in the MCU */
-+
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    st[0] = 0;        /* use fixed probability estimation */
-+    /* Encoded data is simply the next bit of the two's-complement DC value */
-+    if (arith_decode(cinfo, st))
-+      MCU_data[blkn][0][0] |= p1;
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * MCU decoding for AC successive approximation refinement scan.
-+ */
-+
-+METHODDEF(boolean)
-+decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  JBLOCKROW block;
-+  JCOEFPTR thiscoef;
-+  unsigned char *st;
-+  int tbl, k, kex;
-+  int p1, m1;
-+
-+  /* Process restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0)
-+      process_restart(cinfo);
-+    entropy->restarts_to_go--;
-+  }
-+
-+  if (entropy->ct == -1) return TRUE; /* if error do nothing */
-+
-+  /* There is always only one block per MCU */
-+  block = MCU_data[0];
-+  tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
-+
-+  p1 = 1 << cinfo->Al;                /* 1 in the bit position being coded */
-+  m1 = (-1) << cinfo->Al;     /* -1 in the bit position being coded */
-+
-+  /* Establish EOBx (previous stage end-of-block) index */
-+  for (kex = cinfo->Se + 1; kex > 1; kex--)
-+    if ((*block)[jpeg_natural_order[kex - 1]]) break;
-+
-+  for (k = cinfo->Ss; k <= cinfo->Se; k++) {
-+    st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+    if (k >= kex)
-+      if (arith_decode(cinfo, st)) break;     /* EOB flag */
-+    for (;;) {
-+      thiscoef = *block + jpeg_natural_order[k];
-+      if (*thiscoef) {                                /* previously nonzero coef */
-+      if (arith_decode(cinfo, st + 2))
-+        if (*thiscoef < 0)
-+          *thiscoef += m1;
-+        else
-+          *thiscoef += p1;
-+      break;
-+      }
-+      if (arith_decode(cinfo, st + 1)) {      /* newly nonzero coef */
-+      entropy->ac_stats[tbl][245] = 0;
-+      if (arith_decode(cinfo, entropy->ac_stats[tbl] + 245))
-+        *thiscoef = m1;
-+      else
-+        *thiscoef = p1;
-+      break;
-+      }
-+      st += 3; k++;
-+      if (k > cinfo->Se) {
-+      WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+      entropy->ct = -1;                       /* spectral overflow */
-+      return TRUE;
-+      }
-+    }
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * Decode one MCU's worth of arithmetic-compressed coefficients.
-+ */
-+
-+METHODDEF(boolean)
-+decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  jpeg_component_info * compptr;
-+  JBLOCKROW block;
-+  unsigned char *st;
-+  int blkn, ci, tbl, sign, k;
-+  int v, m;
-+
-+  /* Process restart marker if needed */
-+  if (cinfo->restart_interval) {
-+    if (entropy->restarts_to_go == 0)
-+      process_restart(cinfo);
-+    entropy->restarts_to_go--;
-+  }
-+
-+  if (entropy->ct == -1) return TRUE; /* if error do nothing */
-+
-+  /* Outer loop handles each block in the MCU */
-+
-+  for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
-+    block = MCU_data[blkn];
-+    ci = cinfo->MCU_membership[blkn];
-+    compptr = cinfo->cur_comp_info[ci];
-+
-+    /* Sections F.2.4.1 & F.1.4.4.1: Decoding of DC coefficients */
-+
-+    tbl = compptr->dc_tbl_no;
-+
-+    /* Table F.4: Point to statistics bin S0 for DC coefficient coding */
-+    st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
-+
-+    /* Figure F.19: Decode_DC_DIFF */
-+    if (arith_decode(cinfo, st) == 0)
-+      entropy->dc_context[ci] = 0;
-+    else {
-+      /* Figure F.21: Decoding nonzero value v */
-+      /* Figure F.22: Decoding the sign of v */
-+      sign = arith_decode(cinfo, st + 1);
-+      st += 2; st += sign;
-+      /* Figure F.23: Decoding the magnitude category of v */
-+      if ((m = arith_decode(cinfo, st)) != 0) {
-+      st = entropy->dc_stats[tbl] + 20;       /* Table F.4: X1 = 20 */
-+      while (arith_decode(cinfo, st)) {
-+        if ((m <<= 1) == 0x8000) {
-+          WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+          entropy->ct = -1;                   /* magnitude overflow */
-+          return TRUE;
-+        }
-+        st += 1;
-+      }
-+      }
-+      /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
-+      if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1))
-+      entropy->dc_context[ci] = 0;               /* zero diff category */
-+      else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1))
-+      entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
-+      else
-+      entropy->dc_context[ci] = 4 + (sign * 4);  /* small diff category */
-+      v = m;
-+      /* Figure F.24: Decoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      if (arith_decode(cinfo, st)) v |= m;
-+      v += 1; if (sign) v = -v;
-+      entropy->last_dc_val[ci] += v;
-+    }
-+
-+    (*block)[0] = (JCOEF) entropy->last_dc_val[ci];
-+
-+    /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
-+
-+    tbl = compptr->ac_tbl_no;
-+
-+    /* Figure F.20: Decode_AC_coefficients */
-+    for (k = 1; k < DCTSIZE2; k++) {
-+      st = entropy->ac_stats[tbl] + 3 * (k - 1);
-+      if (arith_decode(cinfo, st)) break;     /* EOB flag */
-+      while (arith_decode(cinfo, st + 1) == 0) {
-+      st += 3; k++;
-+      if (k >= DCTSIZE2) {
-+        WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+        entropy->ct = -1;                     /* spectral overflow */
-+        return TRUE;
-+      }
-+      }
-+      /* Figure F.21: Decoding nonzero value v */
-+      /* Figure F.22: Decoding the sign of v */
-+      entropy->ac_stats[tbl][245] = 0;
-+      sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
-+      st += 2;
-+      /* Figure F.23: Decoding the magnitude category of v */
-+      if ((m = arith_decode(cinfo, st)) != 0) {
-+      if (arith_decode(cinfo, st)) {
-+        m <<= 1;
-+        st = entropy->ac_stats[tbl] +
-+             (k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
-+        while (arith_decode(cinfo, st)) {
-+          if ((m <<= 1) == 0x8000) {
-+            WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
-+            entropy->ct = -1;                 /* magnitude overflow */
-+            return TRUE;
-+          }
-+          st += 1;
-+        }
-+      }
-+      }
-+      v = m;
-+      /* Figure F.24: Decoding the magnitude bit pattern of v */
-+      st += 14;
-+      while (m >>= 1)
-+      if (arith_decode(cinfo, st)) v |= m;
-+      v += 1; if (sign) v = -v;
-+      (*block)[jpeg_natural_order[k]] = (JCOEF) v;
-+    }
-+  }
-+
-+  return TRUE;
-+}
-+
-+
-+/*
-+ * Initialize for an arithmetic-compressed scan.
-+ */
-+
-+METHODDEF(void)
-+start_pass (j_decompress_ptr cinfo)
-+{
-+  arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
-+  int ci, tbl;
-+  jpeg_component_info * compptr;
-+
-+  if (cinfo->progressive_mode) {
-+    /* Validate progressive scan parameters */
-+    if (cinfo->Ss == 0) {
-+      if (cinfo->Se != 0)
-+      goto bad;
-+    } else {
-+      /* need not check Ss/Se < 0 since they came from unsigned bytes */
-+      if (cinfo->Se < cinfo->Ss || cinfo->Se >= DCTSIZE2)
-+      goto bad;
-+      /* AC scans may have only one component */
-+      if (cinfo->comps_in_scan != 1)
-+      goto bad;
-+    }
-+    if (cinfo->Ah != 0) {
-+      /* Successive approximation refinement scan: must have Al = Ah-1. */
-+      if (cinfo->Ah-1 != cinfo->Al)
-+      goto bad;
-+    }
-+    if (cinfo->Al > 13) {     /* need not check for < 0 */
-+      bad:
-+      ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
-+             cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
-+    }
-+    /* Update progression status, and verify that scan order is legal.
-+     * Note that inter-scan inconsistencies are treated as warnings
-+     * not fatal errors ... not clear if this is right way to behave.
-+     */
-+    for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+      int coefi, cindex = cinfo->cur_comp_info[ci]->component_index;
-+      int *coef_bit_ptr = & cinfo->coef_bits[cindex][0];
-+      if (cinfo->Ss && coef_bit_ptr[0] < 0) /* AC without prior DC scan */
-+      WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, 0);
-+      for (coefi = cinfo->Ss; coefi <= cinfo->Se; coefi++) {
-+      int expected = (coef_bit_ptr[coefi] < 0) ? 0 : coef_bit_ptr[coefi];
-+      if (cinfo->Ah != expected)
-+        WARNMS2(cinfo, JWRN_BOGUS_PROGRESSION, cindex, coefi);
-+      coef_bit_ptr[coefi] = cinfo->Al;
-+      }
-+    }
-+    /* Select MCU decoding routine */
-+    if (cinfo->Ah == 0) {
-+      if (cinfo->Ss == 0)
-+      entropy->pub.decode_mcu = decode_mcu_DC_first;
-+      else
-+      entropy->pub.decode_mcu = decode_mcu_AC_first;
-+    } else {
-+      if (cinfo->Ss == 0)
-+      entropy->pub.decode_mcu = decode_mcu_DC_refine;
-+      else
-+      entropy->pub.decode_mcu = decode_mcu_AC_refine;
-+    }
-+  } else {
-+    /* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG.
-+     * This ought to be an error condition, but we make it a warning because
-+     * there are some baseline files out there with all zeroes in these bytes.
-+     */
-+    if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 ||
-+      cinfo->Ah != 0 || cinfo->Al != 0)
-+      WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
-+    /* Select MCU decoding routine */
-+    entropy->pub.decode_mcu = decode_mcu;
-+  }
-+
-+  for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
-+    compptr = cinfo->cur_comp_info[ci];
-+    /* Allocate & initialize requested statistics areas */
-+    if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
-+      tbl = compptr->dc_tbl_no;
-+      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
-+      ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
-+      if (entropy->dc_stats[tbl] == NULL)
-+      entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
-+        ((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
-+      MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
-+      /* Initialize DC predictions to 0 */
-+      entropy->last_dc_val[ci] = 0;
-+      entropy->dc_context[ci] = 0;
-+    }
-+    if (cinfo->progressive_mode == 0 || cinfo->Ss) {
-+      tbl = compptr->ac_tbl_no;
-+      if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
-+      ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
-+      if (entropy->ac_stats[tbl] == NULL)
-+      entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
-+        ((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
-+      MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
-+    }
-+  }
-+
-+  /* Initialize arithmetic decoding variables */
-+  entropy->c = 0;
-+  entropy->a = 0;
-+  entropy->ct = -16;  /* force reading 2 initial bytes to fill C */
-+
-+  /* Initialize restart counter */
-+  entropy->restarts_to_go = cinfo->restart_interval;
-+}
-+
-+
-+/*
-+ * Module initialization routine for arithmetic entropy decoding.
-+ */
-+
-+GLOBAL(void)
-+jinit_arith_decoder (j_decompress_ptr cinfo)
-+{
-+  arith_entropy_ptr entropy;
-+  int i;
-+
-+  entropy = (arith_entropy_ptr)
-+    (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-+                              SIZEOF(arith_entropy_decoder));
-+  cinfo->entropy = (struct jpeg_entropy_decoder *) entropy;
-+  entropy->pub.start_pass = start_pass;
-+
-+  /* Mark tables unallocated */
-+  for (i = 0; i < NUM_ARITH_TBLS; i++) {
-+    entropy->dc_stats[i] = NULL;
-+    entropy->ac_stats[i] = NULL;
-+  }
-+
-+  if (cinfo->progressive_mode) {
-+    /* Create progression status table */
-+    int *coef_bit_ptr, ci;
-+    cinfo->coef_bits = (int (*)[DCTSIZE2])
-+      (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
-+                                cinfo->num_components*DCTSIZE2*SIZEOF(int));
-+    coef_bit_ptr = & cinfo->coef_bits[0][0];
-+    for (ci = 0; ci < cinfo->num_components; ci++) 
-+      for (i = 0; i < DCTSIZE2; i++)
-+      *coef_bit_ptr++ = -1;
-+  }
-+}
-diff -Nur jpeg-6b.orig/jdmaster.c jpeg-6b/jdmaster.c
---- jpeg-6b.orig/jdmaster.c    1997-11-07 17:25:45.000000000 +0100
-+++ jpeg-6b/jdmaster.c 1998-02-23 16:23:29.000000000 +0100
-@@ -373,7 +373,7 @@
-   jinit_inverse_dct(cinfo);
-   /* Entropy decoding: either Huffman or arithmetic coding. */
-   if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
-+    jinit_arith_decoder(cinfo);
-   } else {
-     if (cinfo->progressive_mode) {
- #ifdef D_PROGRESSIVE_SUPPORTED
-diff -Nur jpeg-6b.orig/jdtrans.c jpeg-6b/jdtrans.c
---- jpeg-6b.orig/jdtrans.c     1997-08-03 23:47:58.000000000 +0200
-+++ jpeg-6b/jdtrans.c  1997-10-21 17:57:05.000000000 +0200
-@@ -100,9 +100,9 @@
-   cinfo->buffered_image = TRUE;
-   /* Entropy decoding: either Huffman or arithmetic coding. */
--  if (cinfo->arith_code) {
--    ERREXIT(cinfo, JERR_ARITH_NOTIMPL);
--  } else {
-+  if (cinfo->arith_code)
-+    jinit_arith_decoder(cinfo);
-+  else {
-     if (cinfo->progressive_mode) {
- #ifdef D_PROGRESSIVE_SUPPORTED
-       jinit_phuff_decoder(cinfo);
-diff -Nur jpeg-6b.orig/jerror.h jpeg-6b/jerror.h
---- jpeg-6b.orig/jerror.h      1997-10-18 20:59:10.000000000 +0200
-+++ jpeg-6b/jerror.h   1997-10-21 18:10:09.000000000 +0200
-@@ -93,6 +93,7 @@
- JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change")
- JMESSAGE(JERR_NOTIMPL, "Not implemented yet")
- JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time")
-+JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined")
- JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported")
- JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined")
- JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image")
-@@ -170,6 +171,7 @@
- JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u")
- JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u")
- JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d")
-+JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code")
- JMESSAGE(JWRN_BOGUS_PROGRESSION,
-        "Inconsistent progression sequence for component %d coefficient %d")
- JMESSAGE(JWRN_EXTRANEOUS_DATA,
-diff -Nur jpeg-6b.orig/jpegint.h jpeg-6b/jpegint.h
---- jpeg-6b.orig/jpegint.h     1997-04-20 01:44:35.000000000 +0200
-+++ jpeg-6b/jpegint.h  1997-10-21 18:14:02.000000000 +0200
-@@ -345,6 +345,7 @@
- EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo));
- EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo));
- EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo));
-+EXTERN(void) jinit_arith_encoder JPP((j_compress_ptr cinfo));
- EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo));
- /* Decompression module initialization routines */
- EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo));
-@@ -358,6 +359,7 @@
- EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo));
-+EXTERN(void) jinit_arith_decoder JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo));
- EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo));
-diff -Nur jpeg-6b.orig/makefile.cfg jpeg-6b/makefile.cfg
---- jpeg-6b.orig/makefile.cfg  1998-03-21 20:08:57.000000000 +0100
-+++ jpeg-6b/makefile.cfg       1998-03-28 22:46:03.000000000 +0100
-@@ -80,7 +80,7 @@
-         jdinput.c jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c \
-         jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c jfdctfst.c \
-         jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c jquant1.c \
--        jquant2.c jutils.c jmemmgr.c
-+        jquant2.c jutils.c jmemmgr.c jaricom.c jcarith.c jdarith.c
- # memmgr back ends: compile only one of these into a working library
- SYSDEPSOURCES= jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c
- # source files: cjpeg/djpeg/jpegtran applications, also rdjpgcom/wrjpgcom
-@@ -110,19 +110,19 @@
- DISTFILES= $(DOCS) $(MKFILES) $(CONFIGFILES) $(SOURCES) $(INCLUDES) \
-         $(CONFIGUREFILES) $(OTHERFILES) $(TESTFILES)
- # library object files common to compression and decompression
--COMOBJECTS= jcomapi.$(O) jutils.$(O) jerror.$(O) jmemmgr.$(O) $(SYSDEPMEM)
-+COMOBJECTS= jcomapi.$(O) jutils.$(O) jerror.$(O) jmemmgr.$(O) jaricom.$(O) $(SYSDEPMEM)
- # compression library object files
- CLIBOBJECTS= jcapimin.$(O) jcapistd.$(O) jctrans.$(O) jcparam.$(O) \
-         jdatadst.$(O) jcinit.$(O) jcmaster.$(O) jcmarker.$(O) jcmainct.$(O) \
-         jcprepct.$(O) jccoefct.$(O) jccolor.$(O) jcsample.$(O) jchuff.$(O) \
-         jcphuff.$(O) jcdctmgr.$(O) jfdctfst.$(O) jfdctflt.$(O) \
--        jfdctint.$(O)
-+        jfdctint.$(O) jcarith.$(O)
- # decompression library object files
- DLIBOBJECTS= jdapimin.$(O) jdapistd.$(O) jdtrans.$(O) jdatasrc.$(O) \
-         jdmaster.$(O) jdinput.$(O) jdmarker.$(O) jdhuff.$(O) jdphuff.$(O) \
-         jdmainct.$(O) jdcoefct.$(O) jdpostct.$(O) jddctmgr.$(O) \
-         jidctfst.$(O) jidctflt.$(O) jidctint.$(O) jidctred.$(O) \
--        jdsample.$(O) jdcolor.$(O) jquant1.$(O) jquant2.$(O) jdmerge.$(O)
-+        jdsample.$(O) jdcolor.$(O) jquant1.$(O) jquant2.$(O) jdmerge.$(O) jdarith.$(O)
- # These objectfiles are included in libjpeg.a
- LIBOBJECTS= $(CLIBOBJECTS) $(DLIBOBJECTS) $(COMOBJECTS)
- # object files for sample applications (excluding library files)
-@@ -317,3 +317,6 @@
- wrbmp.$(O): wrbmp.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
- rdrle.$(O): rdrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
- wrrle.$(O): wrrle.c cdjpeg.h jinclude.h jconfig.h jpeglib.h jmorecfg.h jerror.h cderror.h
-+jcarith.$(O): jcarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
-+jdarith.$(O): jdarith.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
-+jaricom.$(O): jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
---- jpeg-6b/jmorecfg.h.orig    1997-08-10 01:58:56.000000000 +0200
-+++ jpeg-6b/jmorecfg.h 2008-01-27 20:59:01.245915635 +0100
-@@ -266,7 +266,7 @@
- /* Encoder capability options: */
--#undef  C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
-+#define C_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
- #define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
- #define C_PROGRESSIVE_SUPPORTED           /* Progressive JPEG? (Requires MULTISCAN)*/
- #define ENTROPY_OPT_SUPPORTED     /* Optimization of entropy coding parms? */
-@@ -282,7 +282,7 @@
- /* Decoder capability options: */
--#undef  D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
-+#define D_ARITH_CODING_SUPPORTED    /* Arithmetic coding back end? */
- #define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */
- #define D_PROGRESSIVE_SUPPORTED           /* Progressive JPEG? (Requires MULTISCAN)*/
- #define SAVE_MARKERS_SUPPORTED            /* jpeg_save_markers() needed? */
---- jpeg-6b/README.arithmetic.orig     1970-01-01 01:00:00.000000000 +0100
-+++ jpeg-6b/README.arithmetic  2001-04-24 22:15:35.000000000 +0200
-@@ -0,0 +1,215 @@
-+JPEG arithmetic encoding and decoding portable software implementation
-+======================================================================
-+
-+Release of 28-Mar-98 by Guido Vollbeding <guido@jpegclub.org>
-+=============================================================
-+
-+Primary URLs:
-+
-+      http://sylvana.net/jpeg-ari/
-+      (directory containing the actual archive files:)
-+
-+      http://sylvana.net/jpeg-ari/jpeg-ari-28mar98.tar.gz
-+
-+      http://sylvana.net/jpeg-ari/jpeg-ari.zip
-+
-+
-+DISCLAIMER
-+==========
-+
-+This package is distributed in the hope that it will be useful,
-+but WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-+
-+It is possible that certain products which can be built using this
-+software modules might form inventions protected by patent rights in
-+some countries (e.g. by patents about arithmetic coding algorithms
-+owned by IBM and AT&T in the USA). Provision of this software by the
-+author does NOT include any licenses for any patents.
-+In those countries where a patent license is required for certain
-+applications of this software modules, you will have to obtain such
-+a license yourself.
-+
-+See Annex L in the JPEG spec for further information
-+and a list of relevant patents.
-+
-+
-+What is it?
-+===========
-+
-+This is my implementation of the arithmetic encoding and decoding
-+back-end for JPEG as specified in the
-+
-+  ISO/IEC International Standard 10918-1 and CCITT Recommendation
-+  ITU-T T.81, "Information Technology - Digital Compression and
-+  Coding of Continuous-tone Still Images, Part 1: Requirements
-+  and Guidelines".
-+
-+Arithmetic coding is a state-of-the-art lossless entropy data
-+compression method which offers better compression performance
-+than the well-established Huffman entropy coding process.
-+
-+The JPEG standard specifies a particular arithmetic coding scheme
-+to be used optionally as alternative to Huffman coding.
-+
-+
-+Who needs it?
-+=============
-+
-+This package might be of interest for people who are looking for
-+enhanced state-of-the-art image compression technologies.
-+
-+It is intended to provide a reasonable tool for experimental,
-+comparison and evaluation purposes.
-+
-+See the Disclaimer above for restricted conditions of usage.
-+
-+
-+How does it work?
-+=================
-+
-+This distribution is organized as add-on to the widespread
-+Independent JPEG Group's JPEG software.
-+
-+Thus, once you managed to install the IJG software distribution
-+successfully, there should be no additional problems (portability
-+issues etc.) to incorporate this package into the library,
-+and usage is straightforward.
-+
-+Transcode given JPEG files simply with a command like
-+
-+  jpegtran -arithmetic [-progressive] < orig.jpg > arit.jpg
-+
-+into an arithmetic coded version LOSSLESSLY! Since there are
-+practically no applications in existence which can handle such
-+files, you can only transform it back with the same tool
-+
-+  jpegtran [-optimize] [-progressive] < arit.jpg > orig2.jpg
-+
-+to verify correct operation.
-+
-+Thus, you can easily verify the enhanced compression performance
-+of the arithmetic coding version compared to the Huffman (with
-+fixed or custom tables) version.
-+
-+The claim to evaluate was that arithmetic coding gives an average
-+5-10% compression improvement against Huffman.
-+Early tests with this implementation support this claim, and you
-+can perform tests with own material.
-+
-+Here are some actual results:
-+
-+% ./jpegtran -optimize < testorig.jpg > testopt.jpg
-+% ./jpegtran -arithmetic < testorig.jpg > testarit.jpg
-+% ./jpegtran < testarit.jpg > testorig2.jpg
-+% ./jpegtran -arithmetic -progressive < testorig.jpg > testaritp.jpg
-+% ./jpegtran < testaritp.jpg > testorig3.jpg
-+% ./jpegtran -optimize < ../butterfly.jpg > ../buttopt.jpg
-+% ./jpegtran -progressive < ../butterfly.jpg > ../buttprog.jpg
-+% ./jpegtran -arithmetic < ../butterfly.jpg > ../buttarit.jpg
-+% ./jpegtran < ../buttarit.jpg > ../butterfly2.jpg
-+% ./jpegtran -arithmetic -progressive < ../butterfly.jpg > ../buttaritp.jpg
-+% ./jpegtran < ../buttaritp.jpg > ../butterfly3.jpg
-+% ls -l test*.jpg
-+-rw-r--r--  1 guivol       5153 Apr 13 18:51 testarit.jpg
-+-rw-r--r--  1 guivol       5186 Apr 13 18:51 testaritp.jpg
-+-rw-r--r--  1 guivol       5756 Apr  2 15:10 testimg.jpg
-+-rw-r--r--  1 guivol       5645 Apr  2 15:10 testimgp.jpg
-+-rw-r--r--  1 guivol       5463 Apr 13 18:51 testopt.jpg
-+-rw-r--r--  1 guivol       5770 Apr  2 15:10 testorig.jpg
-+-rw-r--r--  1 guivol       5770 Apr 13 18:51 testorig2.jpg
-+-rw-r--r--  1 guivol       5770 Apr 13 18:51 testorig3.jpg
-+-rw-r--r--  1 guivol       5655 Apr  2 15:10 testprog.jpg
-+% ls -l ../butt*.jpg
-+-rw-r--r--  1 guivol     460091 Apr 13 18:52 ../buttarit.jpg
-+-rw-r--r--  1 guivol     453703 Apr 13 18:52 ../buttaritp.jpg
-+-rw-r--r--  1 guivol     527823 Nov 19 18:41 ../butterfly.jpg
-+-rw-r--r--  1 guivol     527823 Apr 13 18:52 ../butterfly2.jpg
-+-rw-r--r--  1 guivol     527823 Apr 13 18:52 ../butterfly3.jpg
-+-rw-r--r--  1 guivol     511834 Apr 13 18:52 ../buttopt.jpg
-+-rw-r--r--  1 guivol     492237 Apr 13 18:52 ../buttprog.jpg
-+% 
-+
-+Note that arithmetic coding requires only a single processing
-+pass due to its fully-adaptive nature, and compared to one-pass
-+(fixed tables) Huffman the arithmetic coded version consistently
-+achieves 10% compression improvement.
-+Compared with two-pass (custom tables) Huffman the improvement
-+is 5-10%.
-+
-+Note that I wasn't able yet to cross-check interoperability of
-+the produced files with other implementations.
-+Thus, I can't be sure that the files are compliant to the spec,
-+but I hope so and the tests support it.
-+The encoding and decoding processes should be correct anyway,
-+however, in the sense that they are complementary to each other
-+and thus retain data integrity.
-+
-+I would appreciate any indications for compliance or interoperability
-+with other implementations from somebody.
-+Please let me know if you are able to cross-check something.
-+
-+
-+Installation
-+============
-+
-+The installation is a 2-stage procedure:
-+
-+1. Preparing the IJG package for potential incorporation
-+   of the arithmetic coding feature.
-+
-+2. Incorporation of the actual arithmetic coding modules
-+   and enabling the feature for usage.
-+
-+The reason for this 2-stage process is the hope to make
-+step 1 obsolete in future IJG releases.
-+The actual implementation should remain separate IMHO due
-+to the different usage conditions.
-+
-+Step 1:
-+
-+1.1. Copy all files from the subdirectory 'patchv6b' into
-+     the IJG software's v6b source directory.
-+     This includes minor patches to some files and 3 extra
-+     files which hold place for the actual implementation.
-+
-+1.2. Update your Makefile/Projectfile for the inclusion of
-+     the 3 extra files. This will be done automatically
-+     if you use a configure-generated makefile and type
-+     './configure' (reconfigure).
-+
-+1.3. Recompile ('make').
-+
-+See the file 'PATCHES' in 'patchv6b' for details.
-+
-+Step 2:
-+
-+2.1. Replace the 3 placeholder files by the actual implementation
-+     modules.
-+
-+2.2. Enable application support of the new features by #defining
-+     C_ARITH_CODING_SUPPORTED and D_ARITH_CODING_SUPPORTED
-+     in 'jmorecfg.h'.
-+
-+2.3. Recompile ('make').
-+
-+Note that I suggest to add 3 placeholder files to the IJG
-+distribution. This would remove the need for system-dependent
-+changes (Makefiles) and thus considerably simplify the actual
-+installation for systems without a configure-generated makefile.
-+
-+
-+References
-+==========
-+
-+- The Independent JPEG Group's software
-+
-+- JBIG-KIT lossless image compression library by Markus Kuhn
-+
-+- William B. Pennebaker, Joan L. Mitchell:
-+  "JPEG Still Image Data Compression Standard",
-+  Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
-+
-+- jpeg-faq (http://www.faqs.org/faqs/jpeg-faq/)
-+
-+- compression-faq (http://www.faqs.org/faqs/compression-faq/)
diff --git a/libjpeg-arm.patch b/libjpeg-arm.patch
deleted file mode 100644 (file)
index 436a6a5..0000000
+++ /dev/null
@@ -1,2004 +0,0 @@
---- jpeg-6b/ltconfig.arm       Wed Mar 25 10:25:39 1998
-+++ jpeg-6b/ltconfig   Wed Jan 13 18:08:47 1999
-@@ -25,30 +25,57 @@
- # A lot of this script is taken from autoconf-2.10.
-+# Check that we are running under the correct shell.
-+SHELL=${CONFIG_SHELL-/bin/sh}
-+echo=echo
-+if test "X$1" = X--no-reexec; then
-+  # Discard the --no-reexec flag, and continue.
-+  shift
-+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-+  # Yippee, $echo works!
-+  :
-+else
-+  # Restart under the correct shell.
-+  exec "$SHELL" "$0" --no-reexec ${1+"$@"}
-+fi
-+
- # The HP-UX ksh and POSIX shell print the target directory to stdout
- # if CDPATH is set.
- if test "${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
--echo=echo
--if test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :
--else
--  # The Solaris and AIX default echo program unquotes backslashes.
--  # This makes it impossible to quote backslashes using
-+if test "X`($echo '\t') 2>/dev/null`" != 'X\t'; then
-+  # The Solaris, AIX, and Digital Unix default echo programs unquote
-+  # backslashes.  This makes it impossible to quote backslashes using
-   #   echo "$something" | sed 's/\\/\\\\/g'
--  # So, we emulate echo with printf '%s\n'
--  echo="printf %s\\n"
--  if test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then :
--  else
--    # Oops.  We have no working printf.  Try to find a not-so-buggy echo.
--    echo=echo
--    IFS="${IFS=       }"; save_ifs="$IFS"; IFS="${IFS}:"
--    for dir in $PATH /usr/ucb; do
--      if test -f $dir/echo && test "X`$dir/echo '\t'`" = 'X\t'; then
--        echo="$dir/echo"
--        break
-+  #
-+  # So, first we look for a working echo in the user's PATH.
-+  IFS="${IFS=         }"; save_ifs="$IFS"; IFS="${IFS}:"
-+  for dir in $PATH /usr/ucb; do
-+    if test -f $dir/echo && test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t'; then
-+      echo="$dir/echo"
-+      break
-+    fi
-+  done
-+  IFS="$save_ifs"
-+
-+  if test "X$echo" = Xecho; then
-+    # We didn't find a better echo, so look for alternatives.
-+    if test "X`(print -r '\t') 2>/dev/null`" = 'X\t'; then
-+      # This shell has a builtin print -r that does the trick.
-+      echo='print -r'
-+    elif test -f /bin/ksh && test "X$CONFIG_SHELL" != X/bin/ksh; then
-+      # If we have ksh, try running ltconfig again with it.
-+      CONFIG_SHELL=/bin/ksh
-+      export CONFIG_SHELL
-+      exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"}
-+    else
-+      # Try using printf.
-+      echo='printf %s\n'
-+      if test "X`($echo '\t') 2>/dev/null`" != 'X\t'; then
-+        # Oops.  We lost completely, so just stick with echo.
-+        echo=echo
-       fi
--    done
--    IFS="$save_ifs"
-+    fi
-   fi
- fi
-@@ -66,7 +93,7 @@
- # Constants:
- PROGRAM=ltconfig
- PACKAGE=libtool
--VERSION=1.2
-+VERSION=1.2b
- ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.c 1>&5'
- ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.c $LIBS 1>&5'
- rm="rm -f"
-@@ -74,6 +101,7 @@
- help="Try \`$progname --help' for more information."
- # Global variables:
-+default_ofile=libtool
- can_build_shared=yes
- enable_shared=yes
- # All known linkers require a `.a' archive for static linking.
-@@ -85,6 +113,7 @@
- ac_config_sub=
- host=
- nonopt=
-+ofile="$default_ofile"
- verify_host=yes
- with_gcc=no
- with_gnu_ld=no
-@@ -121,10 +150,12 @@
- Generate a system-specific libtool script.
-+    --debug                enable verbose shell tracing
-     --disable-shared       do not build shared libraries
-     --disable-static       do not build static libraries
-     --help                 display this help and exit
-     --no-verify            do not verify that HOST is a valid host type
-+-o, --output=FILE          specify the output file [default=$default_ofile]
-     --quiet                same as \`--silent'
-     --silent               do not print informational messages
-     --srcdir=DIR           find \`config.guess' in DIR
-@@ -140,6 +171,11 @@
-   exit 0
-   ;;
-+  --debug)
-+    echo "$progname: enabling shell trace mode"
-+    set -x
-+    ;;
-+
-   --disable-shared) enable_shared=no ;;
-   --disable-static) enable_static=no ;;
-@@ -151,6 +187,9 @@
-   --no-verify) verify_host=no ;;
-+  --output | -o) prev=ofile ;;
-+  --output=*) ofile="$optarg" ;;
-+
-   --version) echo "$PROGRAM (GNU $PACKAGE) $VERSION"; exit 0 ;;
-   --with-gcc) with_gcc=yes ;;
-@@ -185,8 +224,7 @@
-   exit 1
- fi
--if test -f "$ltmain"; then :
--else
-+if test ! -f "$ltmain"; then
-   echo "$progname: \`$ltmain' does not exist" 1>&2
-   echo "$help" 1>&2
-   exit 1
-@@ -264,7 +302,7 @@
-   ac_config_sub=$ac_aux_dir/config.sub
-   # Make sure we can run config.sub.
--  if $ac_config_sub sun4 >/dev/null 2>&1; then :
-+  if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then :
-   else
-     echo "$progname: cannot run $ac_config_sub" 1>&2
-     echo "$help" 1>&2
-@@ -276,14 +314,14 @@
-   host_alias=$host
-   case "$host_alias" in
-   "")
--    if host_alias=`$ac_config_guess`; then :
-+    if host_alias=`$SHELL $ac_config_guess`; then :
-     else
-       echo "$progname: cannot guess host type; you must specify one" 1>&2
-       echo "$help" 1>&2
-       exit 1
-     fi ;;
-   esac
--  host=`$ac_config_sub $host_alias`
-+  host=`$SHELL $ac_config_sub $host_alias`
-   echo "$ac_t$host" 1>&6
-   # Make sure the host verified.
-@@ -421,7 +459,7 @@
-   # Now see if the compiler is really GCC.
-   with_gcc=no
-   echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6
--  echo "$progname:424: checking whether we are using GNU C" >&5
-+  echo "$progname:462: checking whether we are using GNU C" >&5
-   $rm conftest.c
-   cat > conftest.c <<EOF
-@@ -429,7 +467,7 @@
-   yes;
- #endif
- EOF
--  if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:432: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-+  if { ac_try='${CC-cc} -E conftest.c'; { (eval echo $progname:470: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
-     with_gcc=yes
-   fi
-   $rm conftest.c
-@@ -477,7 +515,7 @@
-     link_static_flag='-bnso -bI:/lib/syscalls.exp'
-     ;;
--  hpux9* | hpux10*)
-+  hpux9* | hpux10* | hpux11*)
-     # Is there a better link_static_flag that works with the bundled CC?
-     wl='-Wl,'
-     link_static_flag="${wl}-a ${wl}archive"
-@@ -541,11 +579,11 @@
-   # Check to make sure the pic_flag actually works.
-   echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6
-   $rm conftest*
--  echo > conftest.c
-+  echo "int some_variable = 0;" > conftest.c
-   save_CFLAGS="$CFLAGS"
-   CFLAGS="$CFLAGS $pic_flag -DPIC"
--  echo "$progname:547: checking if $compiler PIC flag $pic_flag works" >&5
--  if { (eval echo $progname:548: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
-+  echo "$progname:585: checking if $compiler PIC flag $pic_flag works" >&5
-+  if { (eval echo $progname:586: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then
-     # Append any warnings to the config.log.
-     cat conftest.err 1>&5
-@@ -588,8 +626,8 @@
- echo 'main(){return(0);}' > conftest.c
- save_LDFLAGS="$LDFLAGS"
- LDFLAGS="$LDFLAGS $link_static_flag"
--echo "$progname:591: checking if $compiler static flag $link_static_flag works" >&5
--if { (eval echo $progname:592: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-+echo "$progname:629: checking if $compiler static flag $link_static_flag works" >&5
-+if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-   echo "$ac_t$link_static_flag" 1>&6
- else
-   echo "$ac_t"none 1>&6
-@@ -621,11 +659,11 @@
-   if test "$with_gcc" = yes; then
-     # Check if gcc -print-prog-name=ld gives a path.
-     echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6
--    echo "$progname:624: checking for ld used by GCC" >&5
-+    echo "$progname:662: checking for ld used by GCC" >&5
-     ac_prog=`($CC -print-prog-name=ld) 2>&5`
-     case "$ac_prog" in
-     # Accept absolute paths.
--    /* | [A-Za-z]:\\*)
-+    /* | [A-Za-z]:[/\\]*)
-       test -z "$LD" && LD="$ac_prog"
-       ;;
-     "")
-@@ -639,10 +677,10 @@
-     esac
-   elif test "$with_gnu_ld" = yes; then
-     echo $ac_n "checking for GNU ld... $ac_c" 1>&6
--    echo "$progname:642: checking for GNU ld" >&5
-+    echo "$progname:680: checking for GNU ld" >&5
-   else
-     echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6
--    echo "$progname:645: checking for non-GNU ld" >&5
-+    echo "$progname:683: checking for non-GNU ld" >&5
-   fi
-   if test -z "$LD"; then
-@@ -694,6 +732,7 @@
- archive_cmds=
- old_archive_from_new_cmds=
- export_dynamic_flag_spec=
-+whole_archive_flag_spec=
- hardcode_libdir_flag_spec=
- hardcode_libdir_separator=
- hardcode_direct=no
-@@ -701,31 +740,38 @@
- hardcode_shlibpath_var=unsupported
- runpath_var=
--case "$host_os" in
--amigaos* | sunos4*)
--  # On these operating systems, we should treat GNU ld like the system ld.
--  gnu_ld_acts_native=yes
--  ;;
--*)
--  gnu_ld_acts_native=no
--  ;;
--esac
--
- ld_shlibs=yes
--if test "$with_gnu_ld" = yes && test "$gnu_ld_acts_native" != yes; then
-+if test "$with_gnu_ld" = yes; then
-   # See if GNU ld supports shared libraries.
--  if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
--    archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs'
--    runpath_var=LD_RUN_PATH
--    ld_shlibs=yes
--  else
--    ld_shlibs=no
--  fi
-+  case "$host_os" in
-+  amigaos*)
-+    archive_cmds='$rm $objdir/a2ixlibrary.data;$echo "#define NAME $libname" > $objdir/a2ixlibrary.data;$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data;$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data;$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data;$AR cru $lib$libobjs;$RANLIB $lib;(cd $objdir && a2ixlibrary -32)'
-+    hardcode_libdir_flag_spec='-L$libdir'
-+    hardcode_minus_L=yes
-+    ;;
-+
-+  sunos4*)
-+    archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs'
-+    hardcode_direct=yes
-+    hardcode_minus_L=yes
-+    hardcode_shlibpath_var=no
-+    ;;
-+
-+  *)
-+    if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then
-+      archive_cmds='$CC -shared ${wl}-soname $wl$soname -o $lib$libobjs'
-+    else
-+      ld_shlibs=no
-+    fi
-+    ;;
-+  esac
-   if test "$ld_shlibs" = yes; then
-+    runpath_var=LD_RUN_PATH
-     hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir'
-     export_dynamic_flag_spec='${wl}--export-dynamic'
-+    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
-   fi
- else
-   # PORTME fill in a description of your system's linker (not GNU ld)
-@@ -781,7 +827,7 @@
-     archive_cmds='$CC -shared -o $lib$libobjs'
-     hardcode_libdir_flag_spec='-R$libdir'
-     hardcode_direct=yes
--    hardcode_minus_L=yes
-+    hardcode_minus_L=no
-     hardcode_shlibpath_var=no
-     ;;
-@@ -793,7 +839,7 @@
-     export_dynamic_flag_spec='${wl}-E'
-     ;;
--  hpux10*)
-+  hpux10* | hpux11*)
-     archive_cmds='$LD -b +h $soname +s +b $install_libdir -o $lib$libobjs'
-     hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
-     hardcode_direct=yes
-@@ -802,7 +848,11 @@
-     ;;
-   irix5* | irix6*)
--    archive_cmds='$LD -shared -o $lib -soname $soname -set_version $verstring$libobjs'
-+    if test "$with_gcc" = yes; then
-+      archive_cmds='$CC -shared -o $lib ${wl}-soname ${wl}$soname ${wl}-set_version ${wl}$verstring$libobjs'
-+    else
-+      archive_cmds='$LD -shared -o $lib -soname $soname -set_version $verstring$libobjs'
-+    fi
-     hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
-     ;;
-@@ -856,15 +906,7 @@
-     ;;
-   sunos4*)
--    if test "$with_gcc" = yes; then
--      archive_cmds='$CC -shared -o $lib$libobjs'
--    else
--      archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs'
--    fi
--
--    if test "$with_gnu_ld" = yes; then
--      export_dynamic_flag_spec='${wl}-export-dynamic'
--    fi
-+    archive_cmds='$LD -assert pure-text -Bstatic -o $lib$libobjs'
-     hardcode_libdir_flag_spec='-L$libdir'
-     hardcode_direct=yes
-     hardcode_minus_L=yes
-@@ -890,7 +932,7 @@
- if test -z "$NM"; then
-   echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6
-   case "$NM" in
--  /* | [A-Za-z]:\\*) ;; # Let the user override the test with a path.
-+  /* | [A-Za-z]:[/\\]*) ;; # Let the user override the test with a path.
-   *)
-     IFS="${IFS=       }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
-     for ac_dir in /usr/ucb /usr/ccs/bin $PATH /bin; do
-@@ -968,11 +1010,11 @@
- main(){nm_test_var='a';nm_test_func();return(0);}
- EOF
--echo "$progname:971: checking if global_symbol_pipe works" >&5
--if { (eval echo $progname:972: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then
-+echo "$progname:1013: checking if global_symbol_pipe works" >&5
-+if { (eval echo $progname:1014: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then
-   # Now try to grab the symbols.
-   nlist=conftest.nm
--  if { echo "$progname:975: eval \"$NM conftest.o | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
-+  if { echo "$progname:1017: eval \"$NM conftest.o | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.o | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then
-     # Try sorting and uniquifying the output.
-     if sort "$nlist" | uniq > "$nlist"T; then
-@@ -1030,7 +1072,7 @@
-       save_CFLAGS="$CFLAGS"
-         LIBS='conftestm.o'
-       CFLAGS="$CFLAGS$no_builtin_flag"
--        if { (eval echo $progname:1033: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-+        if { (eval echo $progname:1075: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
-           pipe_works=yes
-         else
-           echo "$progname: failed program was:" >&5
-@@ -1073,25 +1115,20 @@
-     # We can link without hardcoding, and we can hardcode nonexisting dirs.
-     hardcode_action=immediate
-   fi
--elif test "$hardcode_direct" != yes && \
--     test "$hardcode_minus_L" != yes && \
--     test "$hardcode_shlibpath_var" != yes; then
--  # We cannot hardcode anything.
--  hardcode_action=unsupported
- else
--  # We can only hardcode existing directories.
--  hardcode_action=relink
-+  # We cannot hardcode anything, or else we can only hardcode existing
-+  # directories.
-+  hardcode_action=unsupported
- fi
- echo "$ac_t$hardcode_action" 1>&6
--test "$hardcode_action" = unsupported && can_build_shared=no
- reload_flag=
- reload_cmds='$LD$reload_flag -o $output$reload_objs'
- echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6
--# PORTME Some linker may need a different reload flag.
-+# PORTME Some linkers may need a different reload flag.
- reload_flag='-r'
--echo "$ac_t$reload_flag"
-+echo "$ac_t$reload_flag" 1>&6
- test -n "$reload_flag" && reload_flag=" $reload_flag"
- # PORTME Fill in your ld.so characteristics
-@@ -1110,11 +1147,11 @@
- case "$host_os" in
- aix3* | aix4*)
-   version_type=linux
--  library_names_spec='${libname}${release}.so.$versuffix $libname.a'
-+  library_names_spec='${libname}${release}.so$versuffix $libname.a'
-   shlibpath_var=LIBPATH
-   # AIX has no versioning support, so we append a major version to the name.
--  soname_spec='${libname}${release}.so.$major'
-+  soname_spec='${libname}${release}.so$major'
-   ;;
- amigaos*)
-@@ -1125,25 +1162,25 @@
- freebsd2* | freebsd3*)
-   version_type=sunos
--  library_names_spec='${libname}${release}.so.$versuffix $libname.so'
--  finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir'
-+  library_names_spec='${libname}${release}.so$versuffix $libname.so'
-+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
- gnu*)
--  version_type=sunos
--  library_names_spec='${libname}${release}.so.$versuffix'
-+  version_type=linux
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}.so'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
--hpux9* | hpux10*)
-+hpux9* | hpux10* | hpux11*)
-   # Give a soname corresponding to the major version so that dld.sl refuses to
-   # link against other versions.
-   dynamic_linker="$host_os dld.sl"
-   version_type=sunos
-   shlibpath_var=SHLIB_PATH
--  library_names_spec='${libname}${release}.sl.$versuffix ${libname}${release}.sl.$major $libname.sl'
--  soname_spec='${libname}${release}.sl.$major'
-+  library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl'
-+  soname_spec='${libname}${release}.sl$major'
-   # HP-UX runs *really* slowly unless shared libraries are mode 555.
-   postinstall_cmds='chmod 555 $lib'
-   ;;
-@@ -1151,7 +1188,7 @@
- irix5* | irix6*)
-   version_type=osf
-   soname_spec='${libname}${release}.so'
--  library_names_spec='${libname}${release}.so.$versuffix $libname.so'
-+  library_names_spec='${libname}${release}.so$versuffix $libname.so'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
-@@ -1163,9 +1200,9 @@
- # This must be Linux ELF.
- linux-gnu*)
-   version_type=linux
--  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
--  soname_spec='${libname}${release}.so.$major'
--  finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir'
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
-   shlibpath_var=LD_LIBRARY_PATH
-   if test -f /lib/ld.so.1; then
-@@ -1181,8 +1218,8 @@
- netbsd* | openbsd*)
-   version_type=sunos
--  library_names_spec='${libname}${release}.so.$versuffix'
--  finish_cmds='PATH="$PATH:/sbin" ldconfig -m $libdir'
-+  library_names_spec='${libname}${release}.so$versuffix'
-+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
-@@ -1196,42 +1233,44 @@
- osf3* | osf4*)
-   version_type=osf
-   soname_spec='${libname}${release}.so'
--  library_names_spec='${libname}${release}.so.$versuffix $libname.so'
-+  library_names_spec='${libname}${release}.so$versuffix $libname.so'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
- sco3.2v5*)
-   version_type=osf
--  soname_spec='${libname}${release}.so.$major'
--  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
- solaris2*)
-   version_type=linux
--  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
--  soname_spec='${libname}${release}.so.$major'
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-   shlibpath_var=LD_LIBRARY_PATH
-+  # ldd complains unless libraries are executable
-+  postinstall_cmds='chmod +x $lib'
-   ;;
- sunos4*)
-   version_type=sunos
--  library_names_spec='${libname}${release}.so.$versuffix'
--  finish_cmds='PATH="$PATH:/usr/etc" ldconfig $libdir'
-+  library_names_spec='${libname}${release}.so$versuffix'
-+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
- sysv4.2uw2*)
-   version_type=linux
--  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
--  soname_spec='${libname}${release}.so.$major'
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
- uts4*)
-   version_type=linux
--  library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major $libname.so'
--  soname_spec='${libname}${release}.so.$major'
-+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
-+  soname_spec='${libname}${release}.so$major'
-   shlibpath_var=LD_LIBRARY_PATH
-   ;;
-@@ -1287,7 +1326,7 @@
- for var in ltecho old_CC old_CFLAGS old_CPPFLAGS old_LD old_NM old_RANLIB \
-   old_LN_S AR CC LD LN_S NM reload_flag reload_cmds wl pic_flag \
-   link_static_flag no_builtin_flag export_dynamic_flag_spec \
--  libname_spec library_names_spec soname_spec RANLIB \
-+  whole_archive_flag_spec libname_spec library_names_spec soname_spec RANLIB \
-   old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \
-   old_postuninstall_cmds archive_cmds postinstall_cmds postuninstall_cmds \
-   allow_undefined_flag no_undefined_flag \
-@@ -1307,14 +1346,13 @@
-   esac
- done
--ofile=libtool
--trap "$rm $ofile; exit 1" 1 2 15
--echo creating $ofile
--$rm $ofile
--cat <<EOF > $ofile
--#! /bin/sh
-+trap "$rm \"$ofile\"; exit 1" 1 2 15
-+echo "creating $ofile"
-+$rm "$ofile"
-+cat <<EOF > "$ofile"
-+#! $SHELL
--# libtool - Provide generalized library-building support services.
-+# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
- # Generated automatically by $PROGRAM - GNU $PACKAGE $VERSION
- # NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh.
- #
-@@ -1340,16 +1378,6 @@
- # configuration script generated by Autoconf, you may include it under
- # the same distribution terms that you use for the rest of that program.
--# This program was configured as follows,
--# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
--#
--# CC="$old_CC" CFLAGS="$old_CFLAGS" CPPFLAGS="$old_CPPFLAGS" \\
--# LD="$old_LD" NM="$old_NM" RANLIB="$old_RANLIB" LN_S="$old_LN_S" \\
--#   $0$ltconfig_args
--#
--# Compiler and other test output produced by $progname, useful for
--# debugging $progname, is in ./config.log if it exists.
--
- # Sed that helps us avoid accidentally triggering echo(1) options like -n.
- Xsed="sed -e s/^X//"
-@@ -1357,25 +1385,35 @@
- # if CDPATH is set.
- if test "\${CDPATH+set}" = set; then CDPATH=; export CDPATH; fi
--# An echo program that does not interpret backslashes.
--echo="$ltecho"
-+### BEGIN LIBTOOL CONFIG
-+# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-+#
-+# CC="$old_CC" CFLAGS="$old_CFLAGS" CPPFLAGS="$old_CPPFLAGS" \\
-+# LD="$old_LD" NM="$old_NM" RANLIB="$old_RANLIB" LN_S="$old_LN_S" \\
-+#   $0$ltconfig_args
-+#
-+# Compiler and other test output produced by $progname, useful for
-+# debugging $progname, is in ./config.log if it exists.
- # The version of $progname that generated this script.
- LTCONFIG_VERSION="$VERSION"
- # Shell to use when invoking shell scripts.
--SHELL=${CONFIG_SHELL-/bin/sh}
-+SHELL="$SHELL"
--# Whether or not to build libtool libraries.
-+# Whether or not to build shared libraries.
- build_libtool_libs=$enable_shared
--# Whether or not to build old-style libraries.
-+# Whether or not to build static libraries.
- build_old_libs=$enable_static
- # The host system.
- host_alias="$host_alias"
- host="$host"
-+# An echo program that does not interpret backslashes.
-+echo="$ltecho"
-+
- # The archiver.
- AR="$AR"
-@@ -1413,6 +1451,9 @@
- # Compiler flag to allow reflexive dlopens.
- export_dynamic_flag_spec="$export_dynamic_flag_spec"
-+# Compiler flag to generate shared objects directly from archives.
-+whole_archive_flag_spec="$whole_archive_flag_spec"
-+
- # Library versioning type.
- version_type=$version_type
-@@ -1482,12 +1523,12 @@
- # Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
- # the resulting binary.
- hardcode_shlibpath_var=$hardcode_shlibpath_var
--
- EOF
- case "$host_os" in
- aix3*)
--  cat <<\EOF >> $ofile
-+  cat <<\EOF >> "$ofile"
-+
- # AIX sometimes has problems with the GCC collect2 program.  For some
- # reason, if we set the COLLECT_NAMES environment variable, the problems
- # vanish in a puff of smoke.
-@@ -1495,15 +1536,17 @@
-   COLLECT_NAMES=
-   export COLLECT_NAMES
- fi
--
- EOF
-   ;;
- esac
-+echo '### END LIBTOOL CONFIG' >> "$ofile"
-+echo >> "$ofile"
-+
- # Append the ltmain.sh script.
--cat "$ltmain" >> $ofile || (rm -f $ofile; exit 1)
-+cat "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1)
--chmod +x $ofile
-+chmod +x "$ofile"
- exit 0
- # Local Variables:
---- jpeg-6b/config.sub.arm     Wed Mar 25 10:25:39 1998
-+++ jpeg-6b/config.sub Wed Jan 13 18:08:47 1999
-@@ -1,6 +1,6 @@
- #! /bin/sh
- # Configuration validation subroutine script, version 1.1.
--#   Copyright (C) 1991, 92, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
-+#   Copyright (C) 1991, 92-97, 1998 Free Software Foundation, Inc.
- # This file is (in principle) common to ALL GNU software.
- # The presence of a machine in this file suggests that SOME GNU software
- # can handle that machine.  It does not imply ALL GNU software can.
-@@ -162,7 +162,7 @@
-       # We use `pc' rather than `unknown'
-       # because (1) that's what they normally are, and
-       # (2) the word "unknown" tends to confuse beginning users.
--      i[3456]86)
-+      i[34567]86)
-         basic_machine=$basic_machine-pc
-         ;;
-       # Object if more than one company name word.
-@@ -171,7 +171,7 @@
-               exit 1
-               ;;
-       # Recognize the basic CPU types with company name.
--      vax-* | tahoe-* | i[3456]86-* | i860-* | m32r-* | m68k-* | m68000-* \
-+      vax-* | tahoe-* | i[34567]86-* | i860-* | m32r-* | m68k-* | m68000-* \
-             | m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | arm-* | c[123]* \
-             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
-             | power-* | none-* | 580-* | cray2-* | h8300-* | i960-* \
-@@ -350,19 +350,19 @@
-               os=-mvs
-               ;;
- # I'm not sure what "Sysv32" means.  Should this be sysv3.2?
--      i[3456]86v32)
-+      i[34567]86v32)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv32
-               ;;
--      i[3456]86v4*)
-+      i[34567]86v4*)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv4
-               ;;
--      i[3456]86v)
-+      i[34567]86v)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-sysv
-               ;;
--      i[3456]86sol2)
-+      i[34567]86sol2)
-               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-               os=-solaris2
-               ;;
-@@ -469,25 +469,23 @@
-         pc532 | pc532-*)
-               basic_machine=ns32k-pc532
-               ;;
--      pentium | p5)
--              basic_machine=i586-intel
-+      pentium | p5 | k5 | nexen)
-+              basic_machine=i586-pc
-               ;;
--      pentiumpro | p6)
--              basic_machine=i686-intel
-+      pentiumpro | p6 | k6 | 6x86)
-+              basic_machine=i686-pc
-               ;;
--      pentium-* | p5-*)
-+      pentiumii | pentium2)
-+              basic_machine=i786-pc
-+              ;;
-+      pentium-* | p5-* | k5-* | nexen-*)
-               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
--      pentiumpro-* | p6-*)
-+      pentiumpro-* | p6-* | k6-* | 6x86-*)
-               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
--      k5)
--              # We don't have specific support for AMD's K5 yet, so just call it a Pentium
--              basic_machine=i586-amd
--              ;;
--      nexen)
--              # We don't have specific support for Nexgen yet, so just call it a Pentium
--              basic_machine=i586-nexgen
-+      pentiumii-* | pentium2-*)
-+              basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-               ;;
-       pn)
-               basic_machine=pn-gould
---- jpeg-6b/config.guess.arm   Wed Mar 25 10:25:38 1998
-+++ jpeg-6b/config.guess       Wed Jan 13 18:08:44 1999
-@@ -1,6 +1,6 @@
- #! /bin/sh
- # Attempt to guess a canonical system name.
--#   Copyright (C) 1992, 93, 94, 95, 96, 1997 Free Software Foundation, Inc.
-+#   Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.
- #
- # This file is free software; you can redistribute it and/or modify it
- # under the terms of the GNU General Public License as published by
-@@ -478,10 +478,10 @@
-       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-       exit 0 ;;
-     i*:CYGWIN*:*)
--      echo i386-pc-cygwin32
-+      echo ${UNAME_MACHINE}-pc-cygwin32
-       exit 0 ;;
-     i*:MINGW*:*)
--      echo i386-pc-mingw32
-+      echo ${UNAME_MACHINE}-pc-mingw32
-       exit 0 ;;
-     p*:CYGWIN*:*)
-       echo powerpcle-unknown-cygwin32
-@@ -493,6 +493,12 @@
-       echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-       exit 0 ;;
-     *:Linux:*:*)
-+      # uname on the ARM produces all sorts of strangeness, and we need to
-+      # filter it out.
-+      case "$UNAME_MACHINE" in
-+        arm* | sa110*)              UNAME_MACHINE="arm" ;;
-+      esac
-+
-       # The BFD linker knows what the default object file format is, so
-       # first see if it will tell us.
-       ld_help_string=`ld --help 2>&1`
-@@ -506,6 +512,7 @@
-         i?86linux)  echo "${UNAME_MACHINE}-pc-linux-gnuaout"      ; exit 0 ;;
-         i?86coff)   echo "${UNAME_MACHINE}-pc-linux-gnucoff"      ; exit 0 ;;
-         sparclinux) echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
-+        armlinux)   echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
-         m68klinux)  echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0 ;;
-         elf32ppc)   echo "powerpc-unknown-linux-gnu"              ; exit 0 ;;
-       esac
---- jpeg-6b/ltmain.sh.arm      Wed Mar 25 10:25:39 1998
-+++ jpeg-6b/ltmain.sh  Wed Jan 13 18:08:47 1999
-@@ -23,6 +23,18 @@
- # configuration script generated by Autoconf, you may include it under
- # the same distribution terms that you use for the rest of that program.
-+# Check that we have a working $echo.
-+if test "X$1" = X--no-reexec; then
-+  # Discard the --no-reexec flag, and continue.
-+  shift
-+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then
-+  # Yippee, $echo works!
-+  :
-+else
-+  # Restart under the correct shell, and then maybe $echo will work.
-+  exec $SHELL "$0" --no-reexec ${1+"$@"}
-+fi
-+
- # The name of this program.
- progname=`$echo "$0" | sed 's%^.*/%%'`
- modename="$progname"
-@@ -30,7 +42,7 @@
- # Constants.
- PROGRAM=ltmain.sh
- PACKAGE=libtool
--VERSION=1.2
-+VERSION=1.2b
- default_mode=
- help="Try \`$progname --help' for more information."
-@@ -48,8 +60,13 @@
- # Only set LANG and LC_ALL to C if already set.
- # These must not be set unconditionally because not all systems understand
- # e.g. LANG=C (notably SCO).
--if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
--if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
-+# We save the old values to restore during execute mode.
-+if test "${LC_ALL+set}" = set; then
-+  save_LC_ALL="$LC_ALL"; LC_ALL=C; export LC_ALL
-+fi
-+if test "${LANG+set}" = set; then
-+  save_LANG="$LANG"; LANG=C; export LANG
-+fi
- if test "$LTCONFIG_VERSION" != "$VERSION"; then
-   echo "$modename: ltconfig version \`$LTCONFIG_VERSION' does not match $PROGRAM version \`$VERSION'" 1>&2
-@@ -111,6 +128,16 @@
-     exit 0
-     ;;
-+  --config)
-+    sed -e '1,/^### BEGIN LIBTOOL CONFIG/d' -e '/^### END LIBTOOL CONFIG/,$d' $0
-+    exit 0
-+    ;;
-+
-+  --debug)
-+    echo "$progname: enabling shell trace mode"
-+    set -x
-+    ;;
-+
-   --dry-run | -n)
-     run=:
-     ;;
-@@ -180,7 +207,7 @@
-         esac
-       done
-       ;;
--    *db | *dbx)
-+    *db | *dbx | *strace | *truss)
-       mode=execute
-       ;;
-     *install*|cp|mv)
-@@ -238,7 +265,6 @@
-       ;;
-       -static)
--      build_libtool_libs=no
-       build_old_libs=yes
-       continue
-       ;;
-@@ -337,7 +363,7 @@
-       # Just move the object, then go on to compile the next one
-       $show "$mv $obj $libobj"
--      $run $mv $obj $libobj || exit 1
-+      $run $mv $obj $libobj || exit $?
-       # Allow error messages only from the first compilation.
-       suppress_output=' >/dev/null 2>&1'
-@@ -374,10 +400,13 @@
-     compile_shlibpath=
-     finalize_shlibpath=
-+    convenience=
-+    old_convenience=
-     deplibs=
-     dlfiles=
-     dlprefiles=
-     export_dynamic=no
-+    generated=
-     hardcode_libdirs=
-     libobjs=
-     link_against_libtool_libs=
-@@ -410,8 +439,10 @@
-     test -n "$old_archive_from_new_cmds" && build_old_libs=yes
-     # Go through the arguments, transforming them on the way.
--    for arg
--    do
-+    while test $# -gt 0; do
-+      arg="$1"
-+      shift
-+
-       # If the previous option needs an argument, assign it.
-       if test -n "$prev"; then
-         case "$prev" in
-@@ -495,7 +526,7 @@
-       -L*)
-         dir=`$echo "X$arg" | $Xsed -e 's%^-L\(.*\)$%\1%'`
-         case "$dir" in
--        /* | [A-Za-z]:\\*)
-+        /* | [A-Za-z]:[/\\]*)
-         # Add the corresponding hardcode_libdir_flag, if it is not identical.
-           ;;
-         *)
-@@ -571,7 +602,7 @@
-       if test "$prev" = dlprefiles; then
-         # Preload the old-style object.
--        dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e 's/\.lo$/\.o/'`
-+        dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e 's/\.lo$/.o/'`
-         prev=
-       fi
-       libobjs="$libobjs $arg"
-@@ -586,7 +617,7 @@
-         old_library=
-         # Check to see that this really is a libtool archive.
--        if (sed -e '2q' $arg | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
-+        if (sed -e '2q' $arg | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-         else
-           $echo "$modename: \`$arg' is not a valid libtool archive" 1>&2
-           exit 1
-@@ -598,11 +629,6 @@
-         *) . ./$arg ;;
-         esac
--        if test -z "$libdir"; then
--          $echo "$modename: \`$arg' contains no -rpath information" 1>&2
--          exit 1
--        fi
--
-         # Get the name of the library we link against.
-         linklib=
-         for l in $old_library $library_names; do
-@@ -623,6 +649,15 @@
-           dir="$dir/$objdir"
-         fi
-+        if test -z "$libdir"; then
-+        # It is a libtool convenience library, so add in its objects.
-+        convenience="$convenience $dir/$old_library"l
-+        old_convenience="$old_convenience $dir/$old_library"
-+        compile_command="$compile_command $dir/$old_library"
-+        finalize_command="$finalize_command $dir/$old_library"
-+        continue
-+      fi
-+
-         # This library was specified with -dlopen.
-         if test "$prev" = dlfiles; then
-           dlfiles="$dlfiles $arg"
-@@ -696,8 +731,9 @@
-           fi
-+        lib_linked=yes
-           case "$hardcode_action" in
--          immediate)
-+          immediate | unsupported)
-             if test "$hardcode_direct" = no; then
-               compile_command="$compile_command $dir/$linklib"
-             elif test "$hardcode_minus_L" = no; then
-@@ -705,13 +741,15 @@
-             elif test "$hardcode_shlibpath_var" = no; then
-               compile_shlibpath="$compile_shlibpath$dir:"
-               compile_command="$compile_command -l$name"
-+          else
-+            lib_linked=no
-             fi
-             ;;
-           relink)
-             # We need an absolute path.
-             case "$dir" in
--            /* | [A-Za-z]:\\*) ;;
-+            /* | [A-Za-z]:[/\\]*) ;;
-             *)
-               absdir=`cd "$dir" && pwd`
-               if test -z "$absdir"; then
-@@ -729,15 +767,21 @@
-             elif test "$hardcode_shlibpath_var" = yes; then
-               compile_shlibpath="$compile_shlibpath$dir:"
-               compile_command="$compile_command -l$name"
-+          else
-+            lib_linked=no
-             fi
-             ;;
--          *)
--            $echo "$modename: \`$hardcode_action' is an unknown hardcode action" 1>&2
--            exit 1
--            ;;
-+        *)
-+          lib_linked=no
-+          ;;
-           esac
-+        if test "$lib_linked" != yes; then
-+          $echo "$modename: configuration error: unsupported hardcode properties"
-+          exit 1
-+        fi
-+
-           # Finalize command for both is simple: just hardcode it.
-           if test "$hardcode_direct" = yes; then
-             finalize_command="$finalize_command $libdir/$linklib"
-@@ -802,14 +846,7 @@
-       exit 1
-     fi
--    if test -n "$vinfo" && test -n "$release"; then
--      $echo "$modename: you cannot specify both \`-version-info' and \`-release'" 1>&2
--      $echo "$help" 1>&2
--      exit 1
--    fi
--
--    oldlib=
--    oldobjs=
-+    oldlibs=
-     case "$output" in
-     "")
-       $echo "$modename: you must specify an output file" 1>&2
-@@ -819,16 +856,39 @@
-     */* | *\\*)
-       $echo "$modename: output file \`$output' must have no directory components" 1>&2
-+      $echo "$help" 1>&2
-       exit 1
-       ;;
-     *.a)
-+      if test -n "$link_against_libtool_libs"; then
-+        $echo "$modename: error: cannot link libtool libraries into archives" 1>&2
-+        exit 1
-+      fi
-+
-+      if test -n "$deplibs"; then
-+        $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2
-+      fi
-+
-+      if test -n "$dlfiles$dlprefiles"; then
-+        $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2
-+      fi
-+
-+      if test -n "$rpath"; then
-+        $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2
-+      fi
-+
-+      if test -n "$vinfo"; then
-+        $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2
-+      fi
-+
-+      if test -n "$release"; then
-+        $echo "$modename: warning: \`-release' is ignored for archives" 1>&2
-+      fi
-+
-       # Now set the variables for building old libraries.
-       build_libtool_libs=no
--      build_old_libs=yes
--      oldlib="$output"
--      $show "$rm $oldlib"
--      $run $rm $oldlib
-+      oldlibs="$output"
-       ;;
-     *.la)
-@@ -836,7 +896,7 @@
-       case "$output" in
-       lib*) ;;
-       *)
--      $echo "$modename: libtool library \`$arg' must begin with \`lib'" 1>&2
-+      $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2
-       $echo "$help" 1>&2
-       exit 1
-       ;;
-@@ -849,9 +909,6 @@
-       library_names=
-       old_library=
-       dlname=
--      current=0
--      revision=0
--      age=0
-       if test -n "$objs"; then
-         $echo "$modename: cannot build libtool library \`$output' from non-libtool objects:$objs" 2>&1
-@@ -860,21 +917,12 @@
-       # How the heck are we supposed to write a wrapper for a shared library?
-       if test -n "$link_against_libtool_libs"; then
--        $echo "$modename: libtool library \`$output' may not depend on uninstalled libraries:$link_against_libtool_libs" 1>&2
-+        $echo "$modename: error: cannot link shared libraries into libtool libraries" 1>&2
-         exit 1
-       fi
-       if test -n "$dlfiles$dlprefiles"; then
--        $echo "$modename: warning: \`-dlopen' is ignored while creating libtool libraries" 1>&2
--        # Nullify the symbol file.
--        compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
--        finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
--      fi
--
--      if test -z "$rpath"; then
--        $echo "$modename: you must specify an installation directory with \`-rpath'" 1>&2
--      $echo "$help" 1>&2
--        exit 1
-+        $echo "$modename: warning: \`-dlopen' is ignored for libtool libraries" 1>&2
-       fi
-       set dummy $rpath
-@@ -883,203 +931,250 @@
-       fi
-       install_libdir="$2"
--      # Parse the version information argument.
--      IFS="${IFS=     }"; save_ifs="$IFS"; IFS=':'
--      set dummy $vinfo
--      IFS="$save_ifs"
-+      # Now set the variables for building old libraries.
-+      oldlibs="$objdir/$libname.a"
-+      if test -z "$rpath"; then
-+      # Building a libtool convenience library.
-+      oldlibs="$objdir/$libname.al $oldlibs"
-+      build_libtool_libs=convenience
--      if test -n "$5"; then
--        $echo "$modename: too many parameters to \`-version-info'" 1>&2
--        $echo "$help" 1>&2
--        exit 1
--      fi
-+      if test -n "$vinfo"; then
-+        $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2
-+      fi
--      test -n "$2" && current="$2"
--      test -n "$3" && revision="$3"
--      test -n "$4" && age="$4"
--
--      # Check that each of the things are valid numbers.
--      case "$current" in
--      0 | [1-9] | [1-9][0-9]*) ;;
--      *)
--        $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
--        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
--        exit 1
--        ;;
--      esac
-+      if test -n "$release"; then
-+        $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2
-+      fi
-+      else
--      case "$revision" in
--      0 | [1-9] | [1-9][0-9]*) ;;
--      *)
--        $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
--        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
--        exit 1
--        ;;
--      esac
-+      # Parse the version information argument.
-+      IFS="${IFS=     }"; save_ifs="$IFS"; IFS=':'
-+      set dummy $vinfo 0 0 0
-+      IFS="$save_ifs"
-+
-+      if test -n "$8"; then
-+        $echo "$modename: too many parameters to \`-version-info'" 1>&2
-+        $echo "$help" 1>&2
-+        exit 1
-+      fi
--      case "$age" in
--      0 | [1-9] | [1-9][0-9]*) ;;
--      *)
--        $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
--        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
--        exit 1
--        ;;
--      esac
-+      current="$2"
-+      revision="$3"
-+      age="$4"
-+
-+      # Check that each of the things are valid numbers.
-+      case "$current" in
-+      0 | [1-9] | [1-9][0-9]*) ;;
-+      *)
-+        $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2
-+        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-+        exit 1
-+        ;;
-+      esac
--      if test $age -gt $current; then
--        $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
--        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
--        exit 1
--      fi
-+      case "$revision" in
-+      0 | [1-9] | [1-9][0-9]*) ;;
-+      *)
-+        $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2
-+        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-+        exit 1
-+        ;;
-+      esac
--      # Calculate the version variables.
--      version_vars="version_type current age revision"
--      case "$version_type" in
--      none) ;;
--
--      linux)
--        version_vars="$version_vars major versuffix"
--        major=`expr $current - $age`
--        versuffix="$major.$age.$revision"
--        ;;
--
--      osf)
--        version_vars="$version_vars versuffix verstring"
--        major=`expr $current - $age`
--        versuffix="$current.$age.$revision"
--        verstring="$versuffix"
--
--        # Add in all the interfaces that we are compatible with.
--        loop=$age
--        while test $loop != 0; do
--          iface=`expr $current - $loop`
--          loop=`expr $loop - 1`
--          verstring="$verstring:${iface}.0"
--        done
-+      case "$age" in
-+      0 | [1-9] | [1-9][0-9]*) ;;
-+      *)
-+        $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2
-+        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-+        exit 1
-+        ;;
-+      esac
--        # Make executables depend on our current version.
--        verstring="$verstring:${current}.0"
--        ;;
-+      if test $age -gt $current; then
-+        $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2
-+        $echo "$modename: \`$vinfo' is not valid version information" 1>&2
-+        exit 1
-+      fi
--      sunos)
--        version_vars="$version_vars major versuffix"
--        major="$current"
--        versuffix="$current.$revision"
--        ;;
-+      # Calculate the version variables.
-+      major=
-+      versuffix=
-+      verstring=
-+      case "$version_type" in
-+      none) ;;
-+
-+      linux)
-+        major=.`expr $current - $age`
-+        versuffix="$major.$age.$revision"
-+        ;;
--      *)
--        $echo "$modename: unknown library version type \`$version_type'" 1>&2
--        echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
--        exit 1
--        ;;
--      esac
-+      osf)
-+        major=`expr $current - $age`
-+        versuffix=".$current.$age.$revision"
-+        verstring="$current.$age.$revision"
-+
-+        # Add in all the interfaces that we are compatible with.
-+        loop=$age
-+        while test $loop != 0; do
-+          iface=`expr $current - $loop`
-+          loop=`expr $loop - 1`
-+          verstring="$verstring:${iface}.0"
-+        done
-+
-+        # Make executables depend on our current version.
-+        verstring="$verstring:${current}.0"
-+        ;;
-+
-+      sunos)
-+        major=".$current"
-+        versuffix=".$current.$revision"
-+        ;;
-+
-+      *)
-+        $echo "$modename: unknown library version type \`$version_type'" 1>&2
-+        echo "Fatal configuration error.  See the $PACKAGE docs for more information." 1>&2
-+        exit 1
-+        ;;
-+      esac
-+
-+      # Clear the version info if we defaulted, and they specified a release.
-+      if test -z "$vinfo" && test -n "$release"; then
-+        major=
-+        versuffix=
-+        verstring="0.0"
-+      fi
-+
-+      # Check to see if the archive will have undefined symbols.
-+      if test "$allow_undefined" = yes; then
-+        if test "$allow_undefined_flag" = unsupported; then
-+          $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
-+          build_libtool_libs=no
-+          build_old_libs=yes
-+        fi
-+      else
-+        # Don't allow undefined symbols.
-+        allow_undefined_flag="$no_undefined_flag"
-+      fi
-+
-+      # Add libc to deplibs on all systems.
-+      dependency_libs="$deplibs"
-+      deplibs="$deplibs -lc"
-+      fi
-       # Create the output directory, or remove our outputs if we need to.
-       if test -d $objdir; then
--        $show "$rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*"
--        $run $rm $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*
-+        $show "${rm}r $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*"
-+      $run ${rm}r $objdir/$output $objdir/$libname.* $objdir/${libname}${release}.*
-       else
-         $show "$mkdir $objdir"
-         $run $mkdir $objdir
--      status=$?
--      if test $status -eq 0 || test -d $objdir; then :
--      else
--        exit $status
--      fi
--      fi
--
--      # Check to see if the archive will have undefined symbols.
--      if test "$allow_undefined" = yes; then
--        if test "$allow_undefined_flag" = unsupported; then
--          $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2
--          build_libtool_libs=no
--        build_old_libs=yes
-+        status=$?
-+        if test $status -ne 0 && test ! -d $objdir; then
-+          exit $status
-         fi
--      else
--        # Don't allow undefined symbols.
--        allow_undefined_flag="$no_undefined_flag"
-       fi
--      # Add libc to deplibs on all systems.
--      dependency_libs="$deplibs"
--      deplibs="$deplibs -lc"
--
-       if test "$build_libtool_libs" = yes; then
--        # Get the real and link names of the library.
--        eval library_names=\"$library_names_spec\"
--        set dummy $library_names
--        realname="$2"
--        shift; shift
-+      # Get the real and link names of the library.
-+      eval library_names=\"$library_names_spec\"
-+      set dummy $library_names
-+      realname="$2"
-+      shift; shift
--        if test -n "$soname_spec"; then
--          eval soname=\"$soname_spec\"
--        else
--          soname="$realname"
--        fi
-+      if test -n "$soname_spec"; then
-+        eval soname=\"$soname_spec\"
-+      else
-+        soname="$realname"
-+      fi
--        lib="$objdir/$realname"
-+      lib="$objdir/$realname"
-       for link
-       do
-         linknames="$linknames $link"
-       done
--        # Use standard objects if they are PIC.
--        test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//g'`
-+      # Use standard objects if they are PIC.
-+      test -z "$pic_flag" && libobjs=`$echo "X$libobjs " | $Xsed -e 's/\.lo /.o /g' -e 's/ $//g'`
--        # Do each of the archive commands.
--        eval cmds=\"$archive_cmds\"
--        IFS="${IFS=   }"; save_ifs="$IFS"; IFS=';'
--        for cmd in $cmds; do
--          IFS="$save_ifs"
--          $show "$cmd"
--          $run eval "$cmd" || exit $?
--        done
--        IFS="$save_ifs"
-+      # Transform .lo files to .o files.
-+      test "$build_old_libs" = yes && oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^   ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
--        # Create links to the real library.
--        for linkname in $linknames; do
--          $show "(cd $objdir && $LN_S $realname $linkname)"
--          $run eval '(cd $objdir && $LN_S $realname $linkname)' || exit $?
--        done
-+      if test -n "$whole_archive_flag_spec"; then
-+        if test -n "$convenience"; then
-+          eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
-+        fi
-+      else
-+        for xlib in $convenience; do
-+          # Extract the objects.
-+          xdir="$xlib"x
-+          generated="$generated $xdir"
-+          xlib=`echo "$xlib" | $Xsed -e 's%^.*/%%'`
-+
-+          $show "${rm}r $xdir"
-+          $run ${rm}r "$xdir"
-+          $show "mkdir $xdir"
-+          $run mkdir "$xdir"
-+          status=$?
-+          if test $status -ne 0 && test ! -d "$xdir"; then
-+            exit $status
-+          fi
-+          $show "(cd $xdir && $AR x ../$xlib)"
-+          $run eval "(cd \$xdir && $AR x ../\$xlib)" || exit $?
--        # If -export-dynamic was specified, set the dlname.
--        if test "$export_dynamic" = yes; then
--          # On all known operating systems, these are identical.
--          dlname="$soname"
--        fi
--      fi
-+          libobjs="$libobjs `echo $xdir/*`"
-+        done
-+      fi
--      # Now set the variables for building old libraries.
--      oldlib="$objdir/$libname.a"
-+      # Do each of the archive commands.
-+      eval cmds=\"$archive_cmds\"
-+      IFS="${IFS=     }"; save_ifs="$IFS"; IFS=';'
-+      for cmd in $cmds; do
-+        IFS="$save_ifs"
-+        $show "$cmd"
-+        $run eval "$cmd" || exit $?
-+      done
-+      IFS="$save_ifs"
-+
-+      # Create links to the real library.
-+      for linkname in $linknames; do
-+        if test "$realname" != "$linkname"; then
-+          $show "(cd $objdir && $LN_S $realname $linkname)"
-+          $run eval '(cd $objdir && $LN_S $realname $linkname)' || exit $?
-+        fi
-+      done
-+
-+      # If -export-dynamic was specified, set the dlname.
-+      if test "$export_dynamic" = yes; then
-+        # On all known operating systems, these are identical.
-+        dlname="$soname"
-+      fi
-+      fi
-       ;;
-     *.lo | *.o)
-       if test -n "$link_against_libtool_libs"; then
--        $echo "$modename: error: cannot link libtool libraries into reloadable objects" 1>&2
-+        $echo "$modename: error: cannot link libtool libraries into objects" 1>&2
-         exit 1
-       fi
-       if test -n "$deplibs"; then
--        $echo "$modename: warning: \`-l' and \`-L' are ignored while creating objects" 1>&2
-+        $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2
-       fi
-       if test -n "$dlfiles$dlprefiles"; then
--        $echo "$modename: warning: \`-dlopen' is ignored while creating objects" 1>&2
--        # Nullify the symbol file.
--        compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"`
--        finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"`
-+        $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2
-       fi
-       if test -n "$rpath"; then
--        $echo "$modename: warning: \`-rpath' is ignored while creating objects" 1>&2
-+        $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2
-       fi
-       if test -n "$vinfo"; then
--        $echo "$modename: warning: \`-version-info' is ignored while creating objects" 1>&2
-+        $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2
-       fi
-       if test -n "$release"; then
--        $echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
-+        $echo "$modename: warning: \`-release' is ignored for objects" 1>&2
-       fi
-       case "$output" in
-@@ -1139,7 +1234,7 @@
-       else
-         # Just create a symlink.
-         $show "$LN_S $obj $libobj"
--        $run $LN_S $obj $libobj || exit 1
-+        $run $LN_S $obj $libobj || exit $?
-       fi
-       exit 0
-@@ -1147,11 +1242,11 @@
-     *)
-       if test -n "$vinfo"; then
--        $echo "$modename: warning: \`-version-info' is ignored while linking programs" 1>&2
-+        $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2
-       fi
-       if test -n "$release"; then
--        $echo "$modename: warning: \`-release' is ignored while creating objects" 1>&2
-+        $echo "$modename: warning: \`-release' is ignored for programs" 1>&2
-       fi
-       if test -n "$rpath"; then
-@@ -1223,8 +1318,7 @@
-         $show "$mkdir $objdir"
-         $run $mkdir $objdir
-         status=$?
--        if test $status -eq 0 || test -d $objdir; then :
--        else
-+        if test $status -ne 0 && test ! -d $objdir; then
-           exit $status
-         fi
-       fi
-@@ -1355,13 +1449,11 @@
-       finalize_command=`$echo "X$finalize_command" | $Xsed -e 's%@OUTPUT@%'"$objdir/$output"'T%g'`
-       # Create the binary in the object directory, then wrap it.
--      if test -d $objdir; then :
--      else
-+      if test ! -d $objdir; then
-         $show "$mkdir $objdir"
-       $run $mkdir $objdir
-       status=$?
--      if test $status -eq 0 || test -d $objdir; then :
--      else
-+      if test $status -ne 0 && test ! -d $objdir; then
-         exit $status
-       fi
-       fi
-@@ -1371,7 +1463,7 @@
-         rpath=
-         for dir in $temp_rpath; do
-           case "$dir" in
--          /* | [A-Za-z]:\\*)
-+          /* | [A-Za-z]:[/\\]*)
-             # Absolute path.
-             rpath="$rpath$dir:"
-             ;;
-@@ -1404,13 +1496,11 @@
-         finalize_command="$runpath_var=\"$rpath\$$runpath_var\" $finalize_command"
-       fi
--      case "$hardcode_action" in
--      relink)
-+      if test "$hardcode_action" = relink; then
-         # AGH! Flame the AIX and HP-UX people for me, will ya?
-         $echo "$modename: warning: using a buggy system linker" 1>&2
-         $echo "$modename: relinking will be required before \`$output' can be installed" 1>&2
--        ;;
--      esac
-+      fi
-       $show "$compile_command"
-       $run eval "$compile_command" || exit $?
-@@ -1430,10 +1520,10 @@
-         trap "$rm $output; exit 1" 1 2 15
-         $echo > $output "\
--#! /bin/sh
-+#! $SHELL
- # $output - temporary wrapper script for $objdir/$output
--# Generated by ltmain.sh - GNU $PACKAGE $VERSION
-+# Generated by $PROGRAM - GNU $PACKAGE $VERSION
- #
- # The $output program cannot be directly executed until all the libtool
- # libraries that it depends on are installed.
-@@ -1457,10 +1547,20 @@
-   finalize_command=\"$finalize_command\"
- else
-   # When we are sourced in execute mode, \$file and \$echo are already set.
--  if test \"\$libtool_execute_magic\" = \"$magic\"; then :
--  else
-+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
-     echo=\"$qecho\"
-     file=\"\$0\"
-+    # Make sure echo works.
-+    if test \"X\$1\" = X--no-reexec; then
-+      # Discard the --no-reexec flag, and continue.
-+      shift
-+    elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then
-+      # Yippee, \$echo works!
-+      :
-+    else
-+      # Restart under the correct shell, and then maybe \$echo will work.
-+      exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"}
-+    fi
-   fi\
- "
-         $echo >> $output "\
-@@ -1477,7 +1577,7 @@
-     # If there was a directory component, then change thisdir.
-     if test \"x\$destdir\" != \"x\$file\"; then
-       case \"\$destdir\" in
--      /* | [A-Za-z]:\\*) thisdir=\"\$destdir\" ;;
-+      /* | [A-Za-z]:[/\\]*) thisdir=\"\$destdir\" ;;
-       *) thisdir=\"\$thisdir/\$destdir\" ;;
-       esac
-     fi
-@@ -1537,9 +1637,36 @@
-     esac
-     # See if we need to build an old-fashioned archive.
--    if test "$build_old_libs" = "yes"; then
--      # Transform .lo files to .o files.
--      oldobjs="$objs"`$echo "X$libobjs " | $Xsed -e 's/[^   ]*\.a //g' -e 's/\.lo /.o /g' -e 's/ $//g'`
-+    for oldlib in $oldlibs; do
-+
-+      if test "$build_libtool_libs" = convenience; then
-+      oldobjs="$libobjs"
-+      addlibs="$convenience"
-+      build_libtool_libs=no
-+      else
-+      addlibs="$old_convenience"
-+      fi
-+
-+      # Add in members from convenience archives.
-+      for xlib in $addlibs; do
-+      # Extract the objects.
-+      xdir="$xlib"x
-+      generated="$generated $xdir"
-+      xlib=`echo "$xlib" | $Xsed -e 's%^.*/%%'`
-+
-+      $show "${rm}r $xdir"
-+      $run ${rm}r "$xdir"
-+      $show "mkdir $xdir"
-+      $run mkdir "$xdir"
-+      status=$?
-+      if test $status -ne 0 && test ! -d "$xdir"; then
-+        exit $status
-+      fi
-+      $show "(cd $xdir && $AR x ../$xlib)"
-+      $run eval "(cd \$xdir && $AR x ../\$xlib)" || exit $?
-+
-+      oldobjs="$oldobjs `echo $xdir/*`"
-+      done
-       # Do each command in the archive commands.
-       if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
-@@ -1554,6 +1681,11 @@
-         $run eval "$cmd" || exit $?
-       done
-       IFS="$save_ifs"
-+    done
-+
-+    if test -n "$generated"; then
-+      $show "${rm}r$generated"
-+      $run ${rm}r$generated
-     fi
-     # Now create the libtool archive.
-@@ -1561,14 +1693,13 @@
-     *.la)
-       old_library=
-       test "$build_old_libs" = yes && old_library="$libname.a"
--
-       $show "creating $output"
-       # Only create the output if not a dry run.
-       if test -z "$run"; then
-         $echo > $output "\
- # $output - a libtool library file
--# Generated by ltmain.sh - GNU $PACKAGE $VERSION
-+# Generated by $PROGRAM - GNU $PACKAGE $VERSION
- # The name that we can dlopen(3).
- dlname='$dlname'
-@@ -1595,7 +1726,7 @@
-       # Do a symbolic link so that the libtool archive can be found in
-       # LD_LIBRARY_PATH before the program is installed.
-       $show "(cd $objdir && $LN_S ../$output $output)"
--      $run eval "(cd $objdir && $LN_S ../$output $output)" || exit 1
-+      $run eval "(cd $objdir && $LN_S ../$output $output)" || exit $?
-       ;;
-     esac
-     exit 0
-@@ -1605,7 +1736,7 @@
-   install)
-     modename="$modename: install"
--    # There may be an optional /bin/sh argument at the beginning of
-+    # There may be an optional sh(1) argument at the beginning of
-     # install_prog (especially on Windows NT).
-     if test "$nonopt" = "$SHELL"; then
-       # Aesthetically quote it.
-@@ -1639,7 +1770,7 @@
-     opts=
-     prev=
-     install_type=
--    isdir=
-+    isdir=no
-     stripme=
-     for arg
-     do
-@@ -1709,7 +1840,7 @@
-     # Check to see that the destination is a directory.
-     test -d "$dest" && isdir=yes
--    if test -n "$isdir"; then
-+    if test "$isdir" = yes; then
-       destdir="$dest"
-       destname=
-     else
-@@ -1726,7 +1857,7 @@
-       fi
-     fi
-     case "$destdir" in
--    /* | [A-Za-z]:\\*) ;;
-+    /* | [A-Za-z]:[/\\]*) ;;
-     *)
-       for file in $files; do
-         case "$file" in
-@@ -1759,7 +1890,7 @@
-       *.la)
-         # Check to see that this really is a libtool archive.
--        if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
-+        if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-         else
-           $echo "$modename: \`$file' is not a valid libtool archive" 1>&2
-           $echo "$help" 1>&2
-@@ -1864,7 +1995,7 @@
-         # Deduce the name of the destination old-style object file.
-         case "$destfile" in
-         *.lo)
--          staticdest=`$echo "X$destfile" | $Xsed -e 's/\.lo$/\.o/'`
-+          staticdest=`$echo "X$destfile" | $Xsed -e 's/\.lo$/.o/'`
-           ;;
-         *.o)
-           staticdest="$destfile"
-@@ -1886,7 +2017,7 @@
-         # Install the old object if enabled.
-         if test "$build_old_libs" = yes; then
-           # Deduce the name of the old-style object file.
--          staticobj=`$echo "X$file" | $Xsed -e 's/\.lo$/\.o/'`
-+          staticobj=`$echo "X$file" | $Xsed -e 's/\.lo$/.o/'`
-           $show "$install_prog $staticobj $staticdest"
-           $run eval "$install_prog \$staticobj \$staticdest" || exit $?
-@@ -1895,8 +2026,16 @@
-         ;;
-       *)
-+        # Figure out destination file name, if it wasn't already specified.
-+        if test -n "$destname"; then
-+          destfile="$destdir/$destname"
-+        else
-+          destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'`
-+          destfile="$destdir/$destfile"
-+        fi
-+
-         # Do a test to see if this is really a libtool program.
--        if (sed -e '4q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
-+        if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-           link_against_libtool_libs=
-           finalize_command=
-@@ -1924,10 +2063,7 @@
-               esac
-             fi
-             libfile="$libdir/`$echo "X$lib" | $Xsed -e 's%^.*/%%g'`"
--            if test -z "$libdir"; then
--              $echo "$modename: warning: \`$lib' contains no -rpath information" 1>&2
--            elif test -f "$libfile"; then :
--            else
-+            if test -n "$libdir" && test ! -f "$libfile"; then
-               $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2
-               finalize=no
-             fi
-@@ -1952,8 +2088,8 @@
-           fi
-         fi
--        $show "$install_prog$stripme $file $dest"
--        $run eval "$install_prog\$stripme \$file \$dest" || exit $?
-+        $show "$install_prog$stripme $file $destfile"
-+        $run eval "$install_prog\$stripme \$file \$destfile" || exit $?
-         ;;
-       esac
-     done
-@@ -1996,6 +2132,7 @@
-   finish)
-     modename="$modename: finish"
-     libdirs="$nonopt"
-+    admincmds=
-     if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
-       for dir
-@@ -2011,19 +2148,21 @@
-           for cmd in $cmds; do
-             IFS="$save_ifs"
-             $show "$cmd"
--            $run eval "$cmd"
-+            $run eval "$cmd" || admincmds="$admincmds
-+       $cmd"
-           done
-           IFS="$save_ifs"
-       fi
-       if test -n "$finish_eval"; then
-         # Do the single finish_eval.
-         eval cmds=\"$finish_eval\"
--        $run eval "$cmds"
-+        $run eval "$cmds" || admincmds="$admincmds
-+       $cmds"
-       fi
-       done
-     fi
--    echo "------------------------------------------------------------------------------"
-+    echo "----------------------------------------------------------------------"
-     echo "Libraries have been installed in:"
-     for libdir in $libdirs; do
-       echo "   $libdir"
-@@ -2032,7 +2171,7 @@
-     echo "To link against installed libraries in a given directory, LIBDIR,"
-     echo "you must use the \`-LLIBDIR' flag during linking."
-     echo
--    echo " You will also need to do one of the following:"
-+    echo " You will also need to do at least one of the following:"
-     if test -n "$shlibpath_var"; then
-       echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
-       echo "     during execution"
-@@ -2047,13 +2186,16 @@
-       echo "   - use the \`$flag' linker flag"
-     fi
-+    if test -n "$admincmds"; then
-+      echo "   - have your system administrator run these commands:$admincmds"
-+    fi
-     if test -f /etc/ld.so.conf; then
-       echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
-     fi
-     echo
-     echo "See any operating system documentation about shared libraries for"
-     echo "more information, such as the ld(1) and ld.so(8) manual pages."
--    echo "------------------------------------------------------------------------------"
-+    echo "----------------------------------------------------------------------"
-     exit 0
-     ;;
-@@ -2071,8 +2213,7 @@
-     # Handle -dlopen flags immediately.
-     for file in $execute_dlfiles; do
--      if test -f "$file"; then :
--      else
-+      if test ! -f "$file"; then
-       $echo "$modename: \`$file' is not a file" 1>&2
-       $echo "$help" 1>&2
-       exit 1
-@@ -2082,7 +2223,7 @@
-       case "$file" in
-       *.la)
-         # Check to see that this really is a libtool archive.
--        if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then :
-+        if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then :
-         else
-           $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2
-           $echo "$help" 1>&2
-@@ -2153,7 +2294,7 @@
-       -*) ;;
-       *)
-         # Do a test to see if this is really a libtool program.
--        if (sed -e '4q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
-+        if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-         # If there is no directory component, then add one.
-         case "$file" in
-         */* | *\\*) . $file ;;
-@@ -2174,6 +2315,14 @@
-       # Export the shlibpath_var.
-       eval "export $shlibpath_var"
-+      # Restore saved enviroment variables
-+      if test "${save_LC_ALL+set}" = set; then
-+        LC_ALL="$save_LC_ALL"; export LC_ALL
-+      fi
-+      if test "${save_LANG+set}" = set; then
-+        LANG="$save_LANG"; export LANG
-+      fi
-+
-       # Now actually exec the command.
-       eval "exec \$cmd$args"
-@@ -2218,7 +2367,7 @@
-       case "$name" in
-       *.la)
-         # Possibly a libtool archive, so verify it.
--        if (sed -e '2q' $file | egrep '^# Generated by ltmain\.sh') >/dev/null 2>&1; then
-+        if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then
-           . $dir/$name
-           # Delete the libtool libraries and symlinks.
-@@ -2262,7 +2411,7 @@
-       *.lo)
-         if test "$build_old_libs" = yes; then
--          oldobj=`$echo "X$name" | $Xsed -e 's/\.lo$/\.o/'`
-+          oldobj=`$echo "X$name" | $Xsed -e 's/\.lo$/.o/'`
-           rmfiles="$rmfiles $dir/$oldobj"
-         fi
-       $show "$rm $rmfiles"
-@@ -2297,8 +2446,10 @@
- Provide generalized library-building support services.
-+    --config          show all configuration variables
-+    --debug           enable verbose shell tracing
- -n, --dry-run         display commands without modifying any files
--    --features        display configuration information and exit
-+    --features        display basic configuration information and exit
-     --finish          same as \`--mode=finish'
-     --help            display this help message and exit
-     --mode=MODE       use operation mode MODE [default=inferred from MODE-ARGS]
-@@ -2325,6 +2476,10 @@
- "Usage: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
- Compile a source file into a libtool library object.
-+
-+This mode accepts the following additional options:
-+
-+  -static           always build a \`.o' file suitable for static linking
- COMPILE-COMMAND is a command to be used in creating a \`standard' object file
- from the given SOURCEFILE.
diff --git a/libjpeg-c++.patch b/libjpeg-c++.patch
deleted file mode 100644 (file)
index 3e4166a..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
---- jpeg-6b/jpeglib.h.c++      Sat Jun 17 21:58:15 2000
-+++ jpeg-6b/jpeglib.h  Sat Jun 17 21:58:53 2000
-@@ -13,6 +13,10 @@
- #ifndef JPEGLIB_H
- #define JPEGLIB_H
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
- /*
-  * First we include the configuration files that record how this
-  * installation of the JPEG library is set up.  jconfig.h can be
-@@ -1091,6 +1095,10 @@
- #ifdef JPEG_INTERNALS
- #include <jpegint.h>          /* fetch private declarations */
- #include <jerror.h>           /* fetch error codes too */
-+#endif
-+
-+#ifdef __cplusplus
-+}
- #endif
- #endif /* JPEGLIB_H */
diff --git a/libjpeg-crop.patch b/libjpeg-crop.patch
deleted file mode 100644 (file)
index 2464e7e..0000000
+++ /dev/null
@@ -1,1884 +0,0 @@
-diff -Nur jpeg-6b.orig/jerror.h jpeg-6b/jerror.h
---- jpeg-6b.orig/jerror.h      1997-10-18 20:59:10.000000000 +0200
-+++ jpeg-6b/jerror.h   2000-03-05 23:34:27.000000000 +0100
-@@ -45,6 +45,7 @@
- JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix")
- JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode")
- JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS")
-+JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request")
- JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range")
- JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported")
- JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition")
-diff -Nur jpeg-6b.orig/jpegtran.c jpeg-6b/jpegtran.c
---- jpeg-6b.orig/jpegtran.c    1997-07-24 04:37:26.000000000 +0200
-+++ jpeg-6b/jpegtran.c 2003-09-21 21:30:21.000000000 +0200
-@@ -1,7 +1,7 @@
- /*
-  * jpegtran.c
-  *
-- * Copyright (C) 1995-1997, Thomas G. Lane.
-+ * Copyright (C) 1995-2001, Thomas G. Lane.
-  * This file is part of the Independent JPEG Group's software.
-  * For conditions of distribution and use, see the accompanying README file.
-  *
-@@ -64,8 +64,10 @@
- #endif
- #if TRANSFORMS_SUPPORTED
-   fprintf(stderr, "Switches for modifying the image:\n");
-+  fprintf(stderr, "  -crop WxH+X+Y  Crop to a rectangular subarea\n");
-   fprintf(stderr, "  -grayscale     Reduce to grayscale (omit color data)\n");
-   fprintf(stderr, "  -flip [horizontal|vertical]  Mirror image (left-right or top-bottom)\n");
-+  fprintf(stderr, "  -perfect       Fail if there is non-transformable edge blocks\n");
-   fprintf(stderr, "  -rotate [90|180|270]         Rotate image (degrees clockwise)\n");
-   fprintf(stderr, "  -transpose     Transpose image\n");
-   fprintf(stderr, "  -transverse    Transverse transpose image\n");
-@@ -133,7 +135,9 @@
-   copyoption = JCOPYOPT_DEFAULT;
-   transformoption.transform = JXFORM_NONE;
-   transformoption.trim = FALSE;
-+  transformoption.perfect = FALSE;
-   transformoption.force_grayscale = FALSE;
-+  transformoption.crop = FALSE;
-   cinfo->err->trace_level = 0;
-   /* Scan command line options, adjust parameters */
-@@ -160,7 +164,7 @@
-       exit(EXIT_FAILURE);
- #endif
--    } else if (keymatch(arg, "copy", 1)) {
-+    } else if (keymatch(arg, "copy", 2)) {
-       /* Select which extra markers to copy. */
-       if (++argn >= argc)     /* advance to next argument */
-       usage();
-@@ -173,6 +177,20 @@
-       } else
-       usage();
-+    } else if (keymatch(arg, "crop", 2)) {
-+      /* Perform lossless cropping. */
-+#if TRANSFORMS_SUPPORTED
-+      if (++argn >= argc)     /* advance to next argument */
-+      usage();
-+      if (! jtransform_parse_crop_spec(&transformoption, argv[argn])) {
-+      fprintf(stderr, "%s: bogus -crop argument '%s'\n",
-+              progname, argv[argn]);
-+      exit(EXIT_FAILURE);
-+      }
-+#else
-+      select_transform(JXFORM_NONE);  /* force an error */
-+#endif
-+
-     } else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
-       /* Enable debug printouts. */
-       /* On first -d, print version identification */
-@@ -233,7 +251,12 @@
-       usage();
-       outfilename = argv[argn];       /* save it away for later use */
--    } else if (keymatch(arg, "progressive", 1)) {
-+    } else if (keymatch(arg, "perfect", 2)) {
-+      /* Fail if there is any partial edge MCUs that the transform can't
-+       * handle. */
-+      transformoption.perfect = TRUE;
-+
-+    } else if (keymatch(arg, "progressive", 2)) {
-       /* Select simple progressive mode. */
- #ifdef C_PROGRESSIVE_SUPPORTED
-       simple_progressive = TRUE;
-@@ -342,8 +365,10 @@
-   jvirt_barray_ptr * src_coef_arrays;
-   jvirt_barray_ptr * dst_coef_arrays;
-   int file_index;
--  FILE * input_file;
--  FILE * output_file;
-+  /* We assume all-in-memory processing and can therefore use only a
-+   * single file pointer for sequential input and output operation. 
-+   */
-+  FILE * fp;
-   /* On Mac, fetch a command line. */
- #ifdef USE_CCOMMAND
-@@ -406,24 +431,13 @@
-   /* Open the input file. */
-   if (file_index < argc) {
--    if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {
--      fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]);
-+    if ((fp = fopen(argv[file_index], READ_BINARY)) == NULL) {
-+      fprintf(stderr, "%s: can't open %s for reading\n", progname, argv[file_index]);
-       exit(EXIT_FAILURE);
-     }
-   } else {
-     /* default input file is stdin */
--    input_file = read_stdin();
--  }
--
--  /* Open the output file. */
--  if (outfilename != NULL) {
--    if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {
--      fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
--      exit(EXIT_FAILURE);
--    }
--  } else {
--    /* default output file is stdout */
--    output_file = write_stdout();
-+    fp = read_stdin();
-   }
- #ifdef PROGRESS_REPORT
-@@ -431,7 +445,7 @@
- #endif
-   /* Specify data source for decompression */
--  jpeg_stdio_src(&srcinfo, input_file);
-+  jpeg_stdio_src(&srcinfo, fp);
-   /* Enable saving of extra markers that we want to copy */
-   jcopy_markers_setup(&srcinfo, copyoption);
-@@ -443,6 +457,15 @@
-    * jpeg_read_coefficients so that memory allocation will be done right.
-    */
- #if TRANSFORMS_SUPPORTED
-+  /* Fails right away if -perfect is given and transformation is not perfect.
-+   */
-+  if (transformoption.perfect &&
-+      !jtransform_perfect_transform(srcinfo.image_width, srcinfo.image_height,
-+      srcinfo.max_h_samp_factor * DCTSIZE, srcinfo.max_v_samp_factor * DCTSIZE,
-+      transformoption.transform)) {
-+    fprintf(stderr, "%s: transformation is not perfect\n", progname);
-+    exit(EXIT_FAILURE);
-+  }
-   jtransform_request_workspace(&srcinfo, &transformoption);
- #endif
-@@ -463,11 +486,32 @@
-   dst_coef_arrays = src_coef_arrays;
- #endif
-+  /* Close input file, if we opened it.
-+   * Note: we assume that jpeg_read_coefficients consumed all input
-+   * until JPEG_REACHED_EOI, and that jpeg_finish_decompress will
-+   * only consume more while (! cinfo->inputctl->eoi_reached).
-+   * We cannot call jpeg_finish_decompress here since we still need the
-+   * virtual arrays allocated from the source object for processing.
-+   */
-+  if (fp != stdin)
-+    fclose(fp);
-+
-+  /* Open the output file. */
-+  if (outfilename != NULL) {
-+    if ((fp = fopen(outfilename, WRITE_BINARY)) == NULL) {
-+      fprintf(stderr, "%s: can't open %s for writing\n", progname, outfilename);
-+      exit(EXIT_FAILURE);
-+    }
-+  } else {
-+    /* default output file is stdout */
-+    fp = write_stdout();
-+  }
-+
-   /* Adjust default compression parameters by re-parsing the options */
-   file_index = parse_switches(&dstinfo, argc, argv, 0, TRUE);
-   /* Specify data destination for compression */
--  jpeg_stdio_dest(&dstinfo, output_file);
-+  jpeg_stdio_dest(&dstinfo, fp);
-   /* Start compressor (note no image data is actually written here) */
-   jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
-@@ -488,11 +532,9 @@
-   (void) jpeg_finish_decompress(&srcinfo);
-   jpeg_destroy_decompress(&srcinfo);
--  /* Close files, if we opened them */
--  if (input_file != stdin)
--    fclose(input_file);
--  if (output_file != stdout)
--    fclose(output_file);
-+  /* Close output file, if we opened it */
-+  if (fp != stdout)
-+    fclose(fp);
- #ifdef PROGRESS_REPORT
-   end_progress_monitor((j_common_ptr) &dstinfo);
-diff -Nur jpeg-6b.orig/transupp.c jpeg-6b/transupp.c
---- jpeg-6b.orig/transupp.c    1997-08-10 02:15:26.000000000 +0200
-+++ jpeg-6b/transupp.c 2003-09-21 22:50:33.000000000 +0200
-@@ -1,7 +1,7 @@
- /*
-  * transupp.c
-  *
-- * Copyright (C) 1997, Thomas G. Lane.
-+ * Copyright (C) 1997-2001, Thomas G. Lane.
-  * This file is part of the Independent JPEG Group's software.
-  * For conditions of distribution and use, see the accompanying README file.
-  *
-@@ -20,6 +20,7 @@
- #include "jinclude.h"
- #include "jpeglib.h"
- #include "transupp.h"         /* My own external interface */
-+#include <ctype.h>            /* to declare isdigit() */
- #if TRANSFORMS_SUPPORTED
-@@ -28,7 +29,8 @@
-  * Lossless image transformation routines.  These routines work on DCT
-  * coefficient arrays and thus do not require any lossy decompression
-  * or recompression of the image.
-- * Thanks to Guido Vollbeding for the initial design and code of this feature.
-+ * Thanks to Guido Vollbeding for the initial design and code of this feature,
-+ * and to Ben Jackson for introducing the cropping feature.
-  *
-  * Horizontal flipping is done in-place, using a single top-to-bottom
-  * pass through the virtual source array.  It will thus be much the
-@@ -42,6 +44,13 @@
-  * arrays for most of the transforms.  That could result in much thrashing
-  * if the image is larger than main memory.
-  *
-+ * If cropping or trimming is involved, the destination arrays may be smaller
-+ * than the source arrays.  Note it is not possible to do horizontal flip
-+ * in-place when a nonzero Y crop offset is specified, since we'd have to move
-+ * data from one block row to another but the virtual array manager doesn't
-+ * guarantee we can touch more than one row at a time.  So in that case,
-+ * we have to use a separate destination array.
-+ *
-  * Some notes about the operating environment of the individual transform
-  * routines:
-  * 1. Both the source and destination virtual arrays are allocated from the
-@@ -54,20 +63,65 @@
-  *    and we may as well take that as the effective iMCU size.
-  * 4. When "trim" is in effect, the destination's dimensions will be the
-  *    trimmed values but the source's will be untrimmed.
-- * 5. All the routines assume that the source and destination buffers are
-+ * 5. When "crop" is in effect, the destination's dimensions will be the
-+ *    cropped values but the source's will be uncropped.  Each transform
-+ *    routine is responsible for picking up source data starting at the
-+ *    correct X and Y offset for the crop region.  (The X and Y offsets
-+ *    passed to the transform routines are measured in iMCU blocks of the
-+ *    destination.)
-+ * 6. All the routines assume that the source and destination buffers are
-  *    padded out to a full iMCU boundary.  This is true, although for the
-  *    source buffer it is an undocumented property of jdcoefct.c.
-- * Notes 2,3,4 boil down to this: generally we should use the destination's
-- * dimensions and ignore the source's.
-  */
- LOCAL(void)
--do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
--         jvirt_barray_ptr *src_coef_arrays)
--/* Horizontal flip; done in-place, so no separate dest array is required */
-+do_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+       JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-+       jvirt_barray_ptr *src_coef_arrays,
-+       jvirt_barray_ptr *dst_coef_arrays)
-+/* Crop.  This is only used when no rotate/flip is requested with the crop. */
-+{
-+  JDIMENSION dst_blk_y, x_crop_blocks, y_crop_blocks;
-+  int ci, offset_y;
-+  JBLOCKARRAY src_buffer, dst_buffer;
-+  jpeg_component_info *compptr;
-+
-+  /* We simply have to copy the right amount of data (the destination's
-+   * image size) starting at the given X and Y offsets in the source.
-+   */
-+  for (ci = 0; ci < dstinfo->num_components; ci++) {
-+    compptr = dstinfo->comp_info + ci;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-+    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-+       dst_blk_y += compptr->v_samp_factor) {
-+      dst_buffer = (*srcinfo->mem->access_virt_barray)
-+      ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
-+       (JDIMENSION) compptr->v_samp_factor, TRUE);
-+      src_buffer = (*srcinfo->mem->access_virt_barray)
-+      ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+       dst_blk_y + y_crop_blocks,
-+       (JDIMENSION) compptr->v_samp_factor, FALSE);
-+      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
-+      jcopy_block_row(src_buffer[offset_y] + x_crop_blocks,
-+                      dst_buffer[offset_y],
-+                      compptr->width_in_blocks);
-+      }
-+    }
-+  }
-+}
-+
-+
-+LOCAL(void)
-+do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+                 JDIMENSION x_crop_offset,
-+                 jvirt_barray_ptr *src_coef_arrays)
-+/* Horizontal flip; done in-place, so no separate dest array is required.
-+ * NB: this only works when y_crop_offset is zero.
-+ */
- {
--  JDIMENSION MCU_cols, comp_width, blk_x, blk_y;
-+  JDIMENSION MCU_cols, comp_width, blk_x, blk_y, x_crop_blocks;
-   int ci, k, offset_y;
-   JBLOCKARRAY buffer;
-   JCOEFPTR ptr1, ptr2;
-@@ -79,17 +133,19 @@
-    * mirroring by changing the signs of odd-numbered columns.
-    * Partial iMCUs at the right edge are left untouched.
-    */
--  MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
-+  MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_width = MCU_cols * compptr->h_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-     for (blk_y = 0; blk_y < compptr->height_in_blocks;
-        blk_y += compptr->v_samp_factor) {
-       buffer = (*srcinfo->mem->access_virt_barray)
-       ((j_common_ptr) srcinfo, src_coef_arrays[ci], blk_y,
-        (JDIMENSION) compptr->v_samp_factor, TRUE);
-       for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
-+      /* Do the mirroring */
-       for (blk_x = 0; blk_x * 2 < comp_width; blk_x++) {
-         ptr1 = buffer[offset_y][blk_x];
-         ptr2 = buffer[offset_y][comp_width - blk_x - 1];
-@@ -105,6 +161,79 @@
-           *ptr2++ = -temp1;
-         }
-       }
-+      if (x_crop_blocks > 0) {
-+        /* Now left-justify the portion of the data to be kept.
-+         * We can't use a single jcopy_block_row() call because that routine
-+         * depends on memcpy(), whose behavior is unspecified for overlapping
-+         * source and destination areas.  Sigh.
-+         */
-+        for (blk_x = 0; blk_x < compptr->width_in_blocks; blk_x++) {
-+          jcopy_block_row(buffer[offset_y] + blk_x + x_crop_blocks,
-+                          buffer[offset_y] + blk_x,
-+                          (JDIMENSION) 1);
-+        }
-+      }
-+      }
-+    }
-+  }
-+}
-+
-+
-+LOCAL(void)
-+do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+         JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-+         jvirt_barray_ptr *src_coef_arrays,
-+         jvirt_barray_ptr *dst_coef_arrays)
-+/* Horizontal flip in general cropping case */
-+{
-+  JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-+  int ci, k, offset_y;
-+  JBLOCKARRAY src_buffer, dst_buffer;
-+  JBLOCKROW src_row_ptr, dst_row_ptr;
-+  JCOEFPTR src_ptr, dst_ptr;
-+  jpeg_component_info *compptr;
-+
-+  /* Here we must output into a separate array because we can't touch
-+   * different rows of a single virtual array simultaneously.  Otherwise,
-+   * this is essentially the same as the routine above.
-+   */
-+  MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
-+
-+  for (ci = 0; ci < dstinfo->num_components; ci++) {
-+    compptr = dstinfo->comp_info + ci;
-+    comp_width = MCU_cols * compptr->h_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-+    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-+       dst_blk_y += compptr->v_samp_factor) {
-+      dst_buffer = (*srcinfo->mem->access_virt_barray)
-+      ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
-+       (JDIMENSION) compptr->v_samp_factor, TRUE);
-+      src_buffer = (*srcinfo->mem->access_virt_barray)
-+      ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+       dst_blk_y + y_crop_blocks,
-+       (JDIMENSION) compptr->v_samp_factor, FALSE);
-+      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
-+      dst_row_ptr = dst_buffer[offset_y];
-+      src_row_ptr = src_buffer[offset_y];
-+      for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
-+        if (x_crop_blocks + dst_blk_x < comp_width) {
-+          /* Do the mirrorable blocks */
-+          dst_ptr = dst_row_ptr[dst_blk_x];
-+          src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
-+          /* this unrolled loop doesn't need to know which row it's on... */
-+          for (k = 0; k < DCTSIZE2; k += 2) {
-+            *dst_ptr++ = *src_ptr++;   /* copy even column */
-+            *dst_ptr++ = - *src_ptr++; /* copy odd column with sign change */
-+          }
-+        } else {
-+          /* Copy last partial block(s) verbatim */
-+          jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,
-+                          dst_row_ptr + dst_blk_x,
-+                          (JDIMENSION) 1);
-+        }
-+      }
-       }
-     }
-   }
-@@ -113,11 +242,13 @@
- LOCAL(void)
- do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+         JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-          jvirt_barray_ptr *src_coef_arrays,
-          jvirt_barray_ptr *dst_coef_arrays)
- /* Vertical flip */
- {
-   JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JBLOCKROW src_row_ptr, dst_row_ptr;
-@@ -131,33 +262,38 @@
-    * of odd-numbered rows.
-    * Partial iMCUs at the bottom edge are copied verbatim.
-    */
--  MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-+  MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_height = MCU_rows * compptr->v_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-       ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
-        (JDIMENSION) compptr->v_samp_factor, TRUE);
--      if (dst_blk_y < comp_height) {
-+      if (y_crop_blocks + dst_blk_y < comp_height) {
-       /* Row is within the mirrorable area. */
-       src_buffer = (*srcinfo->mem->access_virt_barray)
-         ((j_common_ptr) srcinfo, src_coef_arrays[ci],
--         comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor,
-+         comp_height - y_crop_blocks - dst_blk_y -
-+         (JDIMENSION) compptr->v_samp_factor,
-          (JDIMENSION) compptr->v_samp_factor, FALSE);
-       } else {
-       /* Bottom-edge blocks will be copied verbatim. */
-       src_buffer = (*srcinfo->mem->access_virt_barray)
--        ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y,
-+        ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+         dst_blk_y + y_crop_blocks,
-          (JDIMENSION) compptr->v_samp_factor, FALSE);
-       }
-       for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
--      if (dst_blk_y < comp_height) {
-+      if (y_crop_blocks + dst_blk_y < comp_height) {
-         /* Row is within the mirrorable area. */
-         dst_row_ptr = dst_buffer[offset_y];
-         src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];
-+        src_row_ptr += x_crop_blocks;
-         for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;
-              dst_blk_x++) {
-           dst_ptr = dst_row_ptr[dst_blk_x];
-@@ -173,7 +309,8 @@
-         }
-       } else {
-         /* Just copy row verbatim. */
--        jcopy_block_row(src_buffer[offset_y], dst_buffer[offset_y],
-+        jcopy_block_row(src_buffer[offset_y] + x_crop_blocks,
-+                        dst_buffer[offset_y],
-                         compptr->width_in_blocks);
-       }
-       }
-@@ -184,11 +321,12 @@
- LOCAL(void)
- do_transpose (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+            JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-             jvirt_barray_ptr *src_coef_arrays,
-             jvirt_barray_ptr *dst_coef_arrays)
- /* Transpose source into destination */
- {
--  JDIMENSION dst_blk_x, dst_blk_y;
-+  JDIMENSION dst_blk_x, dst_blk_y, x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_x, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JCOEFPTR src_ptr, dst_ptr;
-@@ -201,6 +339,8 @@
-    */
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-@@ -210,11 +350,12 @@
-       for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;
-            dst_blk_x += compptr->h_samp_factor) {
-         src_buffer = (*srcinfo->mem->access_virt_barray)
--          ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x,
-+          ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+           dst_blk_x + x_crop_blocks,
-            (JDIMENSION) compptr->h_samp_factor, FALSE);
-         for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {
--          src_ptr = src_buffer[offset_x][dst_blk_y + offset_y];
-           dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+          src_ptr = src_buffer[offset_x][dst_blk_y + offset_y + y_crop_blocks];
-           for (i = 0; i < DCTSIZE; i++)
-             for (j = 0; j < DCTSIZE; j++)
-               dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -228,6 +369,7 @@
- LOCAL(void)
- do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+         JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-          jvirt_barray_ptr *src_coef_arrays,
-          jvirt_barray_ptr *dst_coef_arrays)
- /* 90 degree rotation is equivalent to
-@@ -237,6 +379,7 @@
-  */
- {
-   JDIMENSION MCU_cols, comp_width, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_x, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JCOEFPTR src_ptr, dst_ptr;
-@@ -246,11 +389,13 @@
-    * at the (output) right edge properly.  They just get transposed and
-    * not mirrored.
-    */
--  MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
-+  MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_width = MCU_cols * compptr->h_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-@@ -259,15 +404,26 @@
-       for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
-       for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;
-            dst_blk_x += compptr->h_samp_factor) {
--        src_buffer = (*srcinfo->mem->access_virt_barray)
--          ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x,
--           (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        if (x_crop_blocks + dst_blk_x < comp_width) {
-+          /* Block is within the mirrorable area. */
-+          src_buffer = (*srcinfo->mem->access_virt_barray)
-+            ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+             comp_width - x_crop_blocks - dst_blk_x -
-+             (JDIMENSION) compptr->h_samp_factor,
-+             (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        } else {
-+          /* Edge blocks are transposed but not mirrored. */
-+          src_buffer = (*srcinfo->mem->access_virt_barray)
-+            ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+             dst_blk_x + x_crop_blocks,
-+             (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        }
-         for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {
--          src_ptr = src_buffer[offset_x][dst_blk_y + offset_y];
--          if (dst_blk_x < comp_width) {
-+          dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+          if (x_crop_blocks + dst_blk_x < comp_width) {
-             /* Block is within the mirrorable area. */
--            dst_ptr = dst_buffer[offset_y]
--              [comp_width - dst_blk_x - offset_x - 1];
-+            src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]
-+              [dst_blk_y + offset_y + y_crop_blocks];
-             for (i = 0; i < DCTSIZE; i++) {
-               for (j = 0; j < DCTSIZE; j++)
-                 dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -277,7 +433,8 @@
-             }
-           } else {
-             /* Edge blocks are transposed but not mirrored. */
--            dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+            src_ptr = src_buffer[offset_x]
-+              [dst_blk_y + offset_y + y_crop_blocks];
-             for (i = 0; i < DCTSIZE; i++)
-               for (j = 0; j < DCTSIZE; j++)
-                 dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -292,6 +449,7 @@
- LOCAL(void)
- do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+          JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-           jvirt_barray_ptr *src_coef_arrays,
-           jvirt_barray_ptr *dst_coef_arrays)
- /* 270 degree rotation is equivalent to
-@@ -301,6 +459,7 @@
-  */
- {
-   JDIMENSION MCU_rows, comp_height, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_x, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JCOEFPTR src_ptr, dst_ptr;
-@@ -310,11 +469,13 @@
-    * at the (output) bottom edge properly.  They just get transposed and
-    * not mirrored.
-    */
--  MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-+  MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_height = MCU_rows * compptr->v_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-@@ -324,14 +485,15 @@
-       for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;
-            dst_blk_x += compptr->h_samp_factor) {
-         src_buffer = (*srcinfo->mem->access_virt_barray)
--          ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x,
-+          ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+           dst_blk_x + x_crop_blocks,
-            (JDIMENSION) compptr->h_samp_factor, FALSE);
-         for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {
-           dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
--          if (dst_blk_y < comp_height) {
-+          if (y_crop_blocks + dst_blk_y < comp_height) {
-             /* Block is within the mirrorable area. */
-             src_ptr = src_buffer[offset_x]
--              [comp_height - dst_blk_y - offset_y - 1];
-+              [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];
-             for (i = 0; i < DCTSIZE; i++) {
-               for (j = 0; j < DCTSIZE; j++) {
-                 dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -341,7 +503,8 @@
-             }
-           } else {
-             /* Edge blocks are transposed but not mirrored. */
--            src_ptr = src_buffer[offset_x][dst_blk_y + offset_y];
-+            src_ptr = src_buffer[offset_x]
-+              [dst_blk_y + offset_y + y_crop_blocks];
-             for (i = 0; i < DCTSIZE; i++)
-               for (j = 0; j < DCTSIZE; j++)
-                 dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -356,6 +519,7 @@
- LOCAL(void)
- do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+          JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-           jvirt_barray_ptr *src_coef_arrays,
-           jvirt_barray_ptr *dst_coef_arrays)
- /* 180 degree rotation is equivalent to
-@@ -365,89 +529,93 @@
-  */
- {
-   JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JBLOCKROW src_row_ptr, dst_row_ptr;
-   JCOEFPTR src_ptr, dst_ptr;
-   jpeg_component_info *compptr;
--  MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
--  MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-+  MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
-+  MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_width = MCU_cols * compptr->h_samp_factor;
-     comp_height = MCU_rows * compptr->v_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-       ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
-        (JDIMENSION) compptr->v_samp_factor, TRUE);
--      if (dst_blk_y < comp_height) {
-+      if (y_crop_blocks + dst_blk_y < comp_height) {
-       /* Row is within the vertically mirrorable area. */
-       src_buffer = (*srcinfo->mem->access_virt_barray)
-         ((j_common_ptr) srcinfo, src_coef_arrays[ci],
--         comp_height - dst_blk_y - (JDIMENSION) compptr->v_samp_factor,
-+         comp_height - y_crop_blocks - dst_blk_y -
-+         (JDIMENSION) compptr->v_samp_factor,
-          (JDIMENSION) compptr->v_samp_factor, FALSE);
-       } else {
-       /* Bottom-edge rows are only mirrored horizontally. */
-       src_buffer = (*srcinfo->mem->access_virt_barray)
--        ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_y,
-+        ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+         dst_blk_y + y_crop_blocks,
-          (JDIMENSION) compptr->v_samp_factor, FALSE);
-       }
-       for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
--      if (dst_blk_y < comp_height) {
-+      dst_row_ptr = dst_buffer[offset_y];
-+      if (y_crop_blocks + dst_blk_y < comp_height) {
-         /* Row is within the mirrorable area. */
--        dst_row_ptr = dst_buffer[offset_y];
-         src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];
--        /* Process the blocks that can be mirrored both ways. */
--        for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) {
-+        for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
-           dst_ptr = dst_row_ptr[dst_blk_x];
--          src_ptr = src_row_ptr[comp_width - dst_blk_x - 1];
--          for (i = 0; i < DCTSIZE; i += 2) {
--            /* For even row, negate every odd column. */
--            for (j = 0; j < DCTSIZE; j += 2) {
--              *dst_ptr++ = *src_ptr++;
--              *dst_ptr++ = - *src_ptr++;
-+          if (x_crop_blocks + dst_blk_x < comp_width) {
-+            /* Process the blocks that can be mirrored both ways. */
-+            src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
-+            for (i = 0; i < DCTSIZE; i += 2) {
-+              /* For even row, negate every odd column. */
-+              for (j = 0; j < DCTSIZE; j += 2) {
-+                *dst_ptr++ = *src_ptr++;
-+                *dst_ptr++ = - *src_ptr++;
-+              }
-+              /* For odd row, negate every even column. */
-+              for (j = 0; j < DCTSIZE; j += 2) {
-+                *dst_ptr++ = - *src_ptr++;
-+                *dst_ptr++ = *src_ptr++;
-+              }
-             }
--            /* For odd row, negate every even column. */
--            for (j = 0; j < DCTSIZE; j += 2) {
--              *dst_ptr++ = - *src_ptr++;
--              *dst_ptr++ = *src_ptr++;
-+          } else {
-+            /* Any remaining right-edge blocks are only mirrored vertically. */
-+            src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x];
-+            for (i = 0; i < DCTSIZE; i += 2) {
-+              for (j = 0; j < DCTSIZE; j++)
-+                *dst_ptr++ = *src_ptr++;
-+              for (j = 0; j < DCTSIZE; j++)
-+                *dst_ptr++ = - *src_ptr++;
-             }
-           }
-         }
--        /* Any remaining right-edge blocks are only mirrored vertically. */
--        for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
--          dst_ptr = dst_row_ptr[dst_blk_x];
--          src_ptr = src_row_ptr[dst_blk_x];
--          for (i = 0; i < DCTSIZE; i += 2) {
--            for (j = 0; j < DCTSIZE; j++)
--              *dst_ptr++ = *src_ptr++;
--            for (j = 0; j < DCTSIZE; j++)
--              *dst_ptr++ = - *src_ptr++;
--          }
--        }
-       } else {
-         /* Remaining rows are just mirrored horizontally. */
--        dst_row_ptr = dst_buffer[offset_y];
-         src_row_ptr = src_buffer[offset_y];
--        /* Process the blocks that can be mirrored. */
--        for (dst_blk_x = 0; dst_blk_x < comp_width; dst_blk_x++) {
--          dst_ptr = dst_row_ptr[dst_blk_x];
--          src_ptr = src_row_ptr[comp_width - dst_blk_x - 1];
--          for (i = 0; i < DCTSIZE2; i += 2) {
--            *dst_ptr++ = *src_ptr++;
--            *dst_ptr++ = - *src_ptr++;
-+        for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
-+          if (x_crop_blocks + dst_blk_x < comp_width) {
-+            /* Process the blocks that can be mirrored. */
-+            dst_ptr = dst_row_ptr[dst_blk_x];
-+            src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
-+            for (i = 0; i < DCTSIZE2; i += 2) {
-+              *dst_ptr++ = *src_ptr++;
-+              *dst_ptr++ = - *src_ptr++;
-+            }
-+          } else {
-+            /* Any remaining right-edge blocks are only copied. */
-+            jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,
-+                            dst_row_ptr + dst_blk_x,
-+                            (JDIMENSION) 1);
-           }
-         }
--        /* Any remaining right-edge blocks are only copied. */
--        for (; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
--          dst_ptr = dst_row_ptr[dst_blk_x];
--          src_ptr = src_row_ptr[dst_blk_x];
--          for (i = 0; i < DCTSIZE2; i++)
--            *dst_ptr++ = *src_ptr++;
--        }
-       }
-       }
-     }
-@@ -457,6 +625,7 @@
- LOCAL(void)
- do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-+             JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
-              jvirt_barray_ptr *src_coef_arrays,
-              jvirt_barray_ptr *dst_coef_arrays)
- /* Transverse transpose is equivalent to
-@@ -470,18 +639,21 @@
-  */
- {
-   JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;
-+  JDIMENSION x_crop_blocks, y_crop_blocks;
-   int ci, i, j, offset_x, offset_y;
-   JBLOCKARRAY src_buffer, dst_buffer;
-   JCOEFPTR src_ptr, dst_ptr;
-   jpeg_component_info *compptr;
--  MCU_cols = dstinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE);
--  MCU_rows = dstinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE);
-+  MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE);
-+  MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE);
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-     comp_width = MCU_cols * compptr->h_samp_factor;
-     comp_height = MCU_rows * compptr->v_samp_factor;
-+    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
-+    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
-     for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
-        dst_blk_y += compptr->v_samp_factor) {
-       dst_buffer = (*srcinfo->mem->access_virt_barray)
-@@ -490,17 +662,26 @@
-       for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
-       for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks;
-            dst_blk_x += compptr->h_samp_factor) {
--        src_buffer = (*srcinfo->mem->access_virt_barray)
--          ((j_common_ptr) srcinfo, src_coef_arrays[ci], dst_blk_x,
--           (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        if (x_crop_blocks + dst_blk_x < comp_width) {
-+          /* Block is within the mirrorable area. */
-+          src_buffer = (*srcinfo->mem->access_virt_barray)
-+            ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+             comp_width - x_crop_blocks - dst_blk_x -
-+             (JDIMENSION) compptr->h_samp_factor,
-+             (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        } else {
-+          src_buffer = (*srcinfo->mem->access_virt_barray)
-+            ((j_common_ptr) srcinfo, src_coef_arrays[ci],
-+             dst_blk_x + x_crop_blocks,
-+             (JDIMENSION) compptr->h_samp_factor, FALSE);
-+        }
-         for (offset_x = 0; offset_x < compptr->h_samp_factor; offset_x++) {
--          if (dst_blk_y < comp_height) {
--            src_ptr = src_buffer[offset_x]
--              [comp_height - dst_blk_y - offset_y - 1];
--            if (dst_blk_x < comp_width) {
-+          dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+          if (y_crop_blocks + dst_blk_y < comp_height) {
-+            if (x_crop_blocks + dst_blk_x < comp_width) {
-               /* Block is within the mirrorable area. */
--              dst_ptr = dst_buffer[offset_y]
--                [comp_width - dst_blk_x - offset_x - 1];
-+              src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]
-+                [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];
-               for (i = 0; i < DCTSIZE; i++) {
-                 for (j = 0; j < DCTSIZE; j++) {
-                   dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -516,7 +697,8 @@
-               }
-             } else {
-               /* Right-edge blocks are mirrored in y only */
--              dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+              src_ptr = src_buffer[offset_x]
-+                [comp_height - y_crop_blocks - dst_blk_y - offset_y - 1];
-               for (i = 0; i < DCTSIZE; i++) {
-                 for (j = 0; j < DCTSIZE; j++) {
-                   dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -526,11 +708,10 @@
-               }
-             }
-           } else {
--            src_ptr = src_buffer[offset_x][dst_blk_y + offset_y];
--            if (dst_blk_x < comp_width) {
-+            if (x_crop_blocks + dst_blk_x < comp_width) {
-               /* Bottom-edge blocks are mirrored in x only */
--              dst_ptr = dst_buffer[offset_y]
--                [comp_width - dst_blk_x - offset_x - 1];
-+              src_ptr = src_buffer[compptr->h_samp_factor - offset_x - 1]
-+                [dst_blk_y + offset_y + y_crop_blocks];
-               for (i = 0; i < DCTSIZE; i++) {
-                 for (j = 0; j < DCTSIZE; j++)
-                   dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -540,7 +721,8 @@
-               }
-             } else {
-               /* At lower right corner, just transpose, no mirroring */
--              dst_ptr = dst_buffer[offset_y][dst_blk_x + offset_x];
-+              src_ptr = src_buffer[offset_x]
-+                [dst_blk_y + offset_y + y_crop_blocks];
-               for (i = 0; i < DCTSIZE; i++)
-                 for (j = 0; j < DCTSIZE; j++)
-                   dst_ptr[j*DCTSIZE+i] = src_ptr[i*DCTSIZE+j];
-@@ -554,8 +736,116 @@
- }
-+/* Parse an unsigned integer: subroutine for jtransform_parse_crop_spec.
-+ * Returns TRUE if valid integer found, FALSE if not.
-+ * *strptr is advanced over the digit string, and *result is set to its value.
-+ */
-+
-+LOCAL(boolean)
-+jt_read_integer (const char ** strptr, JDIMENSION * result)
-+{
-+  const char * ptr = *strptr;
-+  JDIMENSION val = 0;
-+
-+  for (; isdigit(*ptr); ptr++) {
-+    val = val * 10 + (JDIMENSION) (*ptr - '0');
-+  }
-+  *result = val;
-+  if (ptr == *strptr)
-+    return FALSE;             /* oops, no digits */
-+  *strptr = ptr;
-+  return TRUE;
-+}
-+
-+
-+/* Parse a crop specification (written in X11 geometry style).
-+ * The routine returns TRUE if the spec string is valid, FALSE if not.
-+ *
-+ * The crop spec string should have the format
-+ *    <width>x<height>{+-}<xoffset>{+-}<yoffset>
-+ * where width, height, xoffset, and yoffset are unsigned integers.
-+ * Each of the elements can be omitted to indicate a default value.
-+ * (A weakness of this style is that it is not possible to omit xoffset
-+ * while specifying yoffset, since they look alike.)
-+ *
-+ * This code is loosely based on XParseGeometry from the X11 distribution.
-+ */
-+
-+GLOBAL(boolean)
-+jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec)
-+{
-+  info->crop = FALSE;
-+  info->crop_width_set = JCROP_UNSET;
-+  info->crop_height_set = JCROP_UNSET;
-+  info->crop_xoffset_set = JCROP_UNSET;
-+  info->crop_yoffset_set = JCROP_UNSET;
-+
-+  if (isdigit(*spec)) {
-+    /* fetch width */
-+    if (! jt_read_integer(&spec, &info->crop_width))
-+      return FALSE;
-+    info->crop_width_set = JCROP_POS;
-+  }
-+  if (*spec == 'x' || *spec == 'X') { 
-+    /* fetch height */
-+    spec++;
-+    if (! jt_read_integer(&spec, &info->crop_height))
-+      return FALSE;
-+    info->crop_height_set = JCROP_POS;
-+  }
-+  if (*spec == '+' || *spec == '-') {
-+    /* fetch xoffset */
-+    info->crop_xoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS;
-+    spec++;
-+    if (! jt_read_integer(&spec, &info->crop_xoffset))
-+      return FALSE;
-+  }
-+  if (*spec == '+' || *spec == '-') {
-+    /* fetch yoffset */
-+    info->crop_yoffset_set = (*spec == '-') ? JCROP_NEG : JCROP_POS;
-+    spec++;
-+    if (! jt_read_integer(&spec, &info->crop_yoffset))
-+      return FALSE;
-+  }
-+  /* We had better have gotten to the end of the string. */
-+  if (*spec != '\0')
-+    return FALSE;
-+  info->crop = TRUE;
-+  return TRUE;
-+}
-+
-+
-+/* Trim off any partial iMCUs on the indicated destination edge */
-+
-+LOCAL(void)
-+trim_right_edge (jpeg_transform_info *info, JDIMENSION full_width)
-+{
-+  JDIMENSION MCU_cols;
-+
-+  MCU_cols = info->output_width / (info->max_h_samp_factor * DCTSIZE);
-+  if (MCU_cols > 0 && info->x_crop_offset + MCU_cols ==
-+      full_width / (info->max_h_samp_factor * DCTSIZE))
-+    info->output_width = MCU_cols * (info->max_h_samp_factor * DCTSIZE);
-+}
-+
-+LOCAL(void)
-+trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height)
-+{
-+  JDIMENSION MCU_rows;
-+
-+  MCU_rows = info->output_height / (info->max_v_samp_factor * DCTSIZE);
-+  if (MCU_rows > 0 && info->y_crop_offset + MCU_rows ==
-+      full_height / (info->max_v_samp_factor * DCTSIZE))
-+    info->output_height = MCU_rows * (info->max_v_samp_factor * DCTSIZE);
-+}
-+
-+
- /* Request any required workspace.
-  *
-+ * This routine figures out the size that the output image will be
-+ * (which implies that all the transform parameters must be set before
-+ * it is called).
-+ *
-  * We allocate the workspace virtual arrays from the source decompression
-  * object, so that all the arrays (both the original data and the workspace)
-  * will be taken into account while making memory management decisions.
-@@ -569,9 +859,13 @@
-                             jpeg_transform_info *info)
- {
-   jvirt_barray_ptr *coef_arrays = NULL;
-+  boolean need_workspace, transpose_it;
-   jpeg_component_info *compptr;
--  int ci;
-+  JDIMENSION xoffset, yoffset, width_in_iMCUs, height_in_iMCUs;
-+  JDIMENSION width_in_blocks, height_in_blocks;
-+  int ci, h_samp_factor, v_samp_factor;
-+  /* Determine number of components in output image */
-   if (info->force_grayscale &&
-       srcinfo->jpeg_color_space == JCS_YCbCr &&
-       srcinfo->num_components == 3) {
-@@ -581,55 +875,181 @@
-     /* Process all the components */
-     info->num_components = srcinfo->num_components;
-   }
-+  /* If there is only one output component, force the iMCU size to be 1;
-+   * else use the source iMCU size.  (This allows us to do the right thing
-+   * when reducing color to grayscale, and also provides a handy way of
-+   * cleaning up "funny" grayscale images whose sampling factors are not 1x1.)
-+   */
-+
-+  switch (info->transform) {
-+  case JXFORM_TRANSPOSE:
-+  case JXFORM_TRANSVERSE:
-+  case JXFORM_ROT_90:
-+  case JXFORM_ROT_270:
-+    info->output_width = srcinfo->image_height;
-+    info->output_height = srcinfo->image_width;
-+    if (info->num_components == 1) {
-+      info->max_h_samp_factor = 1;
-+      info->max_v_samp_factor = 1;
-+    } else {
-+      info->max_h_samp_factor = srcinfo->max_v_samp_factor;
-+      info->max_v_samp_factor = srcinfo->max_h_samp_factor;
-+    }
-+    break;
-+  default:
-+    info->output_width = srcinfo->image_width;
-+    info->output_height = srcinfo->image_height;
-+    if (info->num_components == 1) {
-+      info->max_h_samp_factor = 1;
-+      info->max_v_samp_factor = 1;
-+    } else {
-+      info->max_h_samp_factor = srcinfo->max_h_samp_factor;
-+      info->max_v_samp_factor = srcinfo->max_v_samp_factor;
-+    }
-+    break;
-+  }
-+
-+  /* If cropping has been requested, compute the crop area's position and
-+   * dimensions, ensuring that its upper left corner falls at an iMCU boundary.
-+   */
-+  if (info->crop) {
-+    /* Insert default values for unset crop parameters */
-+    if (info->crop_xoffset_set == JCROP_UNSET)
-+      info->crop_xoffset = 0; /* default to +0 */
-+    if (info->crop_yoffset_set == JCROP_UNSET)
-+      info->crop_yoffset = 0; /* default to +0 */
-+    if (info->crop_xoffset >= info->output_width ||
-+      info->crop_yoffset >= info->output_height)
-+      ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
-+    if (info->crop_width_set == JCROP_UNSET)
-+      info->crop_width = info->output_width - info->crop_xoffset;
-+    if (info->crop_height_set == JCROP_UNSET)
-+      info->crop_height = info->output_height - info->crop_yoffset;
-+    /* Ensure parameters are valid */
-+    if (info->crop_width <= 0 || info->crop_width > info->output_width ||
-+      info->crop_height <= 0 || info->crop_height > info->output_height ||
-+      info->crop_xoffset > info->output_width - info->crop_width ||
-+      info->crop_yoffset > info->output_height - info->crop_height)
-+      ERREXIT(srcinfo, JERR_BAD_CROP_SPEC);
-+    /* Convert negative crop offsets into regular offsets */
-+    if (info->crop_xoffset_set == JCROP_NEG)
-+      xoffset = info->output_width - info->crop_width - info->crop_xoffset;
-+    else
-+      xoffset = info->crop_xoffset;
-+    if (info->crop_yoffset_set == JCROP_NEG)
-+      yoffset = info->output_height - info->crop_height - info->crop_yoffset;
-+    else
-+      yoffset = info->crop_yoffset;
-+    /* Now adjust so that upper left corner falls at an iMCU boundary */
-+    info->output_width =
-+      info->crop_width + (xoffset % (info->max_h_samp_factor * DCTSIZE));
-+    info->output_height =
-+      info->crop_height + (yoffset % (info->max_v_samp_factor * DCTSIZE));
-+    /* Save x/y offsets measured in iMCUs */
-+    info->x_crop_offset = xoffset / (info->max_h_samp_factor * DCTSIZE);
-+    info->y_crop_offset = yoffset / (info->max_v_samp_factor * DCTSIZE);
-+  } else {
-+    info->x_crop_offset = 0;
-+    info->y_crop_offset = 0;
-+  }
-+  /* Figure out whether we need workspace arrays,
-+   * and if so whether they are transposed relative to the source.
-+   */
-+  need_workspace = FALSE;
-+  transpose_it = FALSE;
-   switch (info->transform) {
-   case JXFORM_NONE:
-+    if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
-+      need_workspace = TRUE;
-+    /* No workspace needed if neither cropping nor transforming */
-+    break;
-   case JXFORM_FLIP_H:
--    /* Don't need a workspace array */
-+    if (info->trim)
-+      trim_right_edge(info, srcinfo->image_width);
-+    if (info->y_crop_offset != 0)
-+      need_workspace = TRUE;
-+    /* do_flip_h_no_crop doesn't need a workspace array */
-     break;
-   case JXFORM_FLIP_V:
--  case JXFORM_ROT_180:
--    /* Need workspace arrays having same dimensions as source image.
--     * Note that we allocate arrays padded out to the next iMCU boundary,
--     * so that transform routines need not worry about missing edge blocks.
--     */
--    coef_arrays = (jvirt_barray_ptr *)
--      (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,
--      SIZEOF(jvirt_barray_ptr) * info->num_components);
--    for (ci = 0; ci < info->num_components; ci++) {
--      compptr = srcinfo->comp_info + ci;
--      coef_arrays[ci] = (*srcinfo->mem->request_virt_barray)
--      ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE,
--       (JDIMENSION) jround_up((long) compptr->width_in_blocks,
--                              (long) compptr->h_samp_factor),
--       (JDIMENSION) jround_up((long) compptr->height_in_blocks,
--                              (long) compptr->v_samp_factor),
--       (JDIMENSION) compptr->v_samp_factor);
--    }
-+    if (info->trim)
-+      trim_bottom_edge(info, srcinfo->image_height);
-+    /* Need workspace arrays having same dimensions as source image. */
-+    need_workspace = TRUE;
-     break;
-   case JXFORM_TRANSPOSE:
-+    /* transpose does NOT have to trim anything */
-+    /* Need workspace arrays having transposed dimensions. */
-+    need_workspace = TRUE;
-+    transpose_it = TRUE;
-+    break;
-   case JXFORM_TRANSVERSE:
-+    if (info->trim) {
-+      trim_right_edge(info, srcinfo->image_height);
-+      trim_bottom_edge(info, srcinfo->image_width);
-+    }
-+    /* Need workspace arrays having transposed dimensions. */
-+    need_workspace = TRUE;
-+    transpose_it = TRUE;
-+    break;
-   case JXFORM_ROT_90:
-+    if (info->trim)
-+      trim_right_edge(info, srcinfo->image_height);
-+    /* Need workspace arrays having transposed dimensions. */
-+    need_workspace = TRUE;
-+    transpose_it = TRUE;
-+    break;
-+  case JXFORM_ROT_180:
-+    if (info->trim) {
-+      trim_right_edge(info, srcinfo->image_width);
-+      trim_bottom_edge(info, srcinfo->image_height);
-+    }
-+    /* Need workspace arrays having same dimensions as source image. */
-+    need_workspace = TRUE;
-+    break;
-   case JXFORM_ROT_270:
--    /* Need workspace arrays having transposed dimensions.
--     * Note that we allocate arrays padded out to the next iMCU boundary,
--     * so that transform routines need not worry about missing edge blocks.
--     */
-+    if (info->trim)
-+      trim_bottom_edge(info, srcinfo->image_width);
-+    /* Need workspace arrays having transposed dimensions. */
-+    need_workspace = TRUE;
-+    transpose_it = TRUE;
-+    break;
-+  }
-+
-+  /* Allocate workspace if needed.
-+   * Note that we allocate arrays padded out to the next iMCU boundary,
-+   * so that transform routines need not worry about missing edge blocks.
-+   */
-+  if (need_workspace) {
-     coef_arrays = (jvirt_barray_ptr *)
-       (*srcinfo->mem->alloc_small) ((j_common_ptr) srcinfo, JPOOL_IMAGE,
--      SIZEOF(jvirt_barray_ptr) * info->num_components);
-+              SIZEOF(jvirt_barray_ptr) * info->num_components);
-+    width_in_iMCUs = (JDIMENSION)
-+      jdiv_round_up((long) info->output_width,
-+                  (long) (info->max_h_samp_factor * DCTSIZE));
-+    height_in_iMCUs = (JDIMENSION)
-+      jdiv_round_up((long) info->output_height,
-+                  (long) (info->max_v_samp_factor * DCTSIZE));
-     for (ci = 0; ci < info->num_components; ci++) {
-       compptr = srcinfo->comp_info + ci;
-+      if (info->num_components == 1) {
-+      /* we're going to force samp factors to 1x1 in this case */
-+      h_samp_factor = v_samp_factor = 1;
-+      } else if (transpose_it) {
-+      h_samp_factor = compptr->v_samp_factor;
-+      v_samp_factor = compptr->h_samp_factor;
-+      } else {
-+      h_samp_factor = compptr->h_samp_factor;
-+      v_samp_factor = compptr->v_samp_factor;
-+      }
-+      width_in_blocks = width_in_iMCUs * h_samp_factor;
-+      height_in_blocks = height_in_iMCUs * v_samp_factor;
-       coef_arrays[ci] = (*srcinfo->mem->request_virt_barray)
-       ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE,
--       (JDIMENSION) jround_up((long) compptr->height_in_blocks,
--                              (long) compptr->v_samp_factor),
--       (JDIMENSION) jround_up((long) compptr->width_in_blocks,
--                              (long) compptr->h_samp_factor),
--       (JDIMENSION) compptr->h_samp_factor);
-+       width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor);
-     }
--    break;
-   }
-+
-   info->workspace_coef_arrays = coef_arrays;
- }
-@@ -642,14 +1062,8 @@
-   int tblno, i, j, ci, itemp;
-   jpeg_component_info *compptr;
-   JQUANT_TBL *qtblptr;
--  JDIMENSION dtemp;
-   UINT16 qtemp;
--  /* Transpose basic image dimensions */
--  dtemp = dstinfo->image_width;
--  dstinfo->image_width = dstinfo->image_height;
--  dstinfo->image_height = dtemp;
--
-   /* Transpose sampling factors */
-   for (ci = 0; ci < dstinfo->num_components; ci++) {
-     compptr = dstinfo->comp_info + ci;
-@@ -674,46 +1088,159 @@
- }
--/* Trim off any partial iMCUs on the indicated destination edge */
-+/* Adjust Exif image parameters.
-+ *
-+ * We try to adjust the Tags ExifImageWidth and ExifImageHeight if possible.
-+ */
- LOCAL(void)
--trim_right_edge (j_compress_ptr dstinfo)
-+adjust_exif_parameters (JOCTET FAR * data, unsigned int length,
-+                      JDIMENSION new_width, JDIMENSION new_height)
- {
--  int ci, max_h_samp_factor;
--  JDIMENSION MCU_cols;
-+  boolean is_motorola; /* Flag for byte order */
-+  unsigned int number_of_tags, tagnum;
-+  unsigned int firstoffset, offset;
-+  JDIMENSION new_value;
-+
-+  if (length < 12) return; /* Length of an IFD entry */
-+
-+  /* Discover byte order */
-+  if (GETJOCTET(data[0]) == 0x49 && GETJOCTET(data[1]) == 0x49)
-+    is_motorola = FALSE;
-+  else if (GETJOCTET(data[0]) == 0x4D && GETJOCTET(data[1]) == 0x4D)
-+    is_motorola = TRUE;
-+  else
-+    return;
-+
-+  /* Check Tag Mark */
-+  if (is_motorola) {
-+    if (GETJOCTET(data[2]) != 0) return;
-+    if (GETJOCTET(data[3]) != 0x2A) return;
-+  } else {
-+    if (GETJOCTET(data[3]) != 0) return;
-+    if (GETJOCTET(data[2]) != 0x2A) return;
-+  }
--  /* We have to compute max_h_samp_factor ourselves,
--   * because it hasn't been set yet in the destination
--   * (and we don't want to use the source's value).
--   */
--  max_h_samp_factor = 1;
--  for (ci = 0; ci < dstinfo->num_components; ci++) {
--    int h_samp_factor = dstinfo->comp_info[ci].h_samp_factor;
--    max_h_samp_factor = MAX(max_h_samp_factor, h_samp_factor);
-+  /* Get first IFD offset (offset to IFD0) */
-+  if (is_motorola) {
-+    if (GETJOCTET(data[4]) != 0) return;
-+    if (GETJOCTET(data[5]) != 0) return;
-+    firstoffset = GETJOCTET(data[6]);
-+    firstoffset <<= 8;
-+    firstoffset += GETJOCTET(data[7]);
-+  } else {
-+    if (GETJOCTET(data[7]) != 0) return;
-+    if (GETJOCTET(data[6]) != 0) return;
-+    firstoffset = GETJOCTET(data[5]);
-+    firstoffset <<= 8;
-+    firstoffset += GETJOCTET(data[4]);
-   }
--  MCU_cols = dstinfo->image_width / (max_h_samp_factor * DCTSIZE);
--  if (MCU_cols > 0)           /* can't trim to 0 pixels */
--    dstinfo->image_width = MCU_cols * (max_h_samp_factor * DCTSIZE);
--}
-+  if (firstoffset > length - 2) return; /* check end of data segment */
--LOCAL(void)
--trim_bottom_edge (j_compress_ptr dstinfo)
--{
--  int ci, max_v_samp_factor;
--  JDIMENSION MCU_rows;
-+  /* Get the number of directory entries contained in this IFD */
-+  if (is_motorola) {
-+    number_of_tags = GETJOCTET(data[firstoffset]);
-+    number_of_tags <<= 8;
-+    number_of_tags += GETJOCTET(data[firstoffset+1]);
-+  } else {
-+    number_of_tags = GETJOCTET(data[firstoffset+1]);
-+    number_of_tags <<= 8;
-+    number_of_tags += GETJOCTET(data[firstoffset]);
-+  }
-+  if (number_of_tags == 0) return;
-+  firstoffset += 2;
--  /* We have to compute max_v_samp_factor ourselves,
--   * because it hasn't been set yet in the destination
--   * (and we don't want to use the source's value).
--   */
--  max_v_samp_factor = 1;
--  for (ci = 0; ci < dstinfo->num_components; ci++) {
--    int v_samp_factor = dstinfo->comp_info[ci].v_samp_factor;
--    max_v_samp_factor = MAX(max_v_samp_factor, v_samp_factor);
-+  /* Search for ExifSubIFD offset Tag in IFD0 */
-+  for (;;) {
-+    if (firstoffset > length - 12) return; /* check end of data segment */
-+    /* Get Tag number */
-+    if (is_motorola) {
-+      tagnum = GETJOCTET(data[firstoffset]);
-+      tagnum <<= 8;
-+      tagnum += GETJOCTET(data[firstoffset+1]);
-+    } else {
-+      tagnum = GETJOCTET(data[firstoffset+1]);
-+      tagnum <<= 8;
-+      tagnum += GETJOCTET(data[firstoffset]);
-+    }
-+    if (tagnum == 0x8769) break; /* found ExifSubIFD offset Tag */
-+    if (--number_of_tags == 0) return;
-+    firstoffset += 12;
-   }
--  MCU_rows = dstinfo->image_height / (max_v_samp_factor * DCTSIZE);
--  if (MCU_rows > 0)           /* can't trim to 0 pixels */
--    dstinfo->image_height = MCU_rows * (max_v_samp_factor * DCTSIZE);
-+
-+  /* Get the ExifSubIFD offset */
-+  if (is_motorola) {
-+    if (GETJOCTET(data[firstoffset+8]) != 0) return;
-+    if (GETJOCTET(data[firstoffset+9]) != 0) return;
-+    offset = GETJOCTET(data[firstoffset+10]);
-+    offset <<= 8;
-+    offset += GETJOCTET(data[firstoffset+11]);
-+  } else {
-+    if (GETJOCTET(data[firstoffset+11]) != 0) return;
-+    if (GETJOCTET(data[firstoffset+10]) != 0) return;
-+    offset = GETJOCTET(data[firstoffset+9]);
-+    offset <<= 8;
-+    offset += GETJOCTET(data[firstoffset+8]);
-+  }
-+  if (offset > length - 2) return; /* check end of data segment */
-+
-+  /* Get the number of directory entries contained in this SubIFD */
-+  if (is_motorola) {
-+    number_of_tags = GETJOCTET(data[offset]);
-+    number_of_tags <<= 8;
-+    number_of_tags += GETJOCTET(data[offset+1]);
-+  } else {
-+    number_of_tags = GETJOCTET(data[offset+1]);
-+    number_of_tags <<= 8;
-+    number_of_tags += GETJOCTET(data[offset]);
-+  }
-+  if (number_of_tags < 2) return;
-+  offset += 2;
-+
-+  /* Search for ExifImageWidth and ExifImageHeight Tags in this SubIFD */
-+  do {
-+    if (offset > length - 12) return; /* check end of data segment */
-+    /* Get Tag number */
-+    if (is_motorola) {
-+      tagnum = GETJOCTET(data[offset]);
-+      tagnum <<= 8;
-+      tagnum += GETJOCTET(data[offset+1]);
-+    } else {
-+      tagnum = GETJOCTET(data[offset+1]);
-+      tagnum <<= 8;
-+      tagnum += GETJOCTET(data[offset]);
-+    }
-+    if (tagnum == 0xA002 || tagnum == 0xA003) {
-+      if (tagnum == 0xA002)
-+      new_value = new_width; /* ExifImageWidth Tag */
-+      else
-+      new_value = new_height; /* ExifImageHeight Tag */
-+      if (is_motorola) {
-+      data[offset+2] = 0; /* Format = unsigned long (4 octets) */
-+      data[offset+3] = 4;
-+      data[offset+4] = 0; /* Number Of Components = 1 */
-+      data[offset+5] = 0;
-+      data[offset+6] = 0;
-+      data[offset+7] = 1;
-+      data[offset+8] = 0;
-+      data[offset+9] = 0;
-+      data[offset+10] = (JOCTET)((new_value >> 8) & 0xFF);
-+      data[offset+11] = (JOCTET)(new_value & 0xFF);
-+      } else {
-+      data[offset+2] = 4; /* Format = unsigned long (4 octets) */
-+      data[offset+3] = 0;
-+      data[offset+4] = 1; /* Number Of Components = 1 */
-+      data[offset+5] = 0;
-+      data[offset+6] = 0;
-+      data[offset+7] = 0;
-+      data[offset+8] = (JOCTET)(new_value & 0xFF);
-+      data[offset+9] = (JOCTET)((new_value >> 8) & 0xFF);
-+      data[offset+10] = 0;
-+      data[offset+11] = 0;
-+      }
-+    }
-+    offset += 12;
-+  } while (--number_of_tags);
- }
-@@ -736,18 +1263,22 @@
- {
-   /* If force-to-grayscale is requested, adjust destination parameters */
-   if (info->force_grayscale) {
--    /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed
--     * properly.  Among other things, the target h_samp_factor & v_samp_factor
--     * will get set to 1, which typically won't match the source.
--     * In fact we do this even if the source is already grayscale; that
--     * provides an easy way of coercing a grayscale JPEG with funny sampling
--     * factors to the customary 1,1.  (Some decoders fail on other factors.)
-+    /* First, ensure we have YCbCr or grayscale data, and that the source's
-+     * Y channel is full resolution.  (No reasonable person would make Y
-+     * be less than full resolution, so actually coping with that case
-+     * isn't worth extra code space.  But we check it to avoid crashing.)
-      */
--    if ((dstinfo->jpeg_color_space == JCS_YCbCr &&
--       dstinfo->num_components == 3) ||
--      (dstinfo->jpeg_color_space == JCS_GRAYSCALE &&
--       dstinfo->num_components == 1)) {
--      /* We have to preserve the source's quantization table number. */
-+    if (((dstinfo->jpeg_color_space == JCS_YCbCr &&
-+        dstinfo->num_components == 3) ||
-+       (dstinfo->jpeg_color_space == JCS_GRAYSCALE &&
-+        dstinfo->num_components == 1)) &&
-+      srcinfo->comp_info[0].h_samp_factor == srcinfo->max_h_samp_factor &&
-+      srcinfo->comp_info[0].v_samp_factor == srcinfo->max_v_samp_factor) {
-+      /* We use jpeg_set_colorspace to make sure subsidiary settings get fixed
-+       * properly.  Among other things, it sets the target h_samp_factor &
-+       * v_samp_factor to 1, which typically won't match the source.
-+       * We have to preserve the source's quantization table number, however.
-+       */
-       int sv_quant_tbl_no = dstinfo->comp_info[0].quant_tbl_no;
-       jpeg_set_colorspace(dstinfo, JCS_GRAYSCALE);
-       dstinfo->comp_info[0].quant_tbl_no = sv_quant_tbl_no;
-@@ -755,50 +1286,52 @@
-       /* Sorry, can't do it */
-       ERREXIT(dstinfo, JERR_CONVERSION_NOTIMPL);
-     }
-+  } else if (info->num_components == 1) {
-+    /* For a single-component source, we force the destination sampling factors
-+     * to 1x1, with or without force_grayscale.  This is useful because some
-+     * decoders choke on grayscale images with other sampling factors.
-+     */
-+    dstinfo->comp_info[0].h_samp_factor = 1;
-+    dstinfo->comp_info[0].v_samp_factor = 1;
-   }
--  /* Correct the destination's image dimensions etc if necessary */
-+  /* Correct the destination's image dimensions as necessary
-+   * for crop and rotate/flip operations.
-+   */
-+  dstinfo->image_width = info->output_width;
-+  dstinfo->image_height = info->output_height;
-+
-+  /* Transpose destination image parameters */
-   switch (info->transform) {
--  case JXFORM_NONE:
--    /* Nothing to do */
--    break;
--  case JXFORM_FLIP_H:
--    if (info->trim)
--      trim_right_edge(dstinfo);
--    break;
--  case JXFORM_FLIP_V:
--    if (info->trim)
--      trim_bottom_edge(dstinfo);
--    break;
-   case JXFORM_TRANSPOSE:
--    transpose_critical_parameters(dstinfo);
--    /* transpose does NOT have to trim anything */
--    break;
-   case JXFORM_TRANSVERSE:
--    transpose_critical_parameters(dstinfo);
--    if (info->trim) {
--      trim_right_edge(dstinfo);
--      trim_bottom_edge(dstinfo);
--    }
--    break;
-   case JXFORM_ROT_90:
--    transpose_critical_parameters(dstinfo);
--    if (info->trim)
--      trim_right_edge(dstinfo);
--    break;
--  case JXFORM_ROT_180:
--    if (info->trim) {
--      trim_right_edge(dstinfo);
--      trim_bottom_edge(dstinfo);
--    }
--    break;
-   case JXFORM_ROT_270:
-     transpose_critical_parameters(dstinfo);
--    if (info->trim)
--      trim_bottom_edge(dstinfo);
-     break;
-   }
-+  /* Adjust Exif properties */
-+  if (srcinfo->marker_list != NULL &&
-+      srcinfo->marker_list->marker == JPEG_APP0+1 &&
-+      srcinfo->marker_list->data_length >= 6 &&
-+      GETJOCTET(srcinfo->marker_list->data[0]) == 0x45 &&
-+      GETJOCTET(srcinfo->marker_list->data[1]) == 0x78 &&
-+      GETJOCTET(srcinfo->marker_list->data[2]) == 0x69 &&
-+      GETJOCTET(srcinfo->marker_list->data[3]) == 0x66 &&
-+      GETJOCTET(srcinfo->marker_list->data[4]) == 0 &&
-+      GETJOCTET(srcinfo->marker_list->data[5]) == 0) {
-+    /* Suppress output of JFIF marker */
-+    dstinfo->write_JFIF_header = FALSE;
-+    /* Adjust Exif image parameters */
-+    if (dstinfo->image_width != srcinfo->image_width ||
-+      dstinfo->image_height != srcinfo->image_height)
-+      /* Align data segment to start of TIFF structure for parsing */
-+      adjust_exif_parameters(srcinfo->marker_list->data + 6,
-+      srcinfo->marker_list->data_length - 6,
-+      dstinfo->image_width, dstinfo->image_height);
-+  }
-+
-   /* Return the appropriate output data set */
-   if (info->workspace_coef_arrays != NULL)
-     return info->workspace_coef_arrays;
-@@ -816,40 +1349,108 @@
-  */
- GLOBAL(void)
--jtransform_execute_transformation (j_decompress_ptr srcinfo,
--                                 j_compress_ptr dstinfo,
--                                 jvirt_barray_ptr *src_coef_arrays,
--                                 jpeg_transform_info *info)
-+jtransform_execute_transform (j_decompress_ptr srcinfo,
-+                            j_compress_ptr dstinfo,
-+                            jvirt_barray_ptr *src_coef_arrays,
-+                            jpeg_transform_info *info)
- {
-   jvirt_barray_ptr *dst_coef_arrays = info->workspace_coef_arrays;
-+  /* Note: conditions tested here should match those in switch statement
-+   * in jtransform_request_workspace()
-+   */
-   switch (info->transform) {
-   case JXFORM_NONE:
-+    if (info->x_crop_offset != 0 || info->y_crop_offset != 0)
-+      do_crop(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+            src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_FLIP_H:
--    do_flip_h(srcinfo, dstinfo, src_coef_arrays);
-+    if (info->y_crop_offset != 0)
-+      do_flip_h(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+              src_coef_arrays, dst_coef_arrays);
-+    else
-+      do_flip_h_no_crop(srcinfo, dstinfo, info->x_crop_offset,
-+                      src_coef_arrays);
-     break;
-   case JXFORM_FLIP_V:
--    do_flip_v(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_flip_v(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+            src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_TRANSPOSE:
--    do_transpose(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_transpose(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+               src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_TRANSVERSE:
--    do_transverse(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_transverse(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+                src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_ROT_90:
--    do_rot_90(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_rot_90(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+            src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_ROT_180:
--    do_rot_180(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_rot_180(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+             src_coef_arrays, dst_coef_arrays);
-     break;
-   case JXFORM_ROT_270:
--    do_rot_270(srcinfo, dstinfo, src_coef_arrays, dst_coef_arrays);
-+    do_rot_270(srcinfo, dstinfo, info->x_crop_offset, info->y_crop_offset,
-+             src_coef_arrays, dst_coef_arrays);
-     break;
-   }
- }
-+/* jtransform_perfect_transform
-+ *
-+ * Determine whether lossless transformation is perfectly
-+ * possible for a specified image and transformation.
-+ *
-+ * Inputs:
-+ *   image_width, image_height: source image dimensions.
-+ *   MCU_width, MCU_height: pixel dimensions of MCU.
-+ *   transform: transformation identifier.
-+ * Parameter sources from initialized jpeg_struct
-+ * (after reading source header):
-+ *   image_width = cinfo.image_width
-+ *   image_height = cinfo.image_height
-+ *   MCU_width = cinfo.max_h_samp_factor * DCTSIZE
-+ *   MCU_height = cinfo.max_v_samp_factor * DCTSIZE
-+ * Result:
-+ *   TRUE = perfect transformation possible
-+ *   FALSE = perfect transformation not possible
-+ *           (may use custom action then)
-+ */
-+
-+GLOBAL(boolean)
-+jtransform_perfect_transform(JDIMENSION image_width, JDIMENSION image_height,
-+                           int MCU_width, int MCU_height,
-+                           JXFORM_CODE transform)
-+{
-+  boolean result = TRUE; /* initialize TRUE */
-+
-+  switch (transform) {
-+  case JXFORM_FLIP_H:
-+  case JXFORM_ROT_270:
-+    if (image_width % (JDIMENSION) MCU_width)
-+      result = FALSE;
-+    break;
-+  case JXFORM_FLIP_V:
-+  case JXFORM_ROT_90:
-+    if (image_height % (JDIMENSION) MCU_height)
-+      result = FALSE;
-+    break;
-+  case JXFORM_TRANSVERSE:
-+  case JXFORM_ROT_180:
-+    if (image_width % (JDIMENSION) MCU_width)
-+      result = FALSE;
-+    if (image_height % (JDIMENSION) MCU_height)
-+      result = FALSE;
-+    break;
-+  }
-+
-+  return result;
-+}
-+
- #endif /* TRANSFORMS_SUPPORTED */
-diff -Nur jpeg-6b.orig/transupp.h jpeg-6b/transupp.h
---- jpeg-6b.orig/transupp.h    1997-07-24 04:39:12.000000000 +0200
-+++ jpeg-6b/transupp.h 2003-09-21 22:53:08.000000000 +0200
-@@ -1,7 +1,7 @@
- /*
-  * transupp.h
-  *
-- * Copyright (C) 1997, Thomas G. Lane.
-+ * Copyright (C) 1997-2001, Thomas G. Lane.
-  * This file is part of the Independent JPEG Group's software.
-  * For conditions of distribution and use, see the accompanying README file.
-  *
-@@ -22,32 +22,6 @@
- #define TRANSFORMS_SUPPORTED 1                /* 0 disables transform code */
- #endif
--/* Short forms of external names for systems with brain-damaged linkers. */
--
--#ifdef NEED_SHORT_EXTERNAL_NAMES
--#define jtransform_request_workspace          jTrRequest
--#define jtransform_adjust_parameters          jTrAdjust
--#define jtransform_execute_transformation     jTrExec
--#define jcopy_markers_setup                   jCMrkSetup
--#define jcopy_markers_execute                 jCMrkExec
--#endif /* NEED_SHORT_EXTERNAL_NAMES */
--
--
--/*
-- * Codes for supported types of image transformations.
-- */
--
--typedef enum {
--      JXFORM_NONE,            /* no transformation */
--      JXFORM_FLIP_H,          /* horizontal flip */
--      JXFORM_FLIP_V,          /* vertical flip */
--      JXFORM_TRANSPOSE,       /* transpose across UL-to-LR axis */
--      JXFORM_TRANSVERSE,      /* transpose across UR-to-LL axis */
--      JXFORM_ROT_90,          /* 90-degree clockwise rotation */
--      JXFORM_ROT_180,         /* 180-degree rotation */
--      JXFORM_ROT_270          /* 270-degree clockwise (or 90 ccw) */
--} JXFORM_CODE;
--
- /*
-  * Although rotating and flipping data expressed as DCT coefficients is not
-  * hard, there is an asymmetry in the JPEG format specification for images
-@@ -75,6 +49,19 @@
-  * (For example, -rot 270 -trim trims only the bottom edge, but -rot 90 -trim
-  * followed by -rot 180 -trim trims both edges.)
-  *
-+ * We also offer a lossless-crop option, which discards data outside a given
-+ * image region but losslessly preserves what is inside.  Like the rotate and
-+ * flip transforms, lossless crop is restricted by the JPEG format: the upper
-+ * left corner of the selected region must fall on an iMCU boundary.  If this
-+ * does not hold for the given crop parameters, we silently move the upper left
-+ * corner up and/or left to make it so, simultaneously increasing the region
-+ * dimensions to keep the lower right crop corner unchanged.  (Thus, the
-+ * output image covers at least the requested region, but may cover more.)
-+ *
-+ * If both crop and a rotate/flip transform are requested, the crop is applied
-+ * last --- that is, the crop region is specified in terms of the destination
-+ * image.
-+ *
-  * We also offer a "force to grayscale" option, which simply discards the
-  * chrominance channels of a YCbCr image.  This is lossless in the sense that
-  * the luminance channel is preserved exactly.  It's not the same kind of
-@@ -83,20 +70,89 @@
-  * be aware of the option to know how many components to work on.
-  */
-+
-+/* Short forms of external names for systems with brain-damaged linkers. */
-+
-+#ifdef NEED_SHORT_EXTERNAL_NAMES
-+#define jtransform_parse_crop_spec    jTrParCrop
-+#define jtransform_request_workspace  jTrRequest
-+#define jtransform_adjust_parameters  jTrAdjust
-+#define jtransform_execute_transform  jTrExec
-+#define jtransform_perfect_transform  jTrPerfect
-+#define jcopy_markers_setup           jCMrkSetup
-+#define jcopy_markers_execute         jCMrkExec
-+#endif /* NEED_SHORT_EXTERNAL_NAMES */
-+
-+
-+/*
-+ * Codes for supported types of image transformations.
-+ */
-+
-+typedef enum {
-+      JXFORM_NONE,            /* no transformation */
-+      JXFORM_FLIP_H,          /* horizontal flip */
-+      JXFORM_FLIP_V,          /* vertical flip */
-+      JXFORM_TRANSPOSE,       /* transpose across UL-to-LR axis */
-+      JXFORM_TRANSVERSE,      /* transpose across UR-to-LL axis */
-+      JXFORM_ROT_90,          /* 90-degree clockwise rotation */
-+      JXFORM_ROT_180,         /* 180-degree rotation */
-+      JXFORM_ROT_270          /* 270-degree clockwise (or 90 ccw) */
-+} JXFORM_CODE;
-+
-+/*
-+ * Codes for crop parameters, which can individually be unspecified,
-+ * positive, or negative.  (Negative width or height makes no sense, though.)
-+ */
-+
-+typedef enum {
-+      JCROP_UNSET,
-+      JCROP_POS,
-+      JCROP_NEG
-+} JCROP_CODE;
-+
-+/*
-+ * Transform parameters struct.
-+ * NB: application must not change any elements of this struct after
-+ * calling jtransform_request_workspace.
-+ */
-+
- typedef struct {
-   /* Options: set by caller */
-   JXFORM_CODE transform;      /* image transform operator */
-+  boolean perfect;            /* if TRUE, fail if partial MCUs are requested */
-   boolean trim;                       /* if TRUE, trim partial MCUs as needed */
-   boolean force_grayscale;    /* if TRUE, convert color image to grayscale */
-+  boolean crop;                       /* if TRUE, crop source image */
-+
-+  /* Crop parameters: application need not set these unless crop is TRUE.
-+   * These can be filled in by jtransform_parse_crop_spec().
-+   */
-+  JDIMENSION crop_width;      /* Width of selected region */
-+  JCROP_CODE crop_width_set;
-+  JDIMENSION crop_height;     /* Height of selected region */
-+  JCROP_CODE crop_height_set;
-+  JDIMENSION crop_xoffset;    /* X offset of selected region */
-+  JCROP_CODE crop_xoffset_set;        /* (negative measures from right edge) */
-+  JDIMENSION crop_yoffset;    /* Y offset of selected region */
-+  JCROP_CODE crop_yoffset_set;        /* (negative measures from bottom edge) */
-   /* Internal workspace: caller should not touch these */
-   int num_components;         /* # of components in workspace */
-   jvirt_barray_ptr * workspace_coef_arrays; /* workspace for transformations */
-+  JDIMENSION output_width;    /* cropped destination dimensions */
-+  JDIMENSION output_height;
-+  JDIMENSION x_crop_offset;   /* destination crop offsets measured in iMCUs */
-+  JDIMENSION y_crop_offset;
-+  int max_h_samp_factor;      /* destination iMCU size */
-+  int max_v_samp_factor;
- } jpeg_transform_info;
- #if TRANSFORMS_SUPPORTED
-+/* Parse a crop specification (written in X11 geometry style) */
-+EXTERN(boolean) jtransform_parse_crop_spec
-+      JPP((jpeg_transform_info *info, const char *spec));
- /* Request any required workspace */
- EXTERN(void) jtransform_request_workspace
-       JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
-@@ -106,10 +162,24 @@
-            jvirt_barray_ptr *src_coef_arrays,
-            jpeg_transform_info *info));
- /* Execute the actual transformation, if any */
--EXTERN(void) jtransform_execute_transformation
-+EXTERN(void) jtransform_execute_transform
-       JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
-            jvirt_barray_ptr *src_coef_arrays,
-            jpeg_transform_info *info));
-+/* Determine whether lossless transformation is perfectly
-+ * possible for a specified image and transformation.
-+ */
-+EXTERN(boolean) jtransform_perfect_transform
-+      JPP((JDIMENSION image_width, JDIMENSION image_height,
-+           int MCU_width, int MCU_height,
-+           JXFORM_CODE transform));
-+
-+/* jtransform_execute_transform used to be called
-+ * jtransform_execute_transformation, but some compilers complain about
-+ * routine names that long.  This macro is here to avoid breaking any
-+ * old source code that uses the original name...
-+ */
-+#define jtransform_execute_transformation     jtransform_execute_transform
- #endif /* TRANSFORMS_SUPPORTED */
diff --git a/libjpeg-include.patch b/libjpeg-include.patch
deleted file mode 100644 (file)
index edd7286..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
---- jpeg-6b/jpeglib.h
-+++ jpeg-6b.new/jpeglib.h
-@@ -24 +24 @@
--#include "jconfig.h"          /* widely used configuration options */
-+#include <jconfig.h>          /* widely used configuration options */
-@@ -26 +26 @@
--#include "jmorecfg.h"         /* seldom changed options */
-+#include <jmorecfg.h>         /* seldom changed options */
-@@ -1092,2 +1092,2 @@
--#include "jpegint.h"          /* fetch private declarations */
--#include "jerror.h"           /* fetch error codes too */
-+#include <jpegint.h>          /* fetch private declarations */
-+#include <jerror.h>           /* fetch error codes too */
diff --git a/libjpeg-libtool.patch b/libjpeg-libtool.patch
deleted file mode 100644 (file)
index 3037a3e..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
---- jpeg-6b/configure  1998-03-21 21:08:57.000000000 +0200
-+++ jpeg-6b.libtool/configure  2006-10-23 17:03:19.529255759 +0300
-@@ -1529,10 +1529,10 @@
- if test "x$LTSHARED" != xno  -o  "x$LTSTATIC" != xno; then
-   USELIBTOOL="yes"
--  LIBTOOL="./libtool"
-+  LIBTOOL="libtool"
-   O="lo"
-   A="la"
--  LN='$(LIBTOOL) --mode=link $(CC)'
-+  LN='$(LIBTOOL) --tag=CC --mode=link $(CC)'
-   INSTALL_LIB='$(LIBTOOL) --mode=install ${INSTALL}'
-   INSTALL_PROGRAM="\$(LIBTOOL) --mode=install $INSTALL_PROGRAM"
- else
---- jpeg-6b/makefile.cfg       2006-10-23 17:04:59.081491199 +0300
-+++ jpeg-6b.libtool/makefile.cfg       2006-10-23 17:04:27.360778917 +0300
-@@ -140,7 +140,7 @@
- # How to compile with libtool.
- @COM_LT@.c.lo:
--@COM_LT@      $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c $(srcdir)/$*.c
-+@COM_LT@      $(LIBTOOL) --tag=CC --mode=compile $(CC) $(CFLAGS) -c $(srcdir)/$*.c
- # How to use ansi2knr, when not using libtool.
- @COM_A2K@.c.o:
-@@ -151,7 +151,7 @@
- # How to use ansi2knr AND libtool.
- @COM_A2K@.c.lo:
- @COM_A2K@     ./ansi2knr $(srcdir)/$*.c knr/$*.c
--@COM_A2K@     $(LIBTOOL) --mode=compile $(CC) $(CFLAGS) -c knr/$*.c
-+@COM_A2K@     $(LIBTOOL) --tag=CC --mode=compile $(CC) $(CFLAGS) -c knr/$*.c
- @COM_A2K@     $(RM) knr/$*.c
- ansi2knr: ansi2knr.c
-@@ -168,7 +168,7 @@
- # with libtool:
- libjpeg.la: @A2K_DEPS@ $(LIBOBJECTS)
--      $(LIBTOOL) --mode=link $(CC) -o libjpeg.la $(LIBOBJECTS) \
-+      $(LIBTOOL) --tag=CC --mode=link $(CC) -o libjpeg.la $(LIBOBJECTS) \
-               -rpath $(libdir) -version-info $(JPEG_LIB_VERSION)
- # sample programs:
index b2aa3d65f40fc9c302ed51841f676c3284303f47..909a92ce6d79f87c3b6184a2814e35eb12d5b76e 100644 (file)
@@ -1,8 +1,3 @@
-#
-# Conditional build:
-%bcond_with    arith   # arithmetic coding support (changes error codes in ABI, patent problems somewhere)
-%bcond_with    crop    # lossless cropping support (changes error codes in ABI)
-#
 Summary:       Library for handling different JPEG files
 Summary(de.UTF-8):     Library zum Verarbeiten verschiedener JPEG-Dateien
 Summary(es.UTF-8):     Biblioteca para manipulación de diferentes archivos JPEGs
@@ -13,23 +8,14 @@ Summary(ru.UTF-8):   Библиотека для обработки различн
 Summary(tr.UTF-8):     JPEG resimlerini işleme kitaplığı
 Summary(uk.UTF-8):     Бібліотека для обробки різноманітних JPEG-файлів
 Name:          libjpeg
-Version:       6b
-Release:       28
+Version:       7
+Release:       1
 License:       distributable
 Group:         Libraries
-Source0:       ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v%{version}.tar.gz
-# Source0-md5: dbd5f3b47ed13132f04c685d608a7547
+Source0:       http://www.ijg.org/files/jpegsrc.v%{version}.tar.gz
+# Source0-md5: 382ef33b339c299b56baf1296cda9785
 Source1:       http://www.mif.pg.gda.pl/homepages/ankry/man-PLD/%{name}-non-english-man-pages.tar.bz2
 # Source1-md5: d6342c015a489de275ada637a77dc2b0
-Patch0:                %{name}-DESTDIR.patch
-Patch1:                %{name}-arm.patch
-Patch2:                %{name}-include.patch
-Patch3:                %{name}-c++.patch
-Patch4:                %{name}-libtool.patch
-# from http://sylvana.net/jpeg-ari/jpeg-ari-28mar98.tar.gz
-Patch5:                %{name}-arith.patch
-# from http://sylvana.net/jpegcrop/croppatch.tar.gz
-Patch6:                %{name}-crop.patch
 URL:           http://www.ijg.org/
 BuildRequires: libtool
 BuildRoot:     %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
@@ -176,21 +162,13 @@ tekstowe dołączone do pliku JPEG, a wrjpgcom wstawia takie komentarze.
 
 %prep
 %setup -q -n jpeg-%{version}
-%patch0 -p1
-%patch1 -p1
-%patch2 -p1
-%patch3 -p1
-%patch4 -p1
-%{?with_arith:%patch5 -p1}
-%{?with_crop:%patch6 -p1}
 
 %build
 %configure \
        --enable-shared \
        --enable-static
 
-%{__make} \
-       libdir=%{_libdir}
+%{__make}
 
 LD_PRELOAD=$PWD/.libs/%{name}.so \
 %{__make} test
@@ -199,18 +177,14 @@ LD_PRELOAD=$PWD/.libs/%{name}.so \
 rm -rf $RPM_BUILD_ROOT
 install -d $RPM_BUILD_ROOT{%{_libdir},%{_includedir},%{_bindir},%{_mandir}/man1}
 
-%{__make} install install-headers install-lib \
-       libdir=%{_libdir} \
+%{__make} install \
        DESTDIR=$RPM_BUILD_ROOT
 
 install jversion.h $RPM_BUILD_ROOT%{_includedir}
 
 # remove HAVE_STD{DEF,LIB}_H
 # (not necessary but may generate warnings confusing autoconf)
-(cd $RPM_BUILD_ROOT%{_includedir}
-grep -v 'HAVE_STD..._H' jconfig.h > jconfig.h.new
-mv -f jconfig.h.new jconfig.h
-)
+sed -i -e 's#.*HAVE_STD..._H.*##g' $RPM_BUILD_ROOT%{_includedir}/jconfig.h
 
 bzip2 -dc %{SOURCE1} | tar xf - -C $RPM_BUILD_ROOT%{_mandir}
 
@@ -222,13 +196,13 @@ rm -rf $RPM_BUILD_ROOT
 
 %files
 %defattr(644,root,root,755)
-%doc README change.log %{?with_arith:README.arithmetic}
+%doc README change.log
 %attr(755,root,root) %{_libdir}/libjpeg.so.*.*.*
-%attr(755,root,root) %ghost %{_libdir}/libjpeg.so.62
+%attr(755,root,root) %ghost %{_libdir}/libjpeg.so.7
 
 %files devel
 %defattr(644,root,root,755)
-%doc {libjpeg,structure}.doc
+%doc libjpeg.txt structure.txt
 %attr(755,root,root) %{_libdir}/libjpeg.so
 %{_libdir}/libjpeg.la
 %{_includedir}/jconfig.h
This page took 0.657341 seconds and 4 git commands to generate.