+++ /dev/null
-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
+++ /dev/null
-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/)
+++ /dev/null
---- 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.
+++ /dev/null
---- 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 */
+++ /dev/null
-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 */
-
+++ /dev/null
---- 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 */
+++ /dev/null
---- 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:
-#
-# 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
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)
%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
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}
%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