Compare commits

...

5 Commits

Author SHA1 Message Date
Guido Vollbeding
5829cb2398 The Independent JPEG Group's JPEG software v8d 2015-07-27 13:50:34 -05:00
Guido Vollbeding
c39ec149e8 The Independent JPEG Group's JPEG software v8c 2015-07-27 13:49:31 -05:00
Guido Vollbeding
a4ecaacde6 The Independent JPEG Group's JPEG software v8b 2015-07-27 13:48:40 -05:00
Guido Vollbeding
f18f81b7e2 The Independent JPEG Group's JPEG software v8a 2015-07-27 13:46:36 -05:00
Guido Vollbeding
989630f70c The Independent JPEG Group's JPEG software v8 2015-07-27 13:45:31 -05:00
91 changed files with 12136 additions and 10120 deletions

View File

@@ -38,11 +38,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
# Configuration files # Configuration files
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
@@ -118,7 +119,7 @@ uninstall-local:
# Run tests # Run tests
test: check-local test: check-local
check-local: check-local:
$(RM) testout* rm -f testout*
./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg ./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm ./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm

View File

@@ -1,9 +1,9 @@
# Makefile.in generated by automake 1.11 from Makefile.am. # Makefile.in generated by automake 1.11.2 from Makefile.am.
# @configure_input@ # @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
# Inc. # Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation # This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it, # gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved. # with or without modifications, as long as this notice is preserved.
@@ -83,6 +83,12 @@ am__nobase_list = $(am__nobase_strip_setup); \
am__base_list = \ am__base_list = \
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
am__uninstall_files_from_dir = { \
test -z "$$files" \
|| { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \ am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
"$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)" "$(DESTDIR)$(man1dir)" "$(DESTDIR)$(includedir)"
LTLIBRARIES = $(lib_LTLIBRARIES) LTLIBRARIES = $(lib_LTLIBRARIES)
@@ -205,6 +211,7 @@ LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@ LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@ MAINT = @MAINT@
MAKEINFO = @MAKEINFO@ MAKEINFO = @MAKEINFO@
MANIFEST_TOOL = @MANIFEST_TOOL@
MEMORYMGR = @MEMORYMGR@ MEMORYMGR = @MEMORYMGR@
MKDIR_P = @MKDIR_P@ MKDIR_P = @MKDIR_P@
NM = @NM@ NM = @NM@
@@ -218,6 +225,7 @@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@ PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@ PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@ RANLIB = @RANLIB@
@@ -231,6 +239,7 @@ abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@ abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@ abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@ abs_top_srcdir = @abs_top_srcdir@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@ ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@ am__include = @am__include@
@@ -263,7 +272,6 @@ libdir = @libdir@
libexecdir = @libexecdir@ libexecdir = @libexecdir@
localedir = @localedir@ localedir = @localedir@
localstatedir = @localstatedir@ localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@ mandir = @mandir@
mkdir_p = @mkdir_p@ mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@ oldincludedir = @oldincludedir@
@@ -320,11 +328,12 @@ MKFILES = configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
# Configuration files # Configuration files
@@ -393,7 +402,7 @@ all: jconfig.h
.SUFFIXES: .SUFFIXES:
.SUFFIXES: .c .lo .o .obj .SUFFIXES: .c .lo .o .obj
am--refresh: am--refresh: Makefile
@: @:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \ @for dep in $?; do \
@@ -429,10 +438,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps): $(am__aclocal_m4_deps):
jconfig.h: stamp-h1 jconfig.h: stamp-h1
@if test ! -f $@; then \ @if test ! -f $@; then rm -f stamp-h1; else :; fi
rm -f stamp-h1; \ @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi
$(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
else :; fi
stamp-h1: $(srcdir)/jconfig.cfg $(top_builddir)/config.status stamp-h1: $(srcdir)/jconfig.cfg $(top_builddir)/config.status
@rm -f stamp-h1 @rm -f stamp-h1
@@ -620,26 +627,23 @@ mostlyclean-kr:
.c.o: .c.o:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c $< @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
.c.obj: .c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
.c.lo: .c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
@am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $< @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
@MEMORYMGR@_.c: @MEMORYMGR@.c $(ANSI2KNR) @MEMORYMGR@_.c: @MEMORYMGR@.c $(ANSI2KNR)
$(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/@MEMORYMGR@.c; then echo $(srcdir)/@MEMORYMGR@.c; else echo @MEMORYMGR@.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@ $(CPP) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) `if test -f $(srcdir)/@MEMORYMGR@.c; then echo $(srcdir)/@MEMORYMGR@.c; else echo @MEMORYMGR@.c; fi` | sed 's/^# \([0-9]\)/#line \1/' | $(ANSI2KNR) > $@ || rm -f $@
cdjpeg_.c: cdjpeg.c $(ANSI2KNR) cdjpeg_.c: cdjpeg.c $(ANSI2KNR)
@@ -847,9 +851,7 @@ uninstall-man1:
sed -n '/\.1[a-z]*$$/p'; \ sed -n '/\.1[a-z]*$$/p'; \
} | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \
-e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \
test -z "$$files" || { \ dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)
echo " ( cd '$(DESTDIR)$(man1dir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(man1dir)" && rm -f $$files; }
install-includeHEADERS: $(include_HEADERS) install-includeHEADERS: $(include_HEADERS)
@$(NORMAL_INSTALL) @$(NORMAL_INSTALL)
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)" test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
@@ -867,9 +869,7 @@ uninstall-includeHEADERS:
@$(NORMAL_UNINSTALL) @$(NORMAL_UNINSTALL)
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \ @list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
test -n "$$files" || exit 0; \ dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)
echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
cd "$(DESTDIR)$(includedir)" && rm -f $$files
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
@@ -943,10 +943,15 @@ install-am: all-am
installcheck: installcheck-am installcheck: installcheck-am
install-strip: install-strip:
if test -z '$(STRIP)'; then \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \ install; \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install else \
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
fi
mostlyclean-generic: mostlyclean-generic:
clean-generic: clean-generic:
@@ -1070,7 +1075,7 @@ uninstall-local:
# Run tests # Run tests
test: check-local test: check-local
check-local: check-local:
$(RM) testout* rm -f testout*
./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg ./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg ./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm ./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm

87
README
View File

@@ -1,10 +1,10 @@
The Independent JPEG Group's JPEG software The Independent JPEG Group's JPEG software
========================================== ==========================================
README for release 7 of 27-Jun-2009 README for release 8d of 15-Jan-2012
=================================== ====================================
This distribution contains the seventh public release of the Independent JPEG This distribution contains the eighth public release of the Independent JPEG
Group's free JPEG software. You are welcome to redistribute this software and Group's free JPEG software. You are welcome to redistribute this software and
to use it for any purpose, subject to the conditions under LEGAL ISSUES, below. to use it for any purpose, subject to the conditions under LEGAL ISSUES, below.
@@ -13,7 +13,8 @@ Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers, Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
and other members of the Independent JPEG Group. and other members of the Independent JPEG Group.
IJG is not affiliated with the official ISO JPEG standards committee. IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
(also known as JPEG, together with ITU-T SG16).
DOCUMENTATION ROADMAP DOCUMENTATION ROADMAP
@@ -114,7 +115,7 @@ with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you, fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy. its user, assume the entire risk as to its quality and accuracy.
This software is copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. This software is copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
All Rights Reserved except as specified below. All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this Permission is hereby granted to use, copy, modify, and distribute this
@@ -221,16 +222,20 @@ Part 1: Requirements and guidelines" and has document numbers ISO/IEC IS
10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of 10918-1, ITU-T T.81. Part 2 is titled "Digital Compression and Coding of
Continuous-tone Still Images, Part 2: Compliance testing" and has document Continuous-tone Still Images, Part 2: Compliance testing" and has document
numbers ISO/IEC IS 10918-2, ITU-T T.83. numbers ISO/IEC IS 10918-2, ITU-T T.83.
IJG JPEG 8 introduces an implementation of the JPEG SmartScale extension
which is specified in two documents: A contributed document at ITU and ISO
with title "ITU-T JPEG-Plus Proposal for Extending ITU-T T.81 for Advanced
Image Coding", April 2006, Geneva, Switzerland. The latest version of this
document is Revision 3. And a contributed document ISO/IEC JTC1/SC29/WG1 N
5799 with title "Evolution of JPEG", June/July 2011, Berlin, Germany.
The JPEG standard does not specify all details of an interchangeable file The JPEG standard does not specify all details of an interchangeable file
format. For the omitted details we follow the "JFIF" conventions, revision format. For the omitted details we follow the "JFIF" conventions, revision
1.02. A copy of the JFIF spec is available from: 1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
Literature Department and thus received a formal publication status. It is available as a free
C-Cube Microsystems, Inc. download in PDF format from
1778 McCarthy Blvd. http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
Milpitas, CA 95035 A PostScript version of the JFIF document is available at
phone (408) 944-6300, fax (408) 944-6314
A PostScript version of this document is available at
http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at http://www.ijg.org/files/jfif.ps.gz. There is also a plain text version at
http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures. http://www.ijg.org/files/jfif.txt.gz, but it is missing the figures.
@@ -252,8 +257,8 @@ ARCHIVE LOCATIONS
The "official" archive site for this software is www.ijg.org. The "official" archive site for this software is www.ijg.org.
The most recent released version can always be found there in The most recent released version can always be found there in
directory "files". This particular version will be archived as directory "files". This particular version will be archived as
http://www.ijg.org/files/jpegsrc.v7.tar.gz, and in Windows-compatible http://www.ijg.org/files/jpegsrc.v8d.tar.gz, and in Windows-compatible
"zip" archive format as http://www.ijg.org/files/jpegsr7.zip. "zip" archive format as http://www.ijg.org/files/jpegsr8d.zip.
The JPEG FAQ (Frequently Asked Questions) article is a source of some The JPEG FAQ (Frequently Asked Questions) article is a source of some
general information about JPEG. general information about JPEG.
@@ -269,9 +274,8 @@ with body
ACKNOWLEDGMENTS ACKNOWLEDGMENTS
=============== ===============
Thank to Juergen Bruder of the Georg-Cantor-Organization at the Thank to Juergen Bruder for providing me with a copy of the common DCT
Martin-Luther-University Halle for providing me with a copy of the common algorithm article, only to find out that I had come to the same result
DCT algorithm article, only to find out that I had come to the same result
in a more direct and comprehensible way with a more generative approach. in a more direct and comprehensible way with a more generative approach.
Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the
@@ -280,11 +284,16 @@ ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland. Joint Video Team (MPEG & ITU) meeting in Geneva, Switzerland.
Thank to Thomas Richter and Daniel Lee for inviting me to the
ISO/IEC JTC1/SC29/WG1 (also known as JPEG, together with ITU-T SG16)
meeting in Berlin, Germany.
Thank to John Korejwa and Massimo Ballerini for inviting me to Thank to John Korejwa and Massimo Ballerini for inviting me to
fruitful consultations in Boston, MA and Milan, Italy. fruitful consultations in Boston, MA and Milan, Italy.
Thank to Hendrik Elstner, Roland Fassauer, and Simone Zuck for Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther
corresponding business development. Maier-Gerber, Walter Stoeber, Fred Schmitz, and Norbert Braunagel
for corresponding business development.
Thank to Nico Zschach and Dirk Stelling of the technical support team Thank to Nico Zschach and Dirk Stelling of the technical support team
at the Digital Images company in Halle for providing me with extra at the Digital Images company in Halle for providing me with extra
@@ -293,6 +302,8 @@ equipment for configuration tests.
Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful
communication about JPEG configuration in Sigma Photo Pro software. communication about JPEG configuration in Sigma Photo Pro software.
Thank to Andrew Finkenstadt for hosting the ijg.org site.
Last but not least special thank to Thomas G. Lane for the original Last but not least special thank to Thomas G. Lane for the original
design and development of this singular software package. design and development of this singular software package.
@@ -300,23 +311,41 @@ design and development of this singular software package.
FILE FORMAT WARS FILE FORMAT WARS
================ ================
The ISO JPEG standards committee actually promotes different formats like The ISO/IEC JTC1/SC29/WG1 standards committee (also known as JPEG, together
JPEG-2000 or JPEG-XR which are incompatible with original DCT-based JPEG with ITU-T SG16) currently promotes different formats containing the name
and which are based on faulty technologies. IJG therefore does not and "JPEG" which is misleading because these formats are incompatible with
will not support such momentary mistakes (see REFERENCES). original DCT-based JPEG and are based on faulty technologies.
We have little or no sympathy for the promotion of these formats. Indeed, IJG therefore does not and will not support such momentary mistakes
one of the original reasons for developing this free software was to help (see REFERENCES).
force convergence on common, interoperable format standards for JPEG files. There exist also distributions under the name "OpenJPEG" promoting such
kind of formats which is misleading because they don't support original
JPEG images.
We have no sympathy for the promotion of inferior formats. Indeed, one of
the original reasons for developing this free software was to help force
convergence on common, interoperable format standards for JPEG files.
Don't use an incompatible file format! Don't use an incompatible file format!
(In any case, our decoder will remain capable of reading existing JPEG (In any case, our decoder will remain capable of reading existing JPEG
image files indefinitely.) image files indefinitely.)
Furthermore, the ISO committee pretends to be "responsible for the popular
JPEG" in their public reports which is not true because they don't respond to
actual requirements for the maintenance of the original JPEG specification.
There are currently distributions in circulation containing the name
"libjpeg" which claim to be a "derivative" or "fork" of the original
libjpeg, but don't have the features and are incompatible with formats
supported by actual IJG libjpeg distributions. Furthermore, they
violate the license conditions as described under LEGAL ISSUES above.
We have no sympathy for the release of misleading and illegal
distributions derived from obsolete code bases.
Don't use an obsolete code base!
TO DO TO DO
===== =====
v7 is basically just a necessary interim release, paving the way for a Version 8 is the first release of a new generation JPEG standard
major breakthrough in image coding technology with the next v8 package to overcome the limitations of the original JPEG specification.
which is scheduled for release in the year 2010. More features are being prepared for coming releases...
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org. Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.

2194
aclocal.m4 vendored

File diff suppressed because it is too large Load Diff

View File

@@ -2,6 +2,7 @@
* cderror.h * cderror.h
* *
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* Modified 2009 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -45,6 +46,7 @@ JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length")
JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1") JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1")
JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB") JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB")
JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported") JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported")
JMESSAGE(JERR_BMP_EMPTY, "Empty BMP image")
JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM") JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM")
JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image") JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image")
JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image") JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")

View File

@@ -1,6 +1,82 @@
CHANGE LOG for Independent JPEG Group's JPEG software CHANGE LOG for Independent JPEG Group's JPEG software
Version 8d 15-Jan-2012
-----------------------
Add cjpeg -rgb option to create RGB JPEG files.
Using this switch suppresses the conversion from RGB
colorspace input to the default YCbCr JPEG colorspace.
This feature allows true lossless JPEG coding of RGB color images.
The recommended command for this purpose is currently
cjpeg -rgb -block 1 -arithmetic.
SmartScale capable decoder (introduced with IJG JPEG 8) required.
Thank to Michael Koch for the initial suggestion.
Add option to disable the region adjustment in the transupp crop code.
Thank to Jeffrey Friedl for the suggestion.
Thank to Richard Jones and Edd Dawson for various minor corrections.
Thank to Akim Demaille for configure.ac cleanup.
Version 8c 16-Jan-2011
-----------------------
Add option to compression library and cjpeg (-block N) to use
different DCT block size.
All N from 1 to 16 are possible. Default is 8 (baseline format).
Larger values produce higher compression,
smaller values produce higher quality.
SmartScale capable decoder (introduced with IJG JPEG 8) required.
Version 8b 16-May-2010
-----------------------
Repair problem in new memory source manager with corrupt JPEG data.
Thank to Ted Campbell and Samuel Chun for the report.
Repair problem in Makefile.am test target.
Thank to anonymous user for the report.
Support MinGW installation with automatic configure.
Thank to Volker Grabsch for the suggestion.
Version 8a 28-Feb-2010
-----------------------
Writing tables-only datastreams via jpeg_write_tables works again.
Support 32-bit BMPs (RGB image with Alpha channel) for read in cjpeg.
Thank to Brett Blackham for the suggestion.
Improve accuracy in floating point IDCT calculation.
Thank to Robert Hooke for the hint.
Version 8 10-Jan-2010
----------------------
jpegtran now supports the same -scale option as djpeg for "lossless" resize.
An implementation of the JPEG SmartScale extension is required for this
feature. A (draft) specification of the JPEG SmartScale extension is
available as a contributed document at ITU and ISO. Revision 2 or later
of the document is required (latest document version is Revision 3).
The SmartScale extension will enable more features beside lossless resize
in future implementations, as described in the document (new compression
options).
Add sanity check in BMP reader module to avoid cjpeg crash for empty input
image (thank to Isaev Ildar of ISP RAS, Moscow, RU for reporting this error).
Add data source and destination managers for read from and write to
memory buffers. New API functions jpeg_mem_src and jpeg_mem_dest.
Thank to Roberto Boni from Italy for the suggestion.
Version 7 27-Jun-2009 Version 7 27-Jun-2009
---------------------- ----------------------

41
cjpeg.1
View File

@@ -1,4 +1,4 @@
.TH CJPEG 1 "10 June 2009" .TH CJPEG 1 "28 August 2011"
.SH NAME .SH NAME
cjpeg \- compress an image file to a JPEG file cjpeg \- compress an image file to a JPEG file
.SH SYNOPSIS .SH SYNOPSIS
@@ -49,6 +49,14 @@ By saying
.BR \-grayscale , .BR \-grayscale ,
you'll get a smaller JPEG file that takes less time to process. you'll get a smaller JPEG file that takes less time to process.
.TP .TP
.B \-rgb
Create RGB JPEG file.
Using this switch suppresses the conversion from RGB
colorspace input to the default YCbCr JPEG colorspace.
Use this switch in combination with the
.BI \-block " N"
switch (see below) for lossless JPEG coding.
.TP
.B \-optimize .B \-optimize
Perform optimization of entropy encoding parameters. Without this, default Perform optimization of entropy encoding parameters. Without this, default
encoding parameters are used. encoding parameters are used.
@@ -64,7 +72,10 @@ Create progressive JPEG file (see below).
.TP .TP
.BI \-scale " M/N" .BI \-scale " M/N"
Scale the output image by a factor M/N. Currently supported scale factors are Scale the output image by a factor M/N. Currently supported scale factors are
8/N with all N from 1 to 16. M/N with all N from 1 to 16, where M is the destination DCT size, which is 8
by default (see
.BI \-block " N"
switch below).
.TP .TP
.B \-targa .B \-targa
Input file is Targa format. Targa files that contain an "identification" Input file is Targa format. Targa files that contain an "identification"
@@ -135,7 +146,7 @@ and assigned to components with
.B \-qslots .B \-qslots
parameter (see the "wizard" switches below). parameter (see the "wizard" switches below).
.B Caution: .B Caution:
You must explicitely add You must explicitly add
.BI \-sample " 1x1" .BI \-sample " 1x1"
for efficient separate color for efficient separate color
quality selection, since the default value used by library is 2x2! quality selection, since the default value used by library is 2x2!
@@ -152,6 +163,24 @@ about the same --- often a little smaller.
.PP .PP
Switches for advanced users: Switches for advanced users:
.TP .TP
.B \-arithmetic
Use arithmetic coding.
.B Caution:
arithmetic coded JPEG is not yet widely implemented, so many decoders will be
unable to view an arithmetic coded JPEG file at all.
.TP
.BI \-block " N"
Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
Larger values produce higher compression,
smaller values produce higher quality
(exact DCT stage possible with 1 or 2; with the default quality of 75 and
default Luminance qtable the DCT+Quantization stage is lossless for N=1).
.B Caution:
An implementation of the JPEG SmartScale extension is required for this
feature. SmartScale enabled JPEG is not yet widely implemented, so many
decoders will be unable to view a SmartScale extended JPEG file at all.
.TP
.B \-dct int .B \-dct int
Use integer DCT method (default). Use integer DCT method (default).
.TP .TP
@@ -219,12 +248,6 @@ visibly blur the image, however.
.PP .PP
Switches for wizards: Switches for wizards:
.TP .TP
.B \-arithmetic
Use arithmetic coding.
.B Caution:
arithmetic coded JPEG is not yet widely implemented, so many decoders will be
unable to view an arithmetic coded JPEG file at all.
.TP
.B \-baseline .B \-baseline
Force baseline-compatible quantization tables to be generated. This clamps Force baseline-compatible quantization tables to be generated. This clamps
quantization values to 8 bits even at low quality settings. (This switch is quantization values to 8 bits even at low quality settings. (This switch is

37
cjpeg.c
View File

@@ -2,7 +2,7 @@
* cjpeg.c * cjpeg.c
* *
* Copyright (C) 1991-1998, Thomas G. Lane. * Copyright (C) 1991-1998, Thomas G. Lane.
* Modified 2003-2008 by Guido Vollbeding. * Modified 2003-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -152,6 +152,7 @@ usage (void)
fprintf(stderr, "Switches (names may be abbreviated):\n"); fprintf(stderr, "Switches (names may be abbreviated):\n");
fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n"); fprintf(stderr, " -quality N[,...] Compression quality (0..100; 5-95 is useful range)\n");
fprintf(stderr, " -grayscale Create monochrome JPEG file\n"); fprintf(stderr, " -grayscale Create monochrome JPEG file\n");
fprintf(stderr, " -rgb Create RGB JPEG file\n");
#ifdef ENTROPY_OPT_SUPPORTED #ifdef ENTROPY_OPT_SUPPORTED
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n"); fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
#endif #endif
@@ -165,6 +166,12 @@ usage (void)
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n"); fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
#endif #endif
fprintf(stderr, "Switches for advanced users:\n"); fprintf(stderr, "Switches for advanced users:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
#ifdef DCT_SCALING_SUPPORTED
fprintf(stderr, " -block N DCT block size (1..16; default is 8)\n");
#endif
#ifdef DCT_ISLOW_SUPPORTED #ifdef DCT_ISLOW_SUPPORTED
fprintf(stderr, " -dct int Use integer DCT method%s\n", fprintf(stderr, " -dct int Use integer DCT method%s\n",
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : "")); (JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
@@ -186,9 +193,6 @@ usage (void)
fprintf(stderr, " -outfile name Specify name for output file\n"); fprintf(stderr, " -outfile name Specify name for output file\n");
fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, "Switches for wizards:\n"); fprintf(stderr, "Switches for wizards:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
fprintf(stderr, " -baseline Force baseline quantization tables\n"); fprintf(stderr, " -baseline Force baseline quantization tables\n");
fprintf(stderr, " -qtables file Use quantization tables given in file\n"); fprintf(stderr, " -qtables file Use quantization tables given in file\n");
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n"); fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
@@ -254,10 +258,29 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
#endif #endif
} else if (keymatch(arg, "baseline", 1)) { } else if (keymatch(arg, "baseline", 2)) {
/* Force baseline-compatible output (8-bit quantizer values). */ /* Force baseline-compatible output (8-bit quantizer values). */
force_baseline = TRUE; force_baseline = TRUE;
} else if (keymatch(arg, "block", 2)) {
/* Set DCT block size. */
#if defined DCT_SCALING_SUPPORTED && JPEG_LIB_VERSION_MAJOR >= 8 && \
(JPEG_LIB_VERSION_MAJOR > 8 || JPEG_LIB_VERSION_MINOR >= 3)
int val;
if (++argn >= argc) /* advance to next argument */
usage();
if (sscanf(argv[argn], "%d", &val) != 1)
usage();
if (val < 1 || val > 16)
usage();
cinfo->block_size = val;
#else
fprintf(stderr, "%s: sorry, block size setting not supported\n",
progname);
exit(EXIT_FAILURE);
#endif
} else if (keymatch(arg, "dct", 2)) { } else if (keymatch(arg, "dct", 2)) {
/* Select DCT algorithm. */ /* Select DCT algorithm. */
if (++argn >= argc) /* advance to next argument */ if (++argn >= argc) /* advance to next argument */
@@ -287,6 +310,10 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Force a monochrome JPEG file to be generated. */ /* Force a monochrome JPEG file to be generated. */
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE); jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
} else if (keymatch(arg, "rgb", 3)) {
/* Force an RGB JPEG file to be generated. */
jpeg_set_colorspace(cinfo, JCS_RGB);
} else if (keymatch(arg, "maxmemory", 3)) { } else if (keymatch(arg, "maxmemory", 3)) {
/* Maximum memory in Kb (or Mb with 'm'). */ /* Maximum memory in Kb (or Mb with 'm'). */
long lval; long lval;

235
config.guess vendored
View File

@@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Attempt to guess a canonical system name. # Attempt to guess a canonical system name.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
# Free Software Foundation, Inc. # 2011 Free Software Foundation, Inc.
timestamp='2009-04-27' timestamp='2011-11-11'
# This file is free software; you can redistribute it and/or modify it # 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 # under the terms of the GNU General Public License as published by
@@ -27,16 +27,16 @@ timestamp='2009-04-27'
# the same distribution terms that you use for the rest of that program. # the same distribution terms that you use for the rest of that program.
# Originally written by Per Bothner <per@bothner.com>. # Originally written by Per Bothner. Please send patches (context
# Please send patches to <config-patches@gnu.org>. Submit a context # diff format) to <config-patches@gnu.org> and include a ChangeLog
# diff and a properly formatted ChangeLog entry. # entry.
# #
# This script attempts to guess a canonical system name similar to # This script attempts to guess a canonical system name similar to
# config.sub. If it succeeds, it prints the system name on stdout, and # config.sub. If it succeeds, it prints the system name on stdout, and
# exits with 0. Otherwise, it exits with 1. # exits with 0. Otherwise, it exits with 1.
# #
# The plan is that this can be called by configure scripts if you # You can get the latest version of this script from:
# don't specify an explicit build system type. # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
me=`echo "$0" | sed -e 's,.*/,,'` me=`echo "$0" | sed -e 's,.*/,,'`
@@ -56,8 +56,9 @@ version="\
GNU config.guess ($timestamp) GNU config.guess ($timestamp)
Originally written by Per Bothner. Originally written by Per Bothner.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -170,7 +171,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
arm*|i386|m68k|ns32k|sh3*|sparc|vax) arm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep __ELF__ >/dev/null | grep -q __ELF__
then then
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
# Return netbsd for either. FIX? # Return netbsd for either. FIX?
@@ -269,7 +270,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# A Xn.n version is an unreleased experimental baselevel. # A Xn.n version is an unreleased experimental baselevel.
# 1.2 uses "1.2" for uname -r. # 1.2 uses "1.2" for uname -r.
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
exit ;; # Reset EXIT trap before exiting to avoid spurious non-zero exit code.
exitcode=$?
trap '' 0
exit $exitcode ;;
Alpha\ *:Windows_NT*:*) Alpha\ *:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem? # How do we know it's Interix rather than the generic POSIX subsystem?
# Should we change UNAME_MACHINE based on the output of uname instead # Should we change UNAME_MACHINE based on the output of uname instead
@@ -333,6 +337,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
exit ;; exit ;;
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
echo i386-pc-auroraux${UNAME_RELEASE}
exit ;;
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
eval $set_cc_for_build eval $set_cc_for_build
SUN_ARCH="i386" SUN_ARCH="i386"
@@ -548,7 +555,7 @@ EOF
echo rs6000-ibm-aix3.2 echo rs6000-ibm-aix3.2
fi fi
exit ;; exit ;;
*:AIX:*:[456]) *:AIX:*:[4567])
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
IBM_ARCH=rs6000 IBM_ARCH=rs6000
@@ -656,7 +663,7 @@ EOF
# => hppa64-hp-hpux11.23 # => hppa64-hp-hpux11.23
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
grep __LP64__ >/dev/null grep -q __LP64__
then then
HP_ARCH="hppa2.0w" HP_ARCH="hppa2.0w"
else else
@@ -785,13 +792,12 @@ EOF
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
exit ;; exit ;;
*:FreeBSD:*:*) *:FreeBSD:*:*)
case ${UNAME_MACHINE} in UNAME_PROCESSOR=`/usr/bin/uname -p`
pc98) case ${UNAME_PROCESSOR} in
echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
amd64) amd64)
echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
*) *)
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
esac esac
exit ;; exit ;;
i*:CYGWIN*:*) i*:CYGWIN*:*)
@@ -800,6 +806,9 @@ EOF
*:MINGW*:*) *:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32 echo ${UNAME_MACHINE}-pc-mingw32
exit ;; exit ;;
i*:MSYS*:*)
echo ${UNAME_MACHINE}-pc-msys
exit ;;
i*:windows32*:*) i*:windows32*:*)
# uname -m includes "-pc" on this system. # uname -m includes "-pc" on this system.
echo ${UNAME_MACHINE}-mingw32 echo ${UNAME_MACHINE}-mingw32
@@ -807,12 +816,12 @@ EOF
i*:PW*:*) i*:PW*:*)
echo ${UNAME_MACHINE}-pc-pw32 echo ${UNAME_MACHINE}-pc-pw32
exit ;; exit ;;
*:Interix*:[3456]*) *:Interix*:*)
case ${UNAME_MACHINE} in case ${UNAME_MACHINE} in
x86) x86)
echo i586-pc-interix${UNAME_RELEASE} echo i586-pc-interix${UNAME_RELEASE}
exit ;; exit ;;
EM64T | authenticamd | genuineintel) authenticamd | genuineintel | EM64T)
echo x86_64-unknown-interix${UNAME_RELEASE} echo x86_64-unknown-interix${UNAME_RELEASE}
exit ;; exit ;;
IA64) IA64)
@@ -822,6 +831,9 @@ EOF
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
echo i${UNAME_MACHINE}-pc-mks echo i${UNAME_MACHINE}-pc-mks
exit ;; exit ;;
8664:Windows_NT:*)
echo x86_64-pc-mks
exit ;;
i*:Windows_NT*:* | Pentium*:Windows_NT*:*) i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
# How do we know it's Interix rather than the generic POSIX subsystem? # How do we know it's Interix rather than the generic POSIX subsystem?
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
@@ -851,6 +863,20 @@ EOF
i*86:Minix:*:*) i*86:Minix:*:*)
echo ${UNAME_MACHINE}-pc-minix echo ${UNAME_MACHINE}-pc-minix
exit ;; exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
EV5) UNAME_MACHINE=alphaev5 ;;
EV56) UNAME_MACHINE=alphaev56 ;;
PCA56) UNAME_MACHINE=alphapca56 ;;
PCA57) UNAME_MACHINE=alphapca56 ;;
EV6) UNAME_MACHINE=alphaev6 ;;
EV67) UNAME_MACHINE=alphaev67 ;;
EV68*) UNAME_MACHINE=alphaev68 ;;
esac
objdump --private-headers /bin/sh | grep -q ld.so.1
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
exit ;;
arm*:Linux:*:*) arm*:Linux:*:*)
eval $set_cc_for_build eval $set_cc_for_build
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
@@ -858,7 +884,13 @@ EOF
then then
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
else else
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ARM_PCS_VFP
then
echo ${UNAME_MACHINE}-unknown-linux-gnueabi echo ${UNAME_MACHINE}-unknown-linux-gnueabi
else
echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
fi
fi fi
exit ;; exit ;;
avr32*:Linux:*:*) avr32*:Linux:*:*)
@@ -873,6 +905,20 @@ EOF
frv:Linux:*:*) frv:Linux:*:*)
echo frv-unknown-linux-gnu echo frv-unknown-linux-gnu
exit ;; exit ;;
hexagon:Linux:*:*)
echo hexagon-unknown-linux-gnu
exit ;;
i*86:Linux:*:*)
LIBC=gnu
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#ifdef __dietlibc__
LIBC=dietlibc
#endif
EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
exit ;;
ia64:Linux:*:*) ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;; exit ;;
@@ -882,78 +928,34 @@ EOF
m68*:Linux:*:*) m68*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;; exit ;;
mips:Linux:*:*) mips:Linux:*:* | mips64:Linux:*:*)
eval $set_cc_for_build eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c sed 's/^ //' << EOF >$dummy.c
#undef CPU #undef CPU
#undef mips #undef ${UNAME_MACHINE}
#undef mipsel #undef ${UNAME_MACHINE}el
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mipsel CPU=${UNAME_MACHINE}el
#else #else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips CPU=${UNAME_MACHINE}
#else #else
CPU= CPU=
#endif #endif
#endif #endif
EOF EOF
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
/^CPU/{
s: ::g
p
}'`"
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;;
mips64:Linux:*:*)
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#undef CPU
#undef mips64
#undef mips64el
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
CPU=mips64el
#else
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
CPU=mips64
#else
CPU=
#endif
#endif
EOF
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
/^CPU/{
s: ::g
p
}'`"
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
;; ;;
or32:Linux:*:*) or32:Linux:*:*)
echo or32-unknown-linux-gnu echo or32-unknown-linux-gnu
exit ;; exit ;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
exit ;;
ppc64:Linux:*:*)
echo powerpc64-unknown-linux-gnu
exit ;;
alpha:Linux:*:*)
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
EV5) UNAME_MACHINE=alphaev5 ;;
EV56) UNAME_MACHINE=alphaev56 ;;
PCA56) UNAME_MACHINE=alphapca56 ;;
PCA57) UNAME_MACHINE=alphapca56 ;;
EV6) UNAME_MACHINE=alphaev6 ;;
EV67) UNAME_MACHINE=alphaev67 ;;
EV68*) UNAME_MACHINE=alphaev68 ;;
esac
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
exit ;;
padre:Linux:*:*) padre:Linux:*:*)
echo sparc-unknown-linux-gnu echo sparc-unknown-linux-gnu
exit ;; exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*)
echo hppa64-unknown-linux-gnu
exit ;;
parisc:Linux:*:* | hppa:Linux:*:*) parisc:Linux:*:* | hppa:Linux:*:*)
# Look for CPU level # Look for CPU level
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
@@ -962,8 +964,11 @@ EOF
*) echo hppa-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;;
esac esac
exit ;; exit ;;
parisc64:Linux:*:* | hppa64:Linux:*:*) ppc64:Linux:*:*)
echo hppa64-unknown-linux-gnu echo powerpc64-unknown-linux-gnu
exit ;;
ppc:Linux:*:*)
echo powerpc-unknown-linux-gnu
exit ;; exit ;;
s390:Linux:*:* | s390x:Linux:*:*) s390:Linux:*:* | s390x:Linux:*:*)
echo ${UNAME_MACHINE}-ibm-linux echo ${UNAME_MACHINE}-ibm-linux
@@ -977,6 +982,9 @@ EOF
sparc:Linux:*:* | sparc64:Linux:*:*) sparc:Linux:*:* | sparc64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;; exit ;;
tile*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;;
vax:Linux:*:*) vax:Linux:*:*)
echo ${UNAME_MACHINE}-dec-linux-gnu echo ${UNAME_MACHINE}-dec-linux-gnu
exit ;; exit ;;
@@ -986,66 +994,6 @@ EOF
xtensa*:Linux:*:*) xtensa*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-gnu echo ${UNAME_MACHINE}-unknown-linux-gnu
exit ;; exit ;;
i*86:Linux:*:*)
# The BFD linker knows what the default object file format is, so
# first see if it will tell us. cd to the root directory to prevent
# problems with other programs or directories called `ld' in the path.
# Set LC_ALL=C to ensure ld outputs messages in English.
ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
| sed -ne '/supported targets:/!d
s/[ ][ ]*/ /g
s/.*supported targets: *//
s/ .*//
p'`
case "$ld_supported_targets" in
elf32-i386)
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
;;
a.out-i386-linux)
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
exit ;;
"")
# Either a pre-BFD a.out linker (linux-gnuoldld) or
# one that does not give us useful --help.
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
exit ;;
esac
# Determine whether the default compiler is a.out or elf
eval $set_cc_for_build
sed 's/^ //' << EOF >$dummy.c
#include <features.h>
#ifdef __ELF__
# ifdef __GLIBC__
# if __GLIBC__ >= 2
LIBC=gnu
# else
LIBC=gnulibc1
# endif
# else
LIBC=gnulibc1
# endif
#else
#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
LIBC=gnu
#else
LIBC=gnuaout
#endif
#endif
#ifdef __dietlibc__
LIBC=dietlibc
#endif
EOF
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
/^LIBC/{
s: ::g
p
}'`"
test x"${LIBC}" != x && {
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
exit
}
test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
;;
i*86:DYNIX/ptx:4*:*) i*86:DYNIX/ptx:4*:*)
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
# earlier versions are messed up and put the nodename in both # earlier versions are messed up and put the nodename in both
@@ -1074,7 +1022,7 @@ EOF
i*86:syllable:*:*) i*86:syllable:*:*)
echo ${UNAME_MACHINE}-pc-syllable echo ${UNAME_MACHINE}-pc-syllable
exit ;; exit ;;
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
echo i386-unknown-lynxos${UNAME_RELEASE} echo i386-unknown-lynxos${UNAME_RELEASE}
exit ;; exit ;;
i*86:*DOS:*:*) i*86:*DOS:*:*)
@@ -1182,7 +1130,7 @@ EOF
rs6000:LynxOS:2.*:*) rs6000:LynxOS:2.*:*)
echo rs6000-unknown-lynxos${UNAME_RELEASE} echo rs6000-unknown-lynxos${UNAME_RELEASE}
exit ;; exit ;;
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
echo powerpc-unknown-lynxos${UNAME_RELEASE} echo powerpc-unknown-lynxos${UNAME_RELEASE}
exit ;; exit ;;
SM[BE]S:UNIX_SV:*:*) SM[BE]S:UNIX_SV:*:*)
@@ -1275,6 +1223,16 @@ EOF
*:Darwin:*:*) *:Darwin:*:*)
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
case $UNAME_PROCESSOR in case $UNAME_PROCESSOR in
i386)
eval $set_cc_for_build
if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
grep IS_64BIT_ARCH >/dev/null
then
UNAME_PROCESSOR="x86_64"
fi
fi ;;
unknown) UNAME_PROCESSOR=powerpc ;; unknown) UNAME_PROCESSOR=powerpc ;;
esac esac
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
@@ -1290,6 +1248,9 @@ EOF
*:QNX:*:4*) *:QNX:*:4*)
echo i386-pc-qnx echo i386-pc-qnx
exit ;; exit ;;
NEO-?:NONSTOP_KERNEL:*:*)
echo neo-tandem-nsk${UNAME_RELEASE}
exit ;;
NSE-?:NONSTOP_KERNEL:*:*) NSE-?:NONSTOP_KERNEL:*:*)
echo nse-tandem-nsk${UNAME_RELEASE} echo nse-tandem-nsk${UNAME_RELEASE}
exit ;; exit ;;

179
config.sub vendored
View File

@@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# Configuration validation subroutine script. # Configuration validation subroutine script.
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
# Free Software Foundation, Inc. # 2011 Free Software Foundation, Inc.
timestamp='2009-04-17' timestamp='2011-11-11'
# This file is (in principle) common to ALL GNU software. # This file is (in principle) common to ALL GNU software.
# The presence of a machine in this file suggests that SOME GNU software # The presence of a machine in this file suggests that SOME GNU software
@@ -32,13 +32,16 @@ timestamp='2009-04-17'
# Please send patches to <config-patches@gnu.org>. Submit a context # Please send patches to <config-patches@gnu.org>. Submit a context
# diff and a properly formatted ChangeLog entry. # diff and a properly formatted GNU ChangeLog entry.
# #
# Configuration subroutine to validate and canonicalize a configuration type. # Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument. # Supply the specified configuration type as an argument.
# If it is invalid, we print an error message on stderr and exit with code 1. # If it is invalid, we print an error message on stderr and exit with code 1.
# Otherwise, we print the canonical config type on stdout and succeed. # Otherwise, we print the canonical config type on stdout and succeed.
# You can get the latest version of this script from:
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
# This file is supposed to be the same for all GNU packages # This file is supposed to be the same for all GNU packages
# and recognize all the CPU types, system types and aliases # and recognize all the CPU types, system types and aliases
# that are meaningful with *any* GNU software. # that are meaningful with *any* GNU software.
@@ -72,8 +75,9 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\ version="\
GNU config.sub ($timestamp) GNU config.sub ($timestamp)
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free
Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -120,8 +124,9 @@ esac
# Here we must recognize all the valid KERNEL-OS combinations. # Here we must recognize all the valid KERNEL-OS combinations.
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in case $maybe_os in
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
knetbsd*-gnu* | netbsd*-gnu* | \
kopensolaris*-gnu* | \ kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*) storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os os=-$maybe_os
@@ -149,10 +154,13 @@ case $os in
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-apple | -axis | -knuth | -cray) -apple | -axis | -knuth | -cray | -microblaze)
os= os=
basic_machine=$1 basic_machine=$1
;; ;;
-bluegene*)
os=-cnk
;;
-sim | -cisco | -oki | -wec | -winbond) -sim | -cisco | -oki | -wec | -winbond)
os= os=
basic_machine=$1 basic_machine=$1
@@ -243,13 +251,17 @@ case $basic_machine in
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
| am33_2.0 \ | am33_2.0 \
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
| be32 | be64 \
| bfin \ | bfin \
| c4x | clipper \ | c4x | clipper \
| d10v | d30v | dlx | dsp16xx \ | d10v | d30v | dlx | dsp16xx \
| epiphany \
| fido | fr30 | frv \ | fido | fr30 | frv \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| hexagon \
| i370 | i860 | i960 | ia64 \ | i370 | i860 | i960 | ia64 \
| ip2k | iq2000 \ | ip2k | iq2000 \
| le32 | le64 \
| lm32 \ | lm32 \
| m32c | m32r | m32rle | m68000 | m68k | m88k \ | m32c | m32r | m32rle | m68000 | m68k | m88k \
| maxq | mb | microblaze | mcore | mep | metag \ | maxq | mb | microblaze | mcore | mep | metag \
@@ -275,26 +287,39 @@ case $basic_machine in
| moxie \ | moxie \
| mt \ | mt \
| msp430 \ | msp430 \
| nds32 | nds32le | nds32be \
| nios | nios2 \ | nios | nios2 \
| ns16k | ns32k \ | ns16k | ns32k \
| open8 \
| or32 \ | or32 \
| pdp10 | pdp11 | pj | pjl \ | pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \ | pyramid \
| rl78 | rx \
| score \ | score \
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \ | sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \
| spu | strongarm \ | spu \
| tahoe | thumb | tic4x | tic80 | tron \ | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| v850 | v850e \ | ubicom32 \
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
| we32k \ | we32k \
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | x86 | xc16x | xstormy16 | xtensa \
| z8k | z80) | z8k | z80)
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
;; ;;
m6811 | m68hc11 | m6812 | m68hc12) c54x)
basic_machine=tic54x-unknown
;;
c55x)
basic_machine=tic55x-unknown
;;
c6x)
basic_machine=tic6x-unknown
;;
m6811 | m68hc11 | m6812 | m68hc12 | picochip)
# Motorola 68HC11/12. # Motorola 68HC11/12.
basic_machine=$basic_machine-unknown basic_machine=$basic_machine-unknown
os=-none os=-none
@@ -305,6 +330,18 @@ case $basic_machine in
basic_machine=mt-unknown basic_machine=mt-unknown
;; ;;
strongarm | thumb | xscale)
basic_machine=arm-unknown
;;
xscaleeb)
basic_machine=armeb-unknown
;;
xscaleel)
basic_machine=armel-unknown
;;
# We use `pc' rather than `unknown' # We use `pc' rather than `unknown'
# because (1) that's what they normally are, and # because (1) that's what they normally are, and
# (2) the word "unknown" tends to confuse beginning users. # (2) the word "unknown" tends to confuse beginning users.
@@ -324,20 +361,23 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \ | avr-* | avr32-* \
| be32-* | be64-* \
| bfin-* | bs2000-* \ | bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \
| clipper-* | craynv-* | cydra-* \ | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \ | d10v-* | d30v-* | dlx-* \
| elxsi-* \ | elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \ | h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
| hexagon-* \
| i*86-* | i860-* | i960-* | ia64-* \ | i*86-* | i860-* | i960-* | ia64-* \
| ip2k-* | iq2000-* \ | ip2k-* | iq2000-* \
| le32-* | le64-* \
| lm32-* \ | lm32-* \
| m32c-* | m32r-* | m32rle-* \ | m32c-* | m32r-* | m32rle-* \
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
| mips16-* \ | mips16-* \
| mips64-* | mips64el-* \ | mips64-* | mips64el-* \
@@ -359,24 +399,29 @@ case $basic_machine in
| mmix-* \ | mmix-* \
| mt-* \ | mt-* \
| msp430-* \ | msp430-* \
| nds32-* | nds32le-* | nds32be-* \
| nios-* | nios2-* \ | nios-* | nios2-* \
| none-* | np1-* | ns16k-* | ns32k-* \ | none-* | np1-* | ns16k-* | ns32k-* \
| open8-* \
| orion-* \ | orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \ | pyramid-* \
| romp-* | rs6000-* \ | rl78-* | romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \ | sparclite-* \
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
| tahoe-* | thumb-* \ | tahoe-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* | tile-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tile*-* \
| tron-* \ | tron-* \
| v850-* | v850e-* | vax-* \ | ubicom32-* \
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
| vax-* \
| we32k-* \ | we32k-* \
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \ | xstormy16-* | xtensa*-* \
| ymp-* \ | ymp-* \
| z8k-* | z80-*) | z8k-* | z80-*)
@@ -467,6 +512,19 @@ case $basic_machine in
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
os=-linux os=-linux
;; ;;
bluegene*)
basic_machine=powerpc-ibm
os=-cnk
;;
c54x-*)
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
c55x-*)
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
c6x-*)
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
c90) c90)
basic_machine=c90-cray basic_machine=c90-cray
os=-unicos os=-unicos
@@ -503,7 +561,7 @@ case $basic_machine in
basic_machine=craynv-cray basic_machine=craynv-cray
os=-unicosmp os=-unicosmp
;; ;;
cr16) cr16 | cr16-*)
basic_machine=cr16-unknown basic_machine=cr16-unknown
os=-elf os=-elf
;; ;;
@@ -719,6 +777,9 @@ case $basic_machine in
basic_machine=ns32k-utek basic_machine=ns32k-utek
os=-sysv os=-sysv
;; ;;
microblaze)
basic_machine=microblaze-xilinx
;;
mingw32) mingw32)
basic_machine=i386-pc basic_machine=i386-pc
os=-mingw32 os=-mingw32
@@ -755,10 +816,18 @@ case $basic_machine in
ms1-*) ms1-*)
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
;; ;;
msys)
basic_machine=i386-pc
os=-msys
;;
mvs) mvs)
basic_machine=i370-ibm basic_machine=i370-ibm
os=-mvs os=-mvs
;; ;;
nacl)
basic_machine=le32-unknown
os=-nacl
;;
ncr3000) ncr3000)
basic_machine=i486-ncr basic_machine=i486-ncr
os=-sysv4 os=-sysv4
@@ -823,6 +892,12 @@ case $basic_machine in
np1) np1)
basic_machine=np1-gould basic_machine=np1-gould
;; ;;
neo-tandem)
basic_machine=neo-tandem
;;
nse-tandem)
basic_machine=nse-tandem
;;
nsr-tandem) nsr-tandem)
basic_machine=nsr-tandem basic_machine=nsr-tandem
;; ;;
@@ -905,9 +980,10 @@ case $basic_machine in
;; ;;
power) basic_machine=power-ibm power) basic_machine=power-ibm
;; ;;
ppc) basic_machine=powerpc-unknown ppc | ppcbe) basic_machine=powerpc-unknown
;; ;;
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ppc-* | ppcbe-*)
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
;; ;;
ppcle | powerpclittle | ppc-le | powerpc-little) ppcle | powerpclittle | ppc-le | powerpc-little)
basic_machine=powerpcle-unknown basic_machine=powerpcle-unknown
@@ -1001,6 +1077,9 @@ case $basic_machine in
basic_machine=i860-stratus basic_machine=i860-stratus
os=-sysv4 os=-sysv4
;; ;;
strongarm-* | thumb-*)
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
;;
sun2) sun2)
basic_machine=m68000-sun basic_machine=m68000-sun
;; ;;
@@ -1057,20 +1136,8 @@ case $basic_machine in
basic_machine=t90-cray basic_machine=t90-cray
os=-unicos os=-unicos
;; ;;
tic54x | c54x*)
basic_machine=tic54x-unknown
os=-coff
;;
tic55x | c55x*)
basic_machine=tic55x-unknown
os=-coff
;;
tic6x | c6x*)
basic_machine=tic6x-unknown
os=-coff
;;
tile*) tile*)
basic_machine=tile-unknown basic_machine=$basic_machine-unknown
os=-linux-gnu os=-linux-gnu
;; ;;
tx39) tx39)
@@ -1140,6 +1207,9 @@ case $basic_machine in
xps | xps100) xps | xps100)
basic_machine=xps100-honeywell basic_machine=xps100-honeywell
;; ;;
xscale-* | xscalee[bl]-*)
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
;;
ymp) ymp)
basic_machine=ymp-cray basic_machine=ymp-cray
os=-unicos os=-unicos
@@ -1240,6 +1310,9 @@ case $os in
# First match some system type aliases # First match some system type aliases
# that might get confused with valid system types. # that might get confused with valid system types.
# -solaris* is a basic system type, with this one exception. # -solaris* is a basic system type, with this one exception.
-auroraux)
os=-auroraux
;;
-solaris1 | -solaris1.*) -solaris1 | -solaris1.*)
os=`echo $os | sed -e 's|solaris1|sunos4|'` os=`echo $os | sed -e 's|solaris1|sunos4|'`
;; ;;
@@ -1260,9 +1333,9 @@ case $os in
# Each alternative MUST END IN A *, to match a version number. # Each alternative MUST END IN A *, to match a version number.
# -sysv* is not here because it comes later, after sysvr4. # -sysv* is not here because it comes later, after sysvr4.
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
| -kopensolaris* \ | -sym* | -kopensolaris* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
| -aos* | -aros* \ | -aos* | -aros* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
@@ -1274,8 +1347,9 @@ case $os in
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
| -chorusos* | -chorusrdb* | -cegcc* \ | -chorusos* | -chorusrdb* | -cegcc* \
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -mingw32* | -linux-gnu* | -linux-android* \
| -linux-newlib* | -linux-uclibc* \
| -uxpv* | -beos* | -mpeix* | -udk* \ | -uxpv* | -beos* | -mpeix* | -udk* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
@@ -1283,7 +1357,7 @@ case $os in
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*) | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
# Remember, each alternative MUST END IN *, to match a version number. # Remember, each alternative MUST END IN *, to match a version number.
;; ;;
-qnx*) -qnx*)
@@ -1416,6 +1490,8 @@ case $os in
-dicos*) -dicos*)
os=-dicos os=-dicos
;; ;;
-nacl*)
;;
-none) -none)
;; ;;
*) *)
@@ -1456,6 +1532,15 @@ case $basic_machine in
c4x-* | tic4x-*) c4x-* | tic4x-*)
os=-coff os=-coff
;; ;;
tic54x-*)
os=-coff
;;
tic55x-*)
os=-coff
;;
tic6x-*)
os=-coff
;;
# This must come before the *-dec entry. # This must come before the *-dec entry.
pdp10-*) pdp10-*)
os=-tops20 os=-tops20
@@ -1613,7 +1698,7 @@ case $basic_machine in
-sunos*) -sunos*)
vendor=sun vendor=sun
;; ;;
-aix*) -cnk*|-aix*)
vendor=ibm vendor=ibm
;; ;;
-beos*) -beos*)

8625
configure vendored

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
# Configure script for IJG libjpeg # Configure script for IJG libjpeg
# #
AC_INIT([libjpeg], [7.0]) AC_INIT([libjpeg], [8.4.0])
# Directory where autotools helper scripts lives. # Directory where autotools helper scripts lives.
AC_CONFIG_AUX_DIR([.]) AC_CONFIG_AUX_DIR([.])
@@ -21,7 +21,7 @@ AC_CANONICAL_TARGET
# Initialize Automake # Initialize Automake
# Don't require all the GNU mandated files # Don't require all the GNU mandated files
AM_INIT_AUTOMAKE([-Wall -Werror ansi2knr no-dist foreign]) AM_INIT_AUTOMAKE([-Wall -Werror -Wno-obsolete ansi2knr no-dist foreign])
# Make --enable-silent-rules the default. # Make --enable-silent-rules the default.
# To get verbose build output you may configure # To get verbose build output you may configure
@@ -63,7 +63,7 @@ VERS_2 {
global: sym; global: sym;
} VERS_1; } VERS_1;
EOF EOF
AC_LINK_IFELSE(AC_LANG_PROGRAM([], []), AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
[have_ld_version_script=yes], [have_ld_version_script=no]) [have_ld_version_script=yes], [have_ld_version_script=no])
rm -f conftest.map rm -f conftest.map
LDFLAGS="$save_LDFLAGS" LDFLAGS="$save_LDFLAGS"
@@ -72,9 +72,9 @@ fi
AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes") AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
# See if compiler supports prototypes. # See if compiler supports prototypes.
AC_MSG_CHECKING(for function prototypes) AC_MSG_CHECKING([for function prototypes])
AC_CACHE_VAL(ijg_cv_have_prototypes, AC_CACHE_VAL([ijg_cv_have_prototypes],
[AC_TRY_COMPILE([ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
int testfunction (int arg1, int * arg2); /* check prototypes */ int testfunction (int arg1, int * arg2); /* check prototypes */
struct methods_struct { /* check method-pointer declarations */ struct methods_struct { /* check method-pointer declarations */
int (*error_exit) (char *msgtext); int (*error_exit) (char *msgtext);
@@ -85,25 +85,29 @@ int testfunction (int arg1, int * arg2) /* check definitions */
{ return arg2[arg1]; } { return arg2[arg1]; }
int test2function (void) /* check void arg list */ int test2function (void) /* check void arg list */
{ return 0; } { return 0; }
], [ ], ijg_cv_have_prototypes=yes, ijg_cv_have_prototypes=no)]) ]])],
AC_MSG_RESULT($ijg_cv_have_prototypes) [ijg_cv_have_prototypes=yes],
[ijg_cv_have_prototypes=no])])
AC_MSG_RESULT([$ijg_cv_have_prototypes])
if test $ijg_cv_have_prototypes = yes; then if test $ijg_cv_have_prototypes = yes; then
AC_DEFINE([HAVE_PROTOTYPES],[1],[Compiler supports function prototypes.]) AC_DEFINE([HAVE_PROTOTYPES],[1],[Compiler supports function prototypes.])
else else
echo Your compiler does not seem to know about function prototypes. AC_MSG_WARN([Your compiler does not seem to know about function prototypes.
echo Perhaps it needs a special switch to enable ANSI C mode. Perhaps it needs a special switch to enable ANSI C mode.
echo If so, we recommend running configure like this: If so, we recommend running configure like this:
echo " ./configure CC='cc -switch'" ./configure CC='cc -switch'
echo where -switch is the proper switch. where -switch is the proper switch.])
fi fi
# Check header files # Check header files
AC_CHECK_HEADERS(stddef.h stdlib.h locale.h) AC_CHECK_HEADERS([stddef.h stdlib.h locale.h])
AC_CHECK_HEADER(string.h, , AC_DEFINE([NEED_BSD_STRINGS],[1],[Compiler has <strings.h> rather than standard <string.h>.])) AC_CHECK_HEADER([string.h], [],
[AC_DEFINE([NEED_BSD_STRINGS], [1],
[Compiler has <strings.h> rather than standard <string.h>.])])
# See whether type size_t is defined in any ANSI-standard places; # See whether type size_t is defined in any ANSI-standard places;
# if not, perhaps it is defined in <sys/types.h>. # if not, perhaps it is defined in <sys/types.h>.
AC_MSG_CHECKING(for size_t) AC_MSG_CHECKING([for size_t])
AC_TRY_COMPILE([ AC_TRY_COMPILE([
#ifdef HAVE_STDDEF_H #ifdef HAVE_STDDEF_H
#include <stddef.h> #include <stddef.h>
@@ -118,33 +122,42 @@ AC_TRY_COMPILE([
#include <string.h> #include <string.h>
#endif #endif
typedef size_t my_size_t; typedef size_t my_size_t;
], [ my_size_t foovar; ], ijg_size_t_ok=yes, ],
[ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"]) [ my_size_t foovar; ],
AC_MSG_RESULT($ijg_size_t_ok) [ijg_size_t_ok=yes],
[ijg_size_t_ok="not ANSI, perhaps it is in sys/types.h"])
AC_MSG_RESULT([$ijg_size_t_ok])
if test "$ijg_size_t_ok" != yes; then if test "$ijg_size_t_ok" != yes; then
AC_CHECK_HEADER(sys/types.h, [AC_DEFINE([NEED_SYS_TYPES_H],[1],[Need to include <sys/types.h> in order to obtain size_t.]) AC_CHECK_HEADER([sys/types.h],
AC_EGREP_CPP(size_t, [#include <sys/types.h>], [AC_DEFINE([NEED_SYS_TYPES_H], [1],
[ijg_size_t_ok="size_t is in sys/types.h"], ijg_size_t_ok=no)], [Need to include <sys/types.h> in order to obtain size_t.])
ijg_size_t_ok=no) AC_EGREP_CPP([size_t], [#include <sys/types.h>],
AC_MSG_RESULT($ijg_size_t_ok) [ijg_size_t_ok="size_t is in sys/types.h"],
if test "$ijg_size_t_ok" = no; then [ijg_size_t_ok=no])],
echo Type size_t is not defined in any of the usual places. [ijg_size_t_ok=no])
echo Try putting '"typedef unsigned int size_t;"' in jconfig.h. AC_MSG_RESULT([$ijg_size_t_ok])
fi if test "$ijg_size_t_ok" = no; then
AC_MSG_WARN([Type size_t is not defined in any of the usual places.
Try putting '"typedef unsigned int size_t;"' in jconfig.h.])
fi
fi fi
# Check compiler characteristics # Check compiler characteristics
AC_MSG_CHECKING(for type unsigned char) AC_MSG_CHECKING([for type unsigned char])
AC_TRY_COMPILE(, [ unsigned char un_char; ], AC_TRY_COMPILE([], [ unsigned char un_char; ],
[AC_MSG_RESULT(yes) [AC_MSG_RESULT(yes)
AC_DEFINE([HAVE_UNSIGNED_CHAR],[1],[Compiler supports 'unsigned char'.])], AC_MSG_RESULT(no)) AC_DEFINE([HAVE_UNSIGNED_CHAR], [1],
dnl [Compiler supports 'unsigned char'.])],
AC_MSG_CHECKING(for type unsigned short) [AC_MSG_RESULT(no)])
AC_TRY_COMPILE(, [ unsigned short un_short; ],
[AC_MSG_RESULT(yes) AC_MSG_CHECKING([for type unsigned short])
AC_DEFINE([HAVE_UNSIGNED_SHORT],[1],[Compiler supports 'unsigned short'.])], AC_MSG_RESULT(no)) AC_TRY_COMPILE([], [ unsigned short un_short; ],
dnl [AC_MSG_RESULT(yes)
AC_MSG_CHECKING(for type void) AC_DEFINE([HAVE_UNSIGNED_SHORT], [1],
[Compiler supports 'unsigned short'.])],
[AC_MSG_RESULT(no)])
AC_MSG_CHECKING([for type void])
AC_TRY_COMPILE([ AC_TRY_COMPILE([
/* Caution: a C++ compiler will insist on valid prototypes */ /* Caution: a C++ compiler will insist on valid prototypes */
typedef void * void_ptr; /* check void * */ typedef void * void_ptr; /* check void * */
@@ -166,39 +179,51 @@ void test3function (arg1, arg2)
arg1 = (void *) locptr; arg1 = (void *) locptr;
(*arg2) (1, 2); /* check call of fcn returning void */ (*arg2) (1, 2); /* check call of fcn returning void */
} }
], [ ], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no) ], [ ],
AC_DEFINE([void],[char],[Define 'void' as 'char' for archaic compilers that don't understand it.])]) [AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
AC_DEFINE([void], [char],
[Define 'void' as 'char' for archaic compilers
that don't understand it.])])
AC_C_CONST AC_C_CONST
# Check for non-broken inline under various spellings # Check for non-broken inline under various spellings
AC_MSG_CHECKING(for inline) AC_MSG_CHECKING([for inline])
ijg_cv_inline="" ijg_cv_inline=""
AC_TRY_COMPILE(, [} __inline__ int foo() { return 0; } AC_TRY_COMPILE([], [} __inline__ int foo() { return 0; }
int bar() { return foo();], ijg_cv_inline="__inline__", int bar() { return foo();], ijg_cv_inline="__inline__",
AC_TRY_COMPILE(, [} __inline int foo() { return 0; } [AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
int bar() { return foo();], ijg_cv_inline="__inline", int bar() { return foo();], ijg_cv_inline="__inline",
AC_TRY_COMPILE(, [} inline int foo() { return 0; } [AC_TRY_COMPILE(, [} inline int foo() { return 0; }
int bar() { return foo();], ijg_cv_inline="inline"))) int bar() { return foo();], ijg_cv_inline="inline")])])
AC_MSG_RESULT($ijg_cv_inline) AC_MSG_RESULT($ijg_cv_inline)
AC_DEFINE_UNQUOTED([INLINE],[$ijg_cv_inline],[How to obtain function inlining.]) AC_DEFINE_UNQUOTED([INLINE], [$ijg_cv_inline],
[How to obtain function inlining.])
# We cannot check for bogus warnings, but at least we can check for errors # We cannot check for bogus warnings, but at least we can check for errors
AC_MSG_CHECKING(for broken incomplete types) AC_MSG_CHECKING([for broken incomplete types])
AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ], , AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ],
AC_MSG_RESULT(ok), [],
[AC_MSG_RESULT(broken) [AC_MSG_RESULT(ok)],
AC_DEFINE([INCOMPLETE_TYPES_BROKEN],[1],[Compiler does not support pointers to unspecified structures.])]) [AC_MSG_RESULT(broken)
AC_DEFINE([INCOMPLETE_TYPES_BROKEN], [1],
[Compiler does not support pointers to unspecified
structures.])])
# Test whether global names are unique to at least 15 chars # Test whether global names are unique to at least 15 chars
AC_MSG_CHECKING(for short external names) AC_MSG_CHECKING([for short external names])
AC_TRY_LINK([ AC_TRY_LINK([
int possibly_duplicate_function () { return 0; } int possibly_duplicate_function () { return 0; }
int possibly_dupli_function () { return 1; } int possibly_dupli_function () { return 1; }
], [ ], AC_MSG_RESULT(ok), [AC_MSG_RESULT(short) ], [],
AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES],[1],[Linker requires that global names be unique in first 15 characters.])]) [AC_MSG_RESULT(ok)],
[AC_MSG_RESULT(short)
AC_DEFINE([NEED_SHORT_EXTERNAL_NAMES], [1],
[Linker requires that global names be unique in
first 15 characters.])])
# Run-time checks # Run-time checks
AC_MSG_CHECKING(to see if char is signed) AC_MSG_CHECKING([to see if char is signed])
AC_TRY_RUN([ AC_TRY_RUN([
#ifdef HAVE_PROTOTYPES #ifdef HAVE_PROTOTYPES
int is_char_signed (int arg) int is_char_signed (int arg)
@@ -220,12 +245,14 @@ char signed_char_check = (char) (-67);
int main() { int main() {
exit(is_char_signed((int) signed_char_check)); exit(is_char_signed((int) signed_char_check));
}], [AC_MSG_RESULT(no) }], [AC_MSG_RESULT(no)
AC_DEFINE([CHAR_IS_UNSIGNED],[1],[Characters are unsigned])], AC_MSG_RESULT(yes), AC_DEFINE([CHAR_IS_UNSIGNED], [1],
[echo Assuming that char is signed on target machine. [Characters are unsigned])],
echo If it is unsigned, this will be a little bit inefficient. [AC_MSG_RESULT(yes)],
[AC_MSG_WARN([Assuming that char is signed on target machine.
If it is unsigned, this will be a little bit inefficient.])
]) ])
dnl
AC_MSG_CHECKING(to see if right shift is signed) AC_MSG_CHECKING([to see if right shift is signed])
AC_TRY_RUN([ AC_TRY_RUN([
#ifdef HAVE_PROTOTYPES #ifdef HAVE_PROTOTYPES
int is_shifting_signed (long arg) int is_shifting_signed (long arg)
@@ -252,20 +279,26 @@ int is_shifting_signed (arg)
} }
int main() { int main() {
exit(is_shifting_signed(-0x7F7E80B1L)); exit(is_shifting_signed(-0x7F7E80B1L));
}], [AC_MSG_RESULT(no) }],
AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED],[1],[Broken compiler shifts signed values as an unsigned shift.])], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no)
AC_MSG_RESULT(Assuming that right shift is signed on target machine.)) AC_DEFINE([RIGHT_SHIFT_IS_UNSIGNED], [1],
dnl [Broken compiler shifts signed values as an unsigned shift.])],
AC_MSG_CHECKING(to see if fopen accepts b spec) [AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(Assuming that right shift is signed on target machine.)])
AC_MSG_CHECKING([to see if fopen accepts b spec])
AC_TRY_RUN([ AC_TRY_RUN([
#include <stdio.h> #include <stdio.h>
int main() { int main() {
if (fopen("conftestdata", "wb") != NULL) if (fopen("conftestdata", "wb") != NULL)
exit(0); exit(0);
exit(1); exit(1);
}], AC_MSG_RESULT(yes), [AC_MSG_RESULT(no) }],
AC_DEFINE([DONT_USE_B_MODE],[1],[Don't open files in binary mode.])], [AC_MSG_RESULT(yes)],
AC_MSG_RESULT(Assuming that it does.)) [AC_MSG_RESULT(no)
AC_DEFINE([DONT_USE_B_MODE], [1],
[Don't open files in binary mode.])],
[AC_MSG_RESULT(Assuming that it does.)])
# Configure libtool # Configure libtool
AC_LIBTOOL_WIN32_DLL AC_LIBTOOL_WIN32_DLL
@@ -275,9 +308,9 @@ AC_PROG_LIBTOOL
# If no "-enable-maxmem", use jmemnobs # If no "-enable-maxmem", use jmemnobs
MEMORYMGR='jmemnobs' MEMORYMGR='jmemnobs'
MAXMEM="no" MAXMEM="no"
AC_ARG_ENABLE(maxmem, AC_ARG_ENABLE([maxmem],
[ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB], [ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB],
MAXMEM="$enableval") [MAXMEM="$enableval"])
dnl [# support --with-maxmem for backwards compatibility with IJG V5.] dnl [# support --with-maxmem for backwards compatibility with IJG V5.]
dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval") dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval")
if test "x$MAXMEM" = xyes; then if test "x$MAXMEM" = xyes; then
@@ -288,30 +321,36 @@ if test "x$MAXMEM" != xno; then
AC_MSG_ERROR(non-numeric argument to --enable-maxmem) AC_MSG_ERROR(non-numeric argument to --enable-maxmem)
fi fi
DEFAULTMAXMEM=`expr $MAXMEM \* 1048576` DEFAULTMAXMEM=`expr $MAXMEM \* 1048576`
AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}], [Maximum data space library will allocate.]) AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}],
AC_MSG_CHECKING([for 'tmpfile()']) [Maximum data space library will allocate.])
AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ], AC_MSG_CHECKING([for 'tmpfile()'])
[AC_MSG_RESULT(yes) AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ],
MEMORYMGR='jmemansi'], [AC_MSG_RESULT(yes)
[AC_MSG_RESULT(no) MEMORYMGR='jmemansi'],
dnl if tmpfile is not present, must use jmemname. [AC_MSG_RESULT(no)
MEMORYMGR='jmemname' dnl if tmpfile is not present, must use jmemname.
MEMORYMGR='jmemname'
# Test for the need to remove temporary files using a signal handler (for cjpeg/djpeg) # Test for the need to remove temporary files using a signal handler
AC_DEFINE([NEED_SIGNAL_CATCHER],[1],[Need signal handler to clean up temporary files.]) # (for cjpeg/djpeg)
AC_MSG_CHECKING([for 'mktemp()']) AC_DEFINE([NEED_SIGNAL_CATCHER], [1],
AC_TRY_LINK(, [ char fname[80]; mktemp(fname); ], AC_MSG_RESULT(yes), [Need signal handler to clean up temporary files.])
[AC_MSG_RESULT(no) AC_MSG_CHECKING([for 'mktemp()'])
AC_DEFINE([NO_MKTEMP],[1],[The mktemp() function is not available.])])]) AC_TRY_LINK([], [ char fname[80]; mktemp(fname); ],
[AC_MSG_RESULT(yes)],
[AC_MSG_RESULT(no)
AC_DEFINE([NO_MKTEMP], [1],
[The mktemp() function is not available.])])])
fi fi
AC_SUBST(MEMORYMGR) AC_SUBST([MEMORYMGR])
# Extract the library version ID from jpeglib.h. # Extract the library version IDs from jpeglib.h.
AC_MSG_CHECKING([libjpeg version number]) AC_MSG_CHECKING([libjpeg version number])
[JPEG_LIB_VERSION=`sed -e '/^#define JPEG_LIB_VERSION/!d' -e 's/^[^0-9]*\([0-9][0-9]*\).*$/\1/' $srcdir/jpeglib.h`] [major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
[JPEG_LIB_VERSION="`expr $JPEG_LIB_VERSION / 10`:`expr $JPEG_LIB_VERSION % 10`"] minor=`sed -ne 's/^#define JPEG_LIB_VERSION_MINOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`]
AC_SUBST([JPEG_LIB_VERSION],
[`expr $major + $minor`:0:$minor])
AC_MSG_RESULT([$JPEG_LIB_VERSION]) AC_MSG_RESULT([$JPEG_LIB_VERSION])
AC_SUBST([JPEG_LIB_VERSION])
AC_CONFIG_FILES([Makefile]) AC_CONFIG_FILES([Makefile])
AC_OUTPUT AC_OUTPUT

74
depcomp
View File

@@ -1,10 +1,10 @@
#! /bin/sh #! /bin/sh
# depcomp - compile a program generating dependencies as side-effects # depcomp - compile a program generating dependencies as side-effects
scriptversion=2009-04-28.21; # UTC scriptversion=2011-12-04.11; # UTC
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
# Software Foundation, Inc. # 2011 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@@ -44,7 +44,7 @@ Environment variables:
object Object file output by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'.
DEPDIR directory where to store dependencies. DEPDIR directory where to store dependencies.
depfile Dependency file to output. depfile Dependency file to output.
tmpdepfile Temporary file to use when outputing dependencies. tmpdepfile Temporary file to use when outputting dependencies.
libtool Whether libtool is used (yes/no). libtool Whether libtool is used (yes/no).
Report bugs to <bug-automake@gnu.org>. Report bugs to <bug-automake@gnu.org>.
@@ -90,10 +90,18 @@ if test "$depmode" = msvcmsys; then
# This is just like msvisualcpp but w/o cygpath translation. # This is just like msvisualcpp but w/o cygpath translation.
# Just convert the backslash-escaped backslashes to single forward # Just convert the backslash-escaped backslashes to single forward
# slashes to satisfy depend.m4 # slashes to satisfy depend.m4
cygpath_u="sed s,\\\\\\\\,/,g" cygpath_u='sed s,\\\\,/,g'
depmode=msvisualcpp depmode=msvisualcpp
fi fi
if test "$depmode" = msvc7msys; then
# This is just like msvc7 but w/o cygpath translation.
# Just convert the backslash-escaped backslashes to single forward
# slashes to satisfy depend.m4
cygpath_u='sed s,\\\\,/,g'
depmode=msvc7
fi
case "$depmode" in case "$depmode" in
gcc3) gcc3)
## gcc 3 implements dependency tracking that does exactly what ## gcc 3 implements dependency tracking that does exactly what
@@ -158,10 +166,12 @@ gcc)
' < "$tmpdepfile" | ' < "$tmpdepfile" |
## Some versions of gcc put a space before the `:'. On the theory ## Some versions of gcc put a space before the `:'. On the theory
## that the space means something, we add a space to the output as ## that the space means something, we add a space to the output as
## well. ## well. hp depmode also adds that space, but also prefixes the VPATH
## to the object. Take care to not repeat it in the output.
## Some versions of the HPUX 10.20 sed can't process this invocation ## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround. ## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
| sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" rm -f "$tmpdepfile"
;; ;;
@@ -405,6 +415,52 @@ tru64)
rm -f "$tmpdepfile" rm -f "$tmpdepfile"
;; ;;
msvc7)
if test "$libtool" = yes; then
showIncludes=-Wc,-showIncludes
else
showIncludes=-showIncludes
fi
"$@" $showIncludes > "$tmpdepfile"
stat=$?
grep -v '^Note: including file: ' "$tmpdepfile"
if test "$stat" = 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
# The first sed program below extracts the file names and escapes
# backslashes for cygpath. The second sed program outputs the file
# name when reading, but also accumulates all include files in the
# hold buffer in order to output them again at the end. This only
# works with sed implementations that can handle large buffers.
sed < "$tmpdepfile" -n '
/^Note: including file: *\(.*\)/ {
s//\1/
s/\\/\\\\/g
p
}' | $cygpath_u | sort -u | sed -n '
s/ /\\ /g
s/\(.*\)/ \1 \\/p
s/.\(.*\) \\/\1:/
H
$ {
s/.*/ /
G
p
}' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvc7msys)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
#nosideeffect) #nosideeffect)
# This comment above is used by automake to tell side-effect # This comment above is used by automake to tell side-effect
# dependency tracking mechanisms from slower ones. # dependency tracking mechanisms from slower ones.
@@ -503,7 +559,9 @@ makedepend)
touch "$tmpdepfile" touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile" rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile" # makedepend may prepend the VPATH from the source file name to the object.
# No need to regex-escape $object, excess matching of '.' is harmless.
sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
sed '1,2d' "$tmpdepfile" | tr ' ' ' sed '1,2d' "$tmpdepfile" | tr ' ' '
' | \ ' | \
## Some versions of the HPUX 10.20 sed can't process this invocation ## Some versions of the HPUX 10.20 sed can't process this invocation

View File

@@ -1,4 +1,4 @@
.TH DJPEG 1 "28 March 2009" .TH DJPEG 1 "3 October 2009"
.SH NAME .SH NAME
djpeg \- decompress a JPEG file to an image file djpeg \- decompress a JPEG file to an image file
.SH SYNOPSIS .SH SYNOPSIS
@@ -62,9 +62,10 @@ runs noticeably faster in this mode.
.TP .TP
.BI \-scale " M/N" .BI \-scale " M/N"
Scale the output image by a factor M/N. Currently supported scale factors are Scale the output image by a factor M/N. Currently supported scale factors are
M/8 with all M from 1 to 16. If the /N part is omitted, then M specifies the M/N with all M from 1 to 16, where N is the source DCT size, which is 8 for
DCT scaled size to be applied on the given input, which is currently baseline JPEG. If the /N part is omitted, then M specifies the DCT scaled
equivalent to M/8 scaling, since the source DCT size is currently always 8. size to be applied on the given input. For baseline JPEG this is equivalent
to M/8 scaling, since the source DCT size for baseline JPEG is 8.
Scaling is handy if the image is larger than your screen; also, Scaling is handy if the image is larger than your screen; also,
.B djpeg .B djpeg
runs much faster when scaling down the output. runs much faster when scaling down the output.

View File

@@ -73,7 +73,7 @@ jfdctflt.c Forward DCT using floating-point arithmetic.
jchuff.c Huffman entropy coding. jchuff.c Huffman entropy coding.
jcarith.c Arithmetic entropy coding. jcarith.c Arithmetic entropy coding.
jcmarker.c JPEG marker writing. jcmarker.c JPEG marker writing.
jdatadst.c Data destination manager for stdio output. jdatadst.c Data destination managers for memory and stdio output.
Decompression side of the library: Decompression side of the library:
@@ -95,7 +95,7 @@ jdmerge.c Merged upsampling/color conversion (faster, lower quality).
jquant1.c One-pass color quantization using a fixed-spacing colormap. jquant1.c One-pass color quantization using a fixed-spacing colormap.
jquant2.c Two-pass color quantization using a custom-generated colormap. jquant2.c Two-pass color quantization using a custom-generated colormap.
Also handles one-pass quantization to an externally given map. Also handles one-pass quantization to an externally given map.
jdatasrc.c Data source manager for stdio input. jdatasrc.c Data source managers for memory and stdio input.
Support files for both compression and decompression: Support files for both compression and decompression:

View File

@@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# install - install a program, script, or datafile # install - install a program, script, or datafile
scriptversion=2009-04-28.21; # UTC scriptversion=2011-01-19.21; # UTC
# This originates from X11R5 (mit/util/scripts/install.sh), which was # This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the # later released in X11R6 (xc/config/util/install.sh) with the
@@ -156,6 +156,10 @@ while test $# -ne 0; do
-s) stripcmd=$stripprog;; -s) stripcmd=$stripprog;;
-t) dst_arg=$2 -t) dst_arg=$2
# Protect names problematic for `test' and other utilities.
case $dst_arg in
-* | [=\(\)!]) dst_arg=./$dst_arg;;
esac
shift;; shift;;
-T) no_target_directory=true;; -T) no_target_directory=true;;
@@ -186,6 +190,10 @@ if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
fi fi
shift # arg shift # arg
dst_arg=$arg dst_arg=$arg
# Protect names problematic for `test' and other utilities.
case $dst_arg in
-* | [=\(\)!]) dst_arg=./$dst_arg;;
esac
done done
fi fi
@@ -200,7 +208,11 @@ if test $# -eq 0; then
fi fi
if test -z "$dir_arg"; then if test -z "$dir_arg"; then
trap '(exit $?); exit' 1 2 13 15 do_exit='(exit $ret); exit $ret'
trap "ret=129; $do_exit" 1
trap "ret=130; $do_exit" 2
trap "ret=141; $do_exit" 13
trap "ret=143; $do_exit" 15
# Set umask so as not to create temps with too-generous modes. # Set umask so as not to create temps with too-generous modes.
# However, 'strip' requires both read and write access to temps. # However, 'strip' requires both read and write access to temps.
@@ -228,9 +240,9 @@ fi
for src for src
do do
# Protect names starting with `-'. # Protect names problematic for `test' and other utilities.
case $src in case $src in
-*) src=./$src;; -* | [=\(\)!]) src=./$src;;
esac esac
if test -n "$dir_arg"; then if test -n "$dir_arg"; then
@@ -252,12 +264,7 @@ do
echo "$0: no destination specified." >&2 echo "$0: no destination specified." >&2
exit 1 exit 1
fi fi
dst=$dst_arg dst=$dst_arg
# Protect names starting with `-'.
case $dst in
-*) dst=./$dst;;
esac
# If destination is a directory, append the input filename; won't work # If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored. # if double slashes aren't ignored.
@@ -385,7 +392,7 @@ do
case $dstdir in case $dstdir in
/*) prefix='/';; /*) prefix='/';;
-*) prefix='./';; [-=\(\)!]*) prefix='./';;
*) prefix='';; *) prefix='';;
esac esac
@@ -403,7 +410,7 @@ do
for d for d
do do
test -z "$d" && continue test X"$d" = X && continue
prefix=$prefix$d prefix=$prefix$d
if test -d "$prefix"; then if test -d "$prefix"; then

View File

@@ -1,6 +1,6 @@
INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software INSTALLATION INSTRUCTIONS for the Independent JPEG Group's JPEG software
Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. Copyright (C) 1991-2011, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software. This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file. For conditions of distribution and use, see the accompanying README file.
@@ -149,7 +149,7 @@ makefile.mc6 jconfig.mc6 MS-DOS, Microsoft C (16-bit only)
makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C makefile.wat jconfig.wat MS-DOS, OS/2, or Windows NT, Watcom C
makefile.vc jconfig.vc Windows NT/95, MS Visual C++ makefile.vc jconfig.vc Windows NT/95, MS Visual C++
make*.vc6 jconfig.vc Windows NT/95, MS Visual C++ 6 make*.vc6 jconfig.vc Windows NT/95, MS Visual C++ 6
make*.vc9 jconfig.vc Windows NT/95, MS Visual C++ 2008 (v9) make*.v10 jconfig.vc Windows NT/95, MS Visual C++ 2010 (v10)
makefile.mms jconfig.vms Digital VMS, with MMS software makefile.mms jconfig.vms Digital VMS, with MMS software
makefile.vms jconfig.vms Digital VMS, without MMS software makefile.vms jconfig.vms Digital VMS, without MMS software
@@ -321,9 +321,9 @@ several forms:
testimg.jpg The output of cjpeg testimg.ppm testimg.jpg The output of cjpeg testimg.ppm
testprog.jpg Progressive-mode equivalent of testorig.jpg. testprog.jpg Progressive-mode equivalent of testorig.jpg.
testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm testimgp.jpg The output of cjpeg -progressive -optimize testimg.ppm
(The first- and second-generation .jpg files aren't identical since JPEG is (The first- and second-generation .jpg files aren't identical since the
lossy.) If you can generate duplicates of the testimg* files then you default compression parameters are lossy.) If you can generate duplicates
probably have working programs. of the testimg* files then you probably have working programs.
With most of the makefiles, "make test" will perform the necessary With most of the makefiles, "make test" will perform the necessary
comparisons. comparisons.
@@ -998,8 +998,8 @@ model. makefile.vc is intended for command-line use. (If you are using
the Developer Studio environment, you may prefer the DevStudio project the Developer Studio environment, you may prefer the DevStudio project
files; see below.) files; see below.)
v7 adds extern "C" to jpeglib.h. This avoids the need to put extern "C" IJG JPEG 7 adds extern "C" to jpeglib.h. This avoids the need to put
{ ... } around #include "jpeglib.h" in your C++ application. extern "C" { ... } around #include "jpeglib.h" in your C++ application.
You can also force VC++ to treat the library as C++ code by renaming You can also force VC++ to treat the library as C++ code by renaming
all the *.c files to *.cpp (and adjusting the makefile to match). all the *.c files to *.cpp (and adjusting the makefile to match).
In this case you also need to define the symbol DONT_USE_EXTERN_C in In this case you also need to define the symbol DONT_USE_EXTERN_C in
@@ -1015,51 +1015,50 @@ as Win32 console applications. (Even if you only want the library, we
recommend building the applications so that you can run the self-test.) recommend building the applications so that you can run the self-test.)
To use: To use:
1. Copy jconfig.vc to jconfig.h, makejdsw.vc6 to jpeg.dsw, 1. Open the command prompt, change to the main directory and execute the
makeadsw.vc6 to apps.dsw, makejmak.vc6 to jpeg.mak, command line
makejdep.vc6 to jpeg.dep, makejdsp.vc6 to jpeg.dsp, NMAKE /f makefile.vc setup-vc6
makecmak.vc6 to cjpeg.mak, makecdep.vc6 to cjpeg.dep, This will move jconfig.vc to jconfig.h and makefiles to project files.
makecdsp.vc6 to cjpeg.dsp, makedmak.vc6 to djpeg.mak, (Note that the renaming is critical!)
makeddep.vc6 to djpeg.dep, makeddsp.vc6 to djpeg.dsp, 2. Open the workspace file jpeg.dsw, build the library project.
maketmak.vc6 to jpegtran.mak, maketdep.vc6 to jpegtran.dep,
maketdsp.vc6 to jpegtran.dsp, makermak.vc6 to rdjpgcom.mak,
makerdep.vc6 to rdjpgcom.dep, makerdsp.vc6 to rdjpgcom.dsp,
makewmak.vc6 to wrjpgcom.mak, makewdep.vc6 to wrjpgcom.dep, and
makewdsp.vc6 to wrjpgcom.dsp. (Note that the renaming is critical!)
2. Click on jpeg.dsw and apps.dsw to load the project workspaces.
(If you are using DevStudio more recent than 6.0, you'll probably (If you are using DevStudio more recent than 6.0, you'll probably
get a message saying that the project files are being updated.) get a message saying that the project files are being updated.)
3. Build the library project, then the applications project. 3. Open the workspace file apps.dsw, build the application projects.
4. Move the application .exe files from `app`\Release to an 4. To perform the self-test, execute the command line
NMAKE /f makefile.vc test-build
5. Move the application .exe files from `app`\Release to an
appropriate location on your path. appropriate location on your path.
5. To perform the self-test, execute the command line
NMAKE /f makefile.vc test
Microsoft Windows, Microsoft Visual C++ 2008 Developer Studio (v9): Microsoft Windows, Microsoft Visual C++ 2010 Developer Studio (v10):
We include makefiles that should work as project files in Visual Studio We include makefiles that should work as project files in Visual Studio
2008 or later. There is a library makefile that builds the IJG library 2010 or later. There is a library makefile that builds the IJG library
as a static Win32 library, and application makefiles that build the sample as a static Win32 library, and application makefiles that build the sample
applications as Win32 console applications. (Even if you only want the applications as Win32 console applications. (Even if you only want the
library, we recommend building the applications so that you can run the library, we recommend building the applications so that you can run the
self-test.) self-test.)
To use: To use:
1. Copy jconfig.vc to jconfig.h, makejsln.vc9 to jpeg.sln, 1. Open the command prompt, change to the main directory and execute the
makeasln.vc9 to apps.sln, makejvcp.vc9 to jpeg.vcproj, command line
makecvcp.vc9 to cjpeg.vcproj, makedvcp.vc9 to djpeg.vcproj, NMAKE /f makefile.vc setup-v10
maketvcp.vc9 to jpegtran.vcproj, makervcp.vc9 to rdjpgcom.vcproj, and This will move jconfig.vc to jconfig.h and makefiles to project files.
makewvcp.vc9 to wrjpgcom.vcproj. (Note that the renaming is critical!) (Note that the renaming is critical!)
2. Click on jpeg.sln and apps.sln to load the project solutions. 2. Open the solution file jpeg.sln, build the library project.
(If you are using Visual Studio more recent than 2008 (v9), you'll (If you are using Visual Studio more recent than 2010 (v10), you'll
probably get a message saying that the project files are being probably get a message saying that the project files are being updated.)
updated.) 3. Open the solution file apps.sln, build the application projects.
3. Build the library project, then the applications project. 4. To perform the self-test, execute the command line
4. Move the application .exe files from `app`\Release to an NMAKE /f makefile.vc test-build
5. Move the application .exe files from `app`\Release to an
appropriate location on your path. appropriate location on your path.
5. To perform the self-test, execute the command line
NMAKE /f makefile.vc test Note:
There seems to be an optimization bug in the compiler which causes the
self-test to fail with the color quantization option.
We have disabled optimization for the file jquant2.c in the library
project file which causes the self-test to pass properly.
OS/2, Borland C++: OS/2, Borland C++:

243
jaricom.c
View File

@@ -1,16 +1,16 @@
/* /*
* jaricom.c * jaricom.c
* *
* Developed 1997 by Guido Vollbeding. * Developed 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains probability estimation tables for common use in * This file contains probability estimation tables for common use in
* arithmetic entropy encoding and decoding routines. * arithmetic entropy encoding and decoding routines.
* *
* This data represents Table D.2 in the JPEG spec (ISO/IEC IS 10918-1 * This data represents Table D.3 in the JPEG spec (D.2 in the draft),
* and CCITT Recommendation ITU-T T.81) and Table 24 in the JBIG spec * ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24
* (ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82). * in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82.
*/ */
#define JPEG_INTERNALS #define JPEG_INTERNALS
@@ -26,123 +26,128 @@
* implementation (jbig_tab.c). * implementation (jbig_tab.c).
*/ */
#define V(a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b) #define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)
const INT32 jaritab[113] = { const INT32 jpeg_aritab[113+1] = {
/* /*
* Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS * Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS
*/ */
/* 0 */ V( 0x5a1d, 1, 1, 1 ), V( 0, 0x5a1d, 1, 1, 1 ),
/* 1 */ V( 0x2586, 14, 2, 0 ), V( 1, 0x2586, 14, 2, 0 ),
/* 2 */ V( 0x1114, 16, 3, 0 ), V( 2, 0x1114, 16, 3, 0 ),
/* 3 */ V( 0x080b, 18, 4, 0 ), V( 3, 0x080b, 18, 4, 0 ),
/* 4 */ V( 0x03d8, 20, 5, 0 ), V( 4, 0x03d8, 20, 5, 0 ),
/* 5 */ V( 0x01da, 23, 6, 0 ), V( 5, 0x01da, 23, 6, 0 ),
/* 6 */ V( 0x00e5, 25, 7, 0 ), V( 6, 0x00e5, 25, 7, 0 ),
/* 7 */ V( 0x006f, 28, 8, 0 ), V( 7, 0x006f, 28, 8, 0 ),
/* 8 */ V( 0x0036, 30, 9, 0 ), V( 8, 0x0036, 30, 9, 0 ),
/* 9 */ V( 0x001a, 33, 10, 0 ), V( 9, 0x001a, 33, 10, 0 ),
/* 10 */ V( 0x000d, 35, 11, 0 ), V( 10, 0x000d, 35, 11, 0 ),
/* 11 */ V( 0x0006, 9, 12, 0 ), V( 11, 0x0006, 9, 12, 0 ),
/* 12 */ V( 0x0003, 10, 13, 0 ), V( 12, 0x0003, 10, 13, 0 ),
/* 13 */ V( 0x0001, 12, 13, 0 ), V( 13, 0x0001, 12, 13, 0 ),
/* 14 */ V( 0x5a7f, 15, 15, 1 ), V( 14, 0x5a7f, 15, 15, 1 ),
/* 15 */ V( 0x3f25, 36, 16, 0 ), V( 15, 0x3f25, 36, 16, 0 ),
/* 16 */ V( 0x2cf2, 38, 17, 0 ), V( 16, 0x2cf2, 38, 17, 0 ),
/* 17 */ V( 0x207c, 39, 18, 0 ), V( 17, 0x207c, 39, 18, 0 ),
/* 18 */ V( 0x17b9, 40, 19, 0 ), V( 18, 0x17b9, 40, 19, 0 ),
/* 19 */ V( 0x1182, 42, 20, 0 ), V( 19, 0x1182, 42, 20, 0 ),
/* 20 */ V( 0x0cef, 43, 21, 0 ), V( 20, 0x0cef, 43, 21, 0 ),
/* 21 */ V( 0x09a1, 45, 22, 0 ), V( 21, 0x09a1, 45, 22, 0 ),
/* 22 */ V( 0x072f, 46, 23, 0 ), V( 22, 0x072f, 46, 23, 0 ),
/* 23 */ V( 0x055c, 48, 24, 0 ), V( 23, 0x055c, 48, 24, 0 ),
/* 24 */ V( 0x0406, 49, 25, 0 ), V( 24, 0x0406, 49, 25, 0 ),
/* 25 */ V( 0x0303, 51, 26, 0 ), V( 25, 0x0303, 51, 26, 0 ),
/* 26 */ V( 0x0240, 52, 27, 0 ), V( 26, 0x0240, 52, 27, 0 ),
/* 27 */ V( 0x01b1, 54, 28, 0 ), V( 27, 0x01b1, 54, 28, 0 ),
/* 28 */ V( 0x0144, 56, 29, 0 ), V( 28, 0x0144, 56, 29, 0 ),
/* 29 */ V( 0x00f5, 57, 30, 0 ), V( 29, 0x00f5, 57, 30, 0 ),
/* 30 */ V( 0x00b7, 59, 31, 0 ), V( 30, 0x00b7, 59, 31, 0 ),
/* 31 */ V( 0x008a, 60, 32, 0 ), V( 31, 0x008a, 60, 32, 0 ),
/* 32 */ V( 0x0068, 62, 33, 0 ), V( 32, 0x0068, 62, 33, 0 ),
/* 33 */ V( 0x004e, 63, 34, 0 ), V( 33, 0x004e, 63, 34, 0 ),
/* 34 */ V( 0x003b, 32, 35, 0 ), V( 34, 0x003b, 32, 35, 0 ),
/* 35 */ V( 0x002c, 33, 9, 0 ), V( 35, 0x002c, 33, 9, 0 ),
/* 36 */ V( 0x5ae1, 37, 37, 1 ), V( 36, 0x5ae1, 37, 37, 1 ),
/* 37 */ V( 0x484c, 64, 38, 0 ), V( 37, 0x484c, 64, 38, 0 ),
/* 38 */ V( 0x3a0d, 65, 39, 0 ), V( 38, 0x3a0d, 65, 39, 0 ),
/* 39 */ V( 0x2ef1, 67, 40, 0 ), V( 39, 0x2ef1, 67, 40, 0 ),
/* 40 */ V( 0x261f, 68, 41, 0 ), V( 40, 0x261f, 68, 41, 0 ),
/* 41 */ V( 0x1f33, 69, 42, 0 ), V( 41, 0x1f33, 69, 42, 0 ),
/* 42 */ V( 0x19a8, 70, 43, 0 ), V( 42, 0x19a8, 70, 43, 0 ),
/* 43 */ V( 0x1518, 72, 44, 0 ), V( 43, 0x1518, 72, 44, 0 ),
/* 44 */ V( 0x1177, 73, 45, 0 ), V( 44, 0x1177, 73, 45, 0 ),
/* 45 */ V( 0x0e74, 74, 46, 0 ), V( 45, 0x0e74, 74, 46, 0 ),
/* 46 */ V( 0x0bfb, 75, 47, 0 ), V( 46, 0x0bfb, 75, 47, 0 ),
/* 47 */ V( 0x09f8, 77, 48, 0 ), V( 47, 0x09f8, 77, 48, 0 ),
/* 48 */ V( 0x0861, 78, 49, 0 ), V( 48, 0x0861, 78, 49, 0 ),
/* 49 */ V( 0x0706, 79, 50, 0 ), V( 49, 0x0706, 79, 50, 0 ),
/* 50 */ V( 0x05cd, 48, 51, 0 ), V( 50, 0x05cd, 48, 51, 0 ),
/* 51 */ V( 0x04de, 50, 52, 0 ), V( 51, 0x04de, 50, 52, 0 ),
/* 52 */ V( 0x040f, 50, 53, 0 ), V( 52, 0x040f, 50, 53, 0 ),
/* 53 */ V( 0x0363, 51, 54, 0 ), V( 53, 0x0363, 51, 54, 0 ),
/* 54 */ V( 0x02d4, 52, 55, 0 ), V( 54, 0x02d4, 52, 55, 0 ),
/* 55 */ V( 0x025c, 53, 56, 0 ), V( 55, 0x025c, 53, 56, 0 ),
/* 56 */ V( 0x01f8, 54, 57, 0 ), V( 56, 0x01f8, 54, 57, 0 ),
/* 57 */ V( 0x01a4, 55, 58, 0 ), V( 57, 0x01a4, 55, 58, 0 ),
/* 58 */ V( 0x0160, 56, 59, 0 ), V( 58, 0x0160, 56, 59, 0 ),
/* 59 */ V( 0x0125, 57, 60, 0 ), V( 59, 0x0125, 57, 60, 0 ),
/* 60 */ V( 0x00f6, 58, 61, 0 ), V( 60, 0x00f6, 58, 61, 0 ),
/* 61 */ V( 0x00cb, 59, 62, 0 ), V( 61, 0x00cb, 59, 62, 0 ),
/* 62 */ V( 0x00ab, 61, 63, 0 ), V( 62, 0x00ab, 61, 63, 0 ),
/* 63 */ V( 0x008f, 61, 32, 0 ), V( 63, 0x008f, 61, 32, 0 ),
/* 64 */ V( 0x5b12, 65, 65, 1 ), V( 64, 0x5b12, 65, 65, 1 ),
/* 65 */ V( 0x4d04, 80, 66, 0 ), V( 65, 0x4d04, 80, 66, 0 ),
/* 66 */ V( 0x412c, 81, 67, 0 ), V( 66, 0x412c, 81, 67, 0 ),
/* 67 */ V( 0x37d8, 82, 68, 0 ), V( 67, 0x37d8, 82, 68, 0 ),
/* 68 */ V( 0x2fe8, 83, 69, 0 ), V( 68, 0x2fe8, 83, 69, 0 ),
/* 69 */ V( 0x293c, 84, 70, 0 ), V( 69, 0x293c, 84, 70, 0 ),
/* 70 */ V( 0x2379, 86, 71, 0 ), V( 70, 0x2379, 86, 71, 0 ),
/* 71 */ V( 0x1edf, 87, 72, 0 ), V( 71, 0x1edf, 87, 72, 0 ),
/* 72 */ V( 0x1aa9, 87, 73, 0 ), V( 72, 0x1aa9, 87, 73, 0 ),
/* 73 */ V( 0x174e, 72, 74, 0 ), V( 73, 0x174e, 72, 74, 0 ),
/* 74 */ V( 0x1424, 72, 75, 0 ), V( 74, 0x1424, 72, 75, 0 ),
/* 75 */ V( 0x119c, 74, 76, 0 ), V( 75, 0x119c, 74, 76, 0 ),
/* 76 */ V( 0x0f6b, 74, 77, 0 ), V( 76, 0x0f6b, 74, 77, 0 ),
/* 77 */ V( 0x0d51, 75, 78, 0 ), V( 77, 0x0d51, 75, 78, 0 ),
/* 78 */ V( 0x0bb6, 77, 79, 0 ), V( 78, 0x0bb6, 77, 79, 0 ),
/* 79 */ V( 0x0a40, 77, 48, 0 ), V( 79, 0x0a40, 77, 48, 0 ),
/* 80 */ V( 0x5832, 80, 81, 1 ), V( 80, 0x5832, 80, 81, 1 ),
/* 81 */ V( 0x4d1c, 88, 82, 0 ), V( 81, 0x4d1c, 88, 82, 0 ),
/* 82 */ V( 0x438e, 89, 83, 0 ), V( 82, 0x438e, 89, 83, 0 ),
/* 83 */ V( 0x3bdd, 90, 84, 0 ), V( 83, 0x3bdd, 90, 84, 0 ),
/* 84 */ V( 0x34ee, 91, 85, 0 ), V( 84, 0x34ee, 91, 85, 0 ),
/* 85 */ V( 0x2eae, 92, 86, 0 ), V( 85, 0x2eae, 92, 86, 0 ),
/* 86 */ V( 0x299a, 93, 87, 0 ), V( 86, 0x299a, 93, 87, 0 ),
/* 87 */ V( 0x2516, 86, 71, 0 ), V( 87, 0x2516, 86, 71, 0 ),
/* 88 */ V( 0x5570, 88, 89, 1 ), V( 88, 0x5570, 88, 89, 1 ),
/* 89 */ V( 0x4ca9, 95, 90, 0 ), V( 89, 0x4ca9, 95, 90, 0 ),
/* 90 */ V( 0x44d9, 96, 91, 0 ), V( 90, 0x44d9, 96, 91, 0 ),
/* 91 */ V( 0x3e22, 97, 92, 0 ), V( 91, 0x3e22, 97, 92, 0 ),
/* 92 */ V( 0x3824, 99, 93, 0 ), V( 92, 0x3824, 99, 93, 0 ),
/* 93 */ V( 0x32b4, 99, 94, 0 ), V( 93, 0x32b4, 99, 94, 0 ),
/* 94 */ V( 0x2e17, 93, 86, 0 ), V( 94, 0x2e17, 93, 86, 0 ),
/* 95 */ V( 0x56a8, 95, 96, 1 ), V( 95, 0x56a8, 95, 96, 1 ),
/* 96 */ V( 0x4f46, 101, 97, 0 ), V( 96, 0x4f46, 101, 97, 0 ),
/* 97 */ V( 0x47e5, 102, 98, 0 ), V( 97, 0x47e5, 102, 98, 0 ),
/* 98 */ V( 0x41cf, 103, 99, 0 ), V( 98, 0x41cf, 103, 99, 0 ),
/* 99 */ V( 0x3c3d, 104, 100, 0 ), V( 99, 0x3c3d, 104, 100, 0 ),
/* 100 */ V( 0x375e, 99, 93, 0 ), V( 100, 0x375e, 99, 93, 0 ),
/* 101 */ V( 0x5231, 105, 102, 0 ), V( 101, 0x5231, 105, 102, 0 ),
/* 102 */ V( 0x4c0f, 106, 103, 0 ), V( 102, 0x4c0f, 106, 103, 0 ),
/* 103 */ V( 0x4639, 107, 104, 0 ), V( 103, 0x4639, 107, 104, 0 ),
/* 104 */ V( 0x415e, 103, 99, 0 ), V( 104, 0x415e, 103, 99, 0 ),
/* 105 */ V( 0x5627, 105, 106, 1 ), V( 105, 0x5627, 105, 106, 1 ),
/* 106 */ V( 0x50e7, 108, 107, 0 ), V( 106, 0x50e7, 108, 107, 0 ),
/* 107 */ V( 0x4b85, 109, 103, 0 ), V( 107, 0x4b85, 109, 103, 0 ),
/* 108 */ V( 0x5597, 110, 109, 0 ), V( 108, 0x5597, 110, 109, 0 ),
/* 109 */ V( 0x504f, 111, 107, 0 ), V( 109, 0x504f, 111, 107, 0 ),
/* 110 */ V( 0x5a10, 110, 111, 1 ), V( 110, 0x5a10, 110, 111, 1 ),
/* 111 */ V( 0x5522, 112, 109, 0 ), V( 111, 0x5522, 112, 109, 0 ),
/* 112 */ V( 0x59eb, 112, 111, 1 ) V( 112, 0x59eb, 112, 111, 1 ),
/*
* This last entry is used for fixed probability estimate of 0.5
* as suggested in Section 10.3 Table 5 of ITU-T Rec. T.851.
*/
V( 113, 0x5a1d, 113, 113, 0 )
}; };

View File

@@ -2,6 +2,7 @@
* jcapimin.c * jcapimin.c
* *
* Copyright (C) 1994-1998, Thomas G. Lane. * Copyright (C) 1994-1998, Thomas G. Lane.
* Modified 2003-2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -73,6 +74,11 @@ jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
cinfo->ac_huff_tbl_ptrs[i] = NULL; cinfo->ac_huff_tbl_ptrs[i] = NULL;
} }
/* Must do it here for emit_dqt in case jpeg_write_tables is used */
cinfo->block_size = DCTSIZE;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
cinfo->script_space = NULL; cinfo->script_space = NULL;
cinfo->input_gamma = 1.0; /* in case application forgets */ cinfo->input_gamma = 1.0; /* in case application forgets */

110
jcarith.c
View File

@@ -1,7 +1,7 @@
/* /*
* jcarith.c * jcarith.c
* *
* Developed 1997 by Guido Vollbeding. * Developed 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -40,6 +40,9 @@ typedef struct {
/* Pointers to statistics areas (these workspaces have image lifespan) */ /* Pointers to statistics areas (these workspaces have image lifespan) */
unsigned char * dc_stats[NUM_ARITH_TBLS]; unsigned char * dc_stats[NUM_ARITH_TBLS];
unsigned char * ac_stats[NUM_ARITH_TBLS]; unsigned char * ac_stats[NUM_ARITH_TBLS];
/* Statistics bin for coding with fixed probability 0.5 */
unsigned char fixed_bin[4];
} arith_entropy_encoder; } arith_entropy_encoder;
typedef arith_entropy_encoder * arith_entropy_ptr; typedef arith_entropy_encoder * arith_entropy_ptr;
@@ -48,8 +51,6 @@ typedef arith_entropy_encoder * arith_entropy_ptr;
* for the statistics area. * for the statistics area.
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least * 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. * 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, * We use a compact representation with 1 byte per statistics bin,
* thus the numbers directly represent byte sizes. * thus the numbers directly represent byte sizes.
@@ -217,17 +218,16 @@ finish_pass (j_compress_ptr cinfo)
LOCAL(void) LOCAL(void)
arith_encode (j_compress_ptr cinfo, unsigned char *st, int val) 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 arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
register unsigned char nl, nm; register unsigned char nl, nm;
register INT32 qe, temp; register INT32 qe, temp;
register int sv; register int sv;
/* Fetch values from our compact representation of Table D.2: /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine * Qe values and probability estimation state machine
*/ */
sv = *st; sv = *st;
qe = jaritab[sv & 0x7F]; /* => Qe_Value */ qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
@@ -327,16 +327,18 @@ emit_restart (j_compress_ptr cinfo, int restart_num)
emit_byte(0xFF, cinfo); emit_byte(0xFF, cinfo);
emit_byte(JPEG_RST0 + restart_num, cinfo); emit_byte(JPEG_RST0 + restart_num, cinfo);
/* Re-initialize statistics areas */
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
/* Re-initialize statistics areas */ /* DC needs no table for refinement scan */
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) { if (cinfo->Ss == 0 && cinfo->Ah == 0) {
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
/* Reset DC predictions to 0 */ /* Reset DC predictions to 0 */
entropy->last_dc_val[ci] = 0; entropy->last_dc_val[ci] = 0;
entropy->dc_context[ci] = 0; entropy->dc_context[ci] = 0;
} }
if (cinfo->progressive_mode == 0 || cinfo->Ss) { /* AC needs no table when not present */
if (cinfo->Se) {
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
} }
} }
@@ -427,9 +429,9 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
} }
arith_encode(cinfo, st, 0); arith_encode(cinfo, st, 0);
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1)) if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
entropy->dc_context[ci] = 0; /* zero diff category */ entropy->dc_context[ci] = 0; /* zero diff category */
else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1)) else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
entropy->dc_context[ci] += 8; /* large diff category */ entropy->dc_context[ci] += 8; /* large diff category */
/* Figure F.9: Encoding the magnitude bit pattern of v */ /* Figure F.9: Encoding the magnitude bit pattern of v */
st += 14; st += 14;
@@ -455,6 +457,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int tbl, k, ke; int tbl, k, ke;
int v, v2, m; int v, v2, m;
const int * natural_order;
/* Emit restart marker if needed */ /* Emit restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -467,6 +470,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
entropy->restarts_to_go--; entropy->restarts_to_go--;
} }
natural_order = cinfo->natural_order;
/* Encode the MCU data block */ /* Encode the MCU data block */
block = MCU_data[0]; block = MCU_data[0];
tbl = cinfo->cur_comp_info[0]->ac_tbl_no; tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
@@ -474,12 +479,12 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */ /* Establish EOB (end-of-block) index */
for (ke = cinfo->Se + 1; ke > 1; ke--) for (ke = cinfo->Se; ke > 0; ke--)
/* We must apply the point transform by Al. For AC coefficients this /* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably * is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value. * in C, we shift after obtaining the absolute value.
*/ */
if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) { if ((v = (*block)[natural_order[ke]]) >= 0) {
if (v >>= cinfo->Al) break; if (v >>= cinfo->Al) break;
} else { } else {
v = -v; v = -v;
@@ -487,22 +492,21 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
} }
/* Figure F.5: Encode_AC_Coefficients */ /* Figure F.5: Encode_AC_Coefficients */
for (k = cinfo->Ss; k < ke; k++) { for (k = cinfo->Ss; k <= ke; k++) {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * (k - 1);
arith_encode(cinfo, st, 0); /* EOB decision */ arith_encode(cinfo, st, 0); /* EOB decision */
entropy->ac_stats[tbl][245] = 0;
for (;;) { for (;;) {
if ((v = (*block)[jpeg_natural_order[k]]) >= 0) { if ((v = (*block)[natural_order[k]]) >= 0) {
if (v >>= cinfo->Al) { if (v >>= cinfo->Al) {
arith_encode(cinfo, st + 1, 1); arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0); arith_encode(cinfo, entropy->fixed_bin, 0);
break; break;
} }
} else { } else {
v = -v; v = -v;
if (v >>= cinfo->Al) { if (v >>= cinfo->Al) {
arith_encode(cinfo, st + 1, 1); arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1); arith_encode(cinfo, entropy->fixed_bin, 1);
break; break;
} }
} }
@@ -551,7 +555,7 @@ METHODDEF(boolean)
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data) encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
{ {
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
unsigned char st[4]; unsigned char *st;
int Al, blkn; int Al, blkn;
/* Emit restart marker if needed */ /* Emit restart marker if needed */
@@ -565,11 +569,11 @@ encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
entropy->restarts_to_go--; entropy->restarts_to_go--;
} }
st = entropy->fixed_bin; /* use fixed probability estimation */
Al = cinfo->Al; Al = cinfo->Al;
/* Encode the MCU data blocks */ /* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 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. */ /* We simply emit the Al'th bit of the DC coefficient value. */
arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1); arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
} }
@@ -590,6 +594,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int tbl, k, ke, kex; int tbl, k, ke, kex;
int v; int v;
const int * natural_order;
/* Emit restart marker if needed */ /* Emit restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -602,6 +607,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
entropy->restarts_to_go--; entropy->restarts_to_go--;
} }
natural_order = cinfo->natural_order;
/* Encode the MCU data block */ /* Encode the MCU data block */
block = MCU_data[0]; block = MCU_data[0];
tbl = cinfo->cur_comp_info[0]->ac_tbl_no; tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
@@ -609,12 +616,12 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Section G.1.3.3: Encoding of AC coefficients */ /* Section G.1.3.3: Encoding of AC coefficients */
/* Establish EOB (end-of-block) index */ /* Establish EOB (end-of-block) index */
for (ke = cinfo->Se + 1; ke > 1; ke--) for (ke = cinfo->Se; ke > 0; ke--)
/* We must apply the point transform by Al. For AC coefficients this /* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably * is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value. * in C, we shift after obtaining the absolute value.
*/ */
if ((v = (*block)[jpeg_natural_order[ke - 1]]) >= 0) { if ((v = (*block)[natural_order[ke]]) >= 0) {
if (v >>= cinfo->Al) break; if (v >>= cinfo->Al) break;
} else { } else {
v = -v; v = -v;
@@ -622,8 +629,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
} }
/* Establish EOBx (previous stage end-of-block) index */ /* Establish EOBx (previous stage end-of-block) index */
for (kex = ke; kex > 1; kex--) for (kex = ke; kex > 0; kex--)
if ((v = (*block)[jpeg_natural_order[kex - 1]]) >= 0) { if ((v = (*block)[natural_order[kex]]) >= 0) {
if (v >>= cinfo->Ah) break; if (v >>= cinfo->Ah) break;
} else { } else {
v = -v; v = -v;
@@ -631,19 +638,18 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
} }
/* Figure G.10: Encode_AC_Coefficients_SA */ /* Figure G.10: Encode_AC_Coefficients_SA */
for (k = cinfo->Ss; k < ke; k++) { for (k = cinfo->Ss; k <= ke; k++) {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * (k - 1);
if (k >= kex) if (k > kex)
arith_encode(cinfo, st, 0); /* EOB decision */ arith_encode(cinfo, st, 0); /* EOB decision */
entropy->ac_stats[tbl][245] = 0;
for (;;) { for (;;) {
if ((v = (*block)[jpeg_natural_order[k]]) >= 0) { if ((v = (*block)[natural_order[k]]) >= 0) {
if (v >>= cinfo->Al) { if (v >>= cinfo->Al) {
if (v >> 1) /* previously nonzero coef */ if (v >> 1) /* previously nonzero coef */
arith_encode(cinfo, st + 2, (v & 1)); arith_encode(cinfo, st + 2, (v & 1));
else { /* newly nonzero coef */ else { /* newly nonzero coef */
arith_encode(cinfo, st + 1, 1); arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0); arith_encode(cinfo, entropy->fixed_bin, 0);
} }
break; break;
} }
@@ -654,7 +660,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
arith_encode(cinfo, st + 2, (v & 1)); arith_encode(cinfo, st + 2, (v & 1));
else { /* newly nonzero coef */ else { /* newly nonzero coef */
arith_encode(cinfo, st + 1, 1); arith_encode(cinfo, st + 1, 1);
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1); arith_encode(cinfo, entropy->fixed_bin, 1);
} }
break; break;
} }
@@ -685,6 +691,7 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int blkn, ci, tbl, k, ke; int blkn, ci, tbl, k, ke;
int v, v2, m; int v, v2, m;
const int * natural_order;
/* Emit restart marker if needed */ /* Emit restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -697,6 +704,8 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
entropy->restarts_to_go--; entropy->restarts_to_go--;
} }
natural_order = cinfo->natural_order;
/* Encode the MCU data blocks */ /* Encode the MCU data blocks */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
block = MCU_data[blkn]; block = MCU_data[blkn];
@@ -744,9 +753,9 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
} }
arith_encode(cinfo, st, 0); arith_encode(cinfo, st, 0);
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1)) if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
entropy->dc_context[ci] = 0; /* zero diff category */ entropy->dc_context[ci] = 0; /* zero diff category */
else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1)) else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
entropy->dc_context[ci] += 8; /* large diff category */ entropy->dc_context[ci] += 8; /* large diff category */
/* Figure F.9: Encoding the magnitude bit pattern of v */ /* Figure F.9: Encoding the magnitude bit pattern of v */
st += 14; st += 14;
@@ -756,28 +765,30 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */ /* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
if ((ke = cinfo->lim_Se) == 0) continue;
tbl = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
/* Establish EOB (end-of-block) index */ /* Establish EOB (end-of-block) index */
for (ke = DCTSIZE2; ke > 1; ke--) do {
if ((*block)[jpeg_natural_order[ke - 1]]) break; if ((*block)[natural_order[ke]]) break;
} while (--ke);
/* Figure F.5: Encode_AC_Coefficients */ /* Figure F.5: Encode_AC_Coefficients */
for (k = 1; k < ke; k++) { for (k = 0; k < ke;) {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 0); /* EOB decision */ arith_encode(cinfo, st, 0); /* EOB decision */
while ((v = (*block)[jpeg_natural_order[k]]) == 0) { while ((v = (*block)[natural_order[++k]]) == 0) {
arith_encode(cinfo, st + 1, 0); st += 3; k++; arith_encode(cinfo, st + 1, 0);
st += 3;
} }
arith_encode(cinfo, st + 1, 1); arith_encode(cinfo, st + 1, 1);
/* Figure F.6: Encoding nonzero value v */ /* Figure F.6: Encoding nonzero value v */
/* Figure F.7: Encoding the sign of v */ /* Figure F.7: Encoding the sign of v */
entropy->ac_stats[tbl][245] = 0;
if (v > 0) { if (v > 0) {
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 0); arith_encode(cinfo, entropy->fixed_bin, 0);
} else { } else {
v = -v; v = -v;
arith_encode(cinfo, entropy->ac_stats[tbl] + 245, 1); arith_encode(cinfo, entropy->fixed_bin, 1);
} }
st += 2; st += 2;
/* Figure F.8: Encoding the magnitude category of v */ /* Figure F.8: Encoding the magnitude category of v */
@@ -804,9 +815,9 @@ encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1) while (m >>= 1)
arith_encode(cinfo, st, (m & v) ? 1 : 0); arith_encode(cinfo, st, (m & v) ? 1 : 0);
} }
/* Encode EOB decision only if k < DCTSIZE2 */ /* Encode EOB decision only if k < cinfo->lim_Se */
if (k < DCTSIZE2) { if (k < cinfo->lim_Se) {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * k;
arith_encode(cinfo, st, 1); arith_encode(cinfo, st, 1);
} }
} }
@@ -851,10 +862,11 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
} else } else
entropy->pub.encode_mcu = encode_mcu; entropy->pub.encode_mcu = encode_mcu;
/* Allocate & initialize requested statistics areas */
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
/* Allocate & initialize requested statistics areas */ /* DC needs no table for refinement scan */
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) { if (cinfo->Ss == 0 && cinfo->Ah == 0) {
tbl = compptr->dc_tbl_no; tbl = compptr->dc_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -866,7 +878,8 @@ start_pass (j_compress_ptr cinfo, boolean gather_statistics)
entropy->last_dc_val[ci] = 0; entropy->last_dc_val[ci] = 0;
entropy->dc_context[ci] = 0; entropy->dc_context[ci] = 0;
} }
if (cinfo->progressive_mode == 0 || cinfo->Ss) { /* AC needs no table when not present */
if (cinfo->Se) {
tbl = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -918,4 +931,7 @@ jinit_arith_encoder (j_compress_ptr cinfo)
entropy->dc_stats[i] = NULL; entropy->dc_stats[i] = NULL;
entropy->ac_stats[i] = NULL; entropy->ac_stats[i] = NULL;
} }
/* Initialize index for fixed probability estimation */
entropy->fixed_bin[0] = 113;
} }

View File

@@ -2,6 +2,7 @@
* jccoefct.c * jccoefct.c
* *
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* Modified 2003-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -183,7 +184,7 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
ypos, xpos, (JDIMENSION) blockcnt); ypos, xpos, (JDIMENSION) blockcnt);
if (blockcnt < compptr->MCU_width) { if (blockcnt < compptr->MCU_width) {
/* Create some dummy blocks at the right edge of the image. */ /* Create some dummy blocks at the right edge of the image. */
jzero_far((void FAR *) coef->MCU_buffer[blkn + blockcnt], FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],
(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK)); (compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
for (bi = blockcnt; bi < compptr->MCU_width; bi++) { for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0]; coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
@@ -191,7 +192,7 @@ compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
} }
} else { } else {
/* Create a row of dummy blocks at the bottom of the image. */ /* Create a row of dummy blocks at the bottom of the image. */
jzero_far((void FAR *) coef->MCU_buffer[blkn], FMEMZERO((void FAR *) coef->MCU_buffer[blkn],
compptr->MCU_width * SIZEOF(JBLOCK)); compptr->MCU_width * SIZEOF(JBLOCK));
for (bi = 0; bi < compptr->MCU_width; bi++) { for (bi = 0; bi < compptr->MCU_width; bi++) {
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0]; coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
@@ -290,7 +291,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
if (ndummy > 0) { if (ndummy > 0) {
/* Create dummy blocks at the right edge of the image. */ /* Create dummy blocks at the right edge of the image. */
thisblockrow += blocks_across; /* => first dummy block */ thisblockrow += blocks_across; /* => first dummy block */
jzero_far((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK)); FMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
lastDC = thisblockrow[-1][0]; lastDC = thisblockrow[-1][0];
for (bi = 0; bi < ndummy; bi++) { for (bi = 0; bi < ndummy; bi++) {
thisblockrow[bi][0] = lastDC; thisblockrow[bi][0] = lastDC;
@@ -309,7 +310,7 @@ compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
block_row++) { block_row++) {
thisblockrow = buffer[block_row]; thisblockrow = buffer[block_row];
lastblockrow = buffer[block_row-1]; lastblockrow = buffer[block_row-1];
jzero_far((void FAR *) thisblockrow, FMEMZERO((void FAR *) thisblockrow,
(size_t) (blocks_across * SIZEOF(JBLOCK))); (size_t) (blocks_across * SIZEOF(JBLOCK)));
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) { for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
lastDC = lastblockrow[h_samp_factor-1][0]; lastDC = lastblockrow[h_samp_factor-1][0];

View File

@@ -2,6 +2,7 @@
* jccolor.c * jccolor.c
* *
* Copyright (C) 1991-1996, Thomas G. Lane. * Copyright (C) 1991-1996, Thomas G. Lane.
* Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -299,6 +300,39 @@ grayscale_convert (j_compress_ptr cinfo,
} }
/*
* Convert some rows of samples to the JPEG colorspace.
* No colorspace conversion, but change from interleaved
* to separate-planes representation.
*/
METHODDEF(void)
rgb_convert (j_compress_ptr cinfo,
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
JDIMENSION output_row, int num_rows)
{
register JSAMPROW inptr;
register JSAMPROW outptr0, outptr1, outptr2;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->image_width;
while (--num_rows >= 0) {
inptr = *input_buf++;
outptr0 = output_buf[0][output_row];
outptr1 = output_buf[1][output_row];
outptr2 = output_buf[2][output_row];
output_row++;
for (col = 0; col < num_cols; col++) {
/* We can dispense with GETJSAMPLE() here */
outptr0[col] = inptr[RGB_RED];
outptr1[col] = inptr[RGB_GREEN];
outptr2[col] = inptr[RGB_BLUE];
inptr += RGB_PIXELSIZE;
}
}
}
/* /*
* Convert some rows of samples to the JPEG colorspace. * Convert some rows of samples to the JPEG colorspace.
* This version handles multi-component colorspaces without conversion. * This version handles multi-component colorspaces without conversion.
@@ -368,11 +402,9 @@ jinit_color_converter (j_compress_ptr cinfo)
break; break;
case JCS_RGB: case JCS_RGB:
#if RGB_PIXELSIZE != 3
if (cinfo->input_components != RGB_PIXELSIZE) if (cinfo->input_components != RGB_PIXELSIZE)
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE); ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
break; break;
#endif /* else share code with YCbCr */
case JCS_YCbCr: case JCS_YCbCr:
if (cinfo->input_components != 3) if (cinfo->input_components != 3)
@@ -396,22 +428,21 @@ jinit_color_converter (j_compress_ptr cinfo)
case JCS_GRAYSCALE: case JCS_GRAYSCALE:
if (cinfo->num_components != 1) if (cinfo->num_components != 1)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
if (cinfo->in_color_space == JCS_GRAYSCALE) if (cinfo->in_color_space == JCS_GRAYSCALE ||
cinfo->in_color_space == JCS_YCbCr)
cconvert->pub.color_convert = grayscale_convert; cconvert->pub.color_convert = grayscale_convert;
else if (cinfo->in_color_space == JCS_RGB) { else if (cinfo->in_color_space == JCS_RGB) {
cconvert->pub.start_pass = rgb_ycc_start; cconvert->pub.start_pass = rgb_ycc_start;
cconvert->pub.color_convert = rgb_gray_convert; cconvert->pub.color_convert = rgb_gray_convert;
} else if (cinfo->in_color_space == JCS_YCbCr) } else
cconvert->pub.color_convert = grayscale_convert;
else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;
case JCS_RGB: case JCS_RGB:
if (cinfo->num_components != 3) if (cinfo->num_components != 3)
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE); ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
if (cinfo->in_color_space == JCS_RGB && RGB_PIXELSIZE == 3) if (cinfo->in_color_space == JCS_RGB)
cconvert->pub.color_convert = null_convert; cconvert->pub.color_convert = rgb_convert;
else else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;

226
jchuff.c
View File

@@ -87,8 +87,6 @@ typedef struct {
unsigned int restarts_to_go; /* MCUs left in this restart interval */ unsigned int restarts_to_go; /* MCUs left in this restart interval */
int next_restart_num; /* next restart number to write (0-7) */ int next_restart_num; /* next restart number to write (0-7) */
/* Following four fields used only in sequential mode */
/* Pointers to derived tables (these workspaces have image lifespan) */ /* Pointers to derived tables (these workspaces have image lifespan) */
c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS]; c_derived_tbl * dc_derived_tbls[NUM_HUFF_TBLS];
c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS]; c_derived_tbl * ac_derived_tbls[NUM_HUFF_TBLS];
@@ -114,15 +112,6 @@ typedef struct {
unsigned int BE; /* # of buffered correction bits before MCU */ unsigned int BE; /* # of buffered correction bits before MCU */
char * bit_buffer; /* buffer for correction bits (1 per char) */ char * bit_buffer; /* buffer for correction bits (1 per char) */
/* packing correction bits tightly would save some space but cost time... */ /* packing correction bits tightly would save some space but cost time... */
/* Pointers to derived tables (these workspaces have image lifespan).
* Since any one scan in progressive mode codes only DC or only AC,
* we only need one set of tables, not one for DC and one for AC.
*/
c_derived_tbl * derived_tbls[NUM_HUFF_TBLS];
/* Statistics tables for optimization; again, one set is enough */
long * count_ptrs[NUM_HUFF_TBLS];
} huff_entropy_encoder; } huff_entropy_encoder;
typedef huff_entropy_encoder * huff_entropy_ptr; typedef huff_entropy_encoder * huff_entropy_ptr;
@@ -419,12 +408,25 @@ flush_bits_e (huff_entropy_ptr entropy)
INLINE INLINE
LOCAL(void) LOCAL(void)
emit_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol) emit_dc_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)
{ {
if (entropy->gather_statistics) if (entropy->gather_statistics)
entropy->count_ptrs[tbl_no][symbol]++; entropy->dc_count_ptrs[tbl_no][symbol]++;
else { else {
c_derived_tbl * tbl = entropy->derived_tbls[tbl_no]; c_derived_tbl * tbl = entropy->dc_derived_tbls[tbl_no];
emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
}
}
INLINE
LOCAL(void)
emit_ac_symbol (huff_entropy_ptr entropy, int tbl_no, int symbol)
{
if (entropy->gather_statistics)
entropy->ac_count_ptrs[tbl_no][symbol]++;
else {
c_derived_tbl * tbl = entropy->ac_derived_tbls[tbl_no];
emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]); emit_bits_e(entropy, tbl->ehufco[symbol], tbl->ehufsi[symbol]);
} }
} }
@@ -467,7 +469,7 @@ emit_eobrun (huff_entropy_ptr entropy)
if (nbits > 14) if (nbits > 14)
ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE); ERREXIT(entropy->cinfo, JERR_HUFF_MISSING_CODE);
emit_symbol(entropy, entropy->ac_tbl_no, nbits << 4); emit_ac_symbol(entropy, entropy->ac_tbl_no, nbits << 4);
if (nbits) if (nbits)
emit_bits_e(entropy, entropy->EOBRUN, nbits); emit_bits_e(entropy, entropy->EOBRUN, nbits);
@@ -592,7 +594,7 @@ encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
ERREXIT(cinfo, JERR_BAD_DCT_COEF); ERREXIT(cinfo, JERR_BAD_DCT_COEF);
/* Count/emit the Huffman-coded symbol for the number of bits */ /* Count/emit the Huffman-coded symbol for the number of bits */
emit_symbol(entropy, compptr->dc_tbl_no, nbits); emit_dc_symbol(entropy, compptr->dc_tbl_no, nbits);
/* Emit that number of bits of the value, if positive, */ /* Emit that number of bits of the value, if positive, */
/* or the complement of its magnitude, if negative. */ /* or the complement of its magnitude, if negative. */
@@ -629,8 +631,8 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
register int temp, temp2; register int temp, temp2;
register int nbits; register int nbits;
register int r, k; register int r, k;
int Se = cinfo->Se; int Se, Al;
int Al = cinfo->Al; const int * natural_order;
JBLOCKROW block; JBLOCKROW block;
entropy->next_output_byte = cinfo->dest->next_output_byte; entropy->next_output_byte = cinfo->dest->next_output_byte;
@@ -641,6 +643,10 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->restarts_to_go == 0) if (entropy->restarts_to_go == 0)
emit_restart_e(entropy, entropy->next_restart_num); emit_restart_e(entropy, entropy->next_restart_num);
Se = cinfo->Se;
Al = cinfo->Al;
natural_order = cinfo->natural_order;
/* Encode the MCU data block */ /* Encode the MCU data block */
block = MCU_data[0]; block = MCU_data[0];
@@ -649,7 +655,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
r = 0; /* r = run length of zeros */ r = 0; /* r = run length of zeros */
for (k = cinfo->Ss; k <= Se; k++) { for (k = cinfo->Ss; k <= Se; k++) {
if ((temp = (*block)[jpeg_natural_order[k]]) == 0) { if ((temp = (*block)[natural_order[k]]) == 0) {
r++; r++;
continue; continue;
} }
@@ -678,7 +684,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
emit_eobrun(entropy); emit_eobrun(entropy);
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
while (r > 15) { while (r > 15) {
emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0);
r -= 16; r -= 16;
} }
@@ -691,7 +697,7 @@ encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
ERREXIT(cinfo, JERR_BAD_DCT_COEF); ERREXIT(cinfo, JERR_BAD_DCT_COEF);
/* Count/emit Huffman symbol for run length / number of bits */ /* Count/emit Huffman symbol for run length / number of bits */
emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits); emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + nbits);
/* Emit that number of bits of the value, if positive, */ /* Emit that number of bits of the value, if positive, */
/* or the complement of its magnitude, if negative. */ /* or the complement of its magnitude, if negative. */
@@ -785,8 +791,8 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
int EOB; int EOB;
char *BR_buffer; char *BR_buffer;
unsigned int BR; unsigned int BR;
int Se = cinfo->Se; int Se, Al;
int Al = cinfo->Al; const int * natural_order;
JBLOCKROW block; JBLOCKROW block;
int absvalues[DCTSIZE2]; int absvalues[DCTSIZE2];
@@ -798,6 +804,10 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->restarts_to_go == 0) if (entropy->restarts_to_go == 0)
emit_restart_e(entropy, entropy->next_restart_num); emit_restart_e(entropy, entropy->next_restart_num);
Se = cinfo->Se;
Al = cinfo->Al;
natural_order = cinfo->natural_order;
/* Encode the MCU data block */ /* Encode the MCU data block */
block = MCU_data[0]; block = MCU_data[0];
@@ -806,7 +816,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
*/ */
EOB = 0; EOB = 0;
for (k = cinfo->Ss; k <= Se; k++) { for (k = cinfo->Ss; k <= Se; k++) {
temp = (*block)[jpeg_natural_order[k]]; temp = (*block)[natural_order[k]];
/* We must apply the point transform by Al. For AC coefficients this /* We must apply the point transform by Al. For AC coefficients this
* is an integer division with rounding towards 0. To do this portably * is an integer division with rounding towards 0. To do this portably
* in C, we shift after obtaining the absolute value. * in C, we shift after obtaining the absolute value.
@@ -836,7 +846,7 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
/* emit any pending EOBRUN and the BE correction bits */ /* emit any pending EOBRUN and the BE correction bits */
emit_eobrun(entropy); emit_eobrun(entropy);
/* Emit ZRL */ /* Emit ZRL */
emit_symbol(entropy, entropy->ac_tbl_no, 0xF0); emit_ac_symbol(entropy, entropy->ac_tbl_no, 0xF0);
r -= 16; r -= 16;
/* Emit buffered correction bits that must be associated with ZRL */ /* Emit buffered correction bits that must be associated with ZRL */
emit_buffered_bits(entropy, BR_buffer, BR); emit_buffered_bits(entropy, BR_buffer, BR);
@@ -859,10 +869,10 @@ encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
emit_eobrun(entropy); emit_eobrun(entropy);
/* Count/emit Huffman symbol for run length / number of bits */ /* Count/emit Huffman symbol for run length / number of bits */
emit_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1); emit_ac_symbol(entropy, entropy->ac_tbl_no, (r << 4) + 1);
/* Emit output bit for newly-nonzero coef */ /* Emit output bit for newly-nonzero coef */
temp = ((*block)[jpeg_natural_order[k]] < 0) ? 0 : 1; temp = ((*block)[natural_order[k]] < 0) ? 0 : 1;
emit_bits_e(entropy, (unsigned int) temp, 1); emit_bits_e(entropy, (unsigned int) temp, 1);
/* Emit buffered correction bits that must be associated with this code */ /* Emit buffered correction bits that must be associated with this code */
@@ -909,6 +919,8 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
register int temp, temp2; register int temp, temp2;
register int nbits; register int nbits;
register int k, r, i; register int k, r, i;
int Se = state->cinfo->lim_Se;
const int * natural_order = state->cinfo->natural_order;
/* Encode the DC coefficient difference per section F.1.2.1 */ /* Encode the DC coefficient difference per section F.1.2.1 */
@@ -947,8 +959,8 @@ encode_one_block (working_state * state, JCOEFPTR block, int last_dc_val,
r = 0; /* r = run length of zeros */ r = 0; /* r = run length of zeros */
for (k = 1; k < DCTSIZE2; k++) { for (k = 1; k <= Se; k++) {
if ((temp = block[jpeg_natural_order[k]]) == 0) { if ((temp = block[natural_order[k]]) == 0) {
r++; r++;
} else { } else {
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
@@ -1113,6 +1125,8 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
register int temp; register int temp;
register int nbits; register int nbits;
register int k, r; register int k, r;
int Se = cinfo->lim_Se;
const int * natural_order = cinfo->natural_order;
/* Encode the DC coefficient difference per section F.1.2.1 */ /* Encode the DC coefficient difference per section F.1.2.1 */
@@ -1139,8 +1153,8 @@ htest_one_block (j_compress_ptr cinfo, JCOEFPTR block, int last_dc_val,
r = 0; /* r = run length of zeros */ r = 0; /* r = run length of zeros */
for (k = 1; k < DCTSIZE2; k++) { for (k = 1; k <= Se; k++) {
if ((temp = block[jpeg_natural_order[k]]) == 0) { if ((temp = block[natural_order[k]]) == 0) {
r++; r++;
} else { } else {
/* if run length > 15, must emit special run-length-16 codes (0xF0) */ /* if run length > 15, must emit special run-length-16 codes (0xF0) */
@@ -1383,63 +1397,44 @@ METHODDEF(void)
finish_pass_gather (j_compress_ptr cinfo) finish_pass_gather (j_compress_ptr cinfo)
{ {
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int ci, dctbl, actbl, tbl; int ci, tbl;
jpeg_component_info * compptr; jpeg_component_info * compptr;
JHUFF_TBL **htblptr; JHUFF_TBL **htblptr;
boolean did_dc[NUM_HUFF_TBLS]; boolean did_dc[NUM_HUFF_TBLS];
boolean did_ac[NUM_HUFF_TBLS]; boolean did_ac[NUM_HUFF_TBLS];
boolean did[NUM_HUFF_TBLS];
/* It's important not to apply jpeg_gen_optimal_table more than once /* It's important not to apply jpeg_gen_optimal_table more than once
* per table, because it clobbers the input frequency counts! * per table, because it clobbers the input frequency counts!
*/ */
if (cinfo->progressive_mode) { if (cinfo->progressive_mode)
/* Flush out buffered data (all we care about is counting the EOB symbol) */ /* Flush out buffered data (all we care about is counting the EOB symbol) */
emit_eobrun(entropy); emit_eobrun(entropy);
MEMZERO(did, SIZEOF(did));
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci];
if (cinfo->Ss == 0) {
if (cinfo->Ah != 0) /* DC refinement needs no table */
continue;
tbl = compptr->dc_tbl_no;
} else {
tbl = compptr->ac_tbl_no;
}
if (! did[tbl]) {
if (cinfo->Ss == 0)
htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
else
htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
jpeg_gen_optimal_table(cinfo, *htblptr, entropy->count_ptrs[tbl]);
did[tbl] = TRUE;
}
}
} else {
MEMZERO(did_dc, SIZEOF(did_dc)); MEMZERO(did_dc, SIZEOF(did_dc));
MEMZERO(did_ac, SIZEOF(did_ac)); MEMZERO(did_ac, SIZEOF(did_ac));
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
dctbl = compptr->dc_tbl_no; /* DC needs no table for refinement scan */
actbl = compptr->ac_tbl_no; if (cinfo->Ss == 0 && cinfo->Ah == 0) {
if (! did_dc[dctbl]) { tbl = compptr->dc_tbl_no;
htblptr = & cinfo->dc_huff_tbl_ptrs[dctbl]; if (! did_dc[tbl]) {
htblptr = & cinfo->dc_huff_tbl_ptrs[tbl];
if (*htblptr == NULL) if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[dctbl]); jpeg_gen_optimal_table(cinfo, *htblptr, entropy->dc_count_ptrs[tbl]);
did_dc[dctbl] = TRUE; did_dc[tbl] = TRUE;
} }
if (! did_ac[actbl]) { }
htblptr = & cinfo->ac_huff_tbl_ptrs[actbl]; /* AC needs no table when not present */
if (cinfo->Se) {
tbl = compptr->ac_tbl_no;
if (! did_ac[tbl]) {
htblptr = & cinfo->ac_huff_tbl_ptrs[tbl];
if (*htblptr == NULL) if (*htblptr == NULL)
*htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo); *htblptr = jpeg_alloc_huff_table((j_common_ptr) cinfo);
jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[actbl]); jpeg_gen_optimal_table(cinfo, *htblptr, entropy->ac_count_ptrs[tbl]);
did_ac[actbl] = TRUE; did_ac[tbl] = TRUE;
} }
} }
} }
@@ -1456,7 +1451,7 @@ METHODDEF(void)
start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics) start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
{ {
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int ci, dctbl, actbl, tbl; int ci, tbl;
jpeg_component_info * compptr; jpeg_component_info * compptr;
if (gather_statistics) if (gather_statistics)
@@ -1489,42 +1484,8 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
} }
} }
/* Only DC coefficients may be interleaved, so cinfo->comps_in_scan = 1
* for AC coefficients.
*/
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci];
/* Initialize DC predictions to 0 */
entropy->saved.last_dc_val[ci] = 0;
/* Get table index */
if (cinfo->Ss == 0) {
if (cinfo->Ah != 0) /* DC refinement needs no table */
continue;
tbl = compptr->dc_tbl_no;
} else {
entropy->ac_tbl_no = tbl = compptr->ac_tbl_no;
}
if (gather_statistics) {
/* Check for invalid table index */
/* (make_c_derived_tbl does this in the other path) */
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
/* Allocate and zero the statistics tables */
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
if (entropy->count_ptrs[tbl] == NULL)
entropy->count_ptrs[tbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long));
MEMZERO(entropy->count_ptrs[tbl], 257 * SIZEOF(long));
} else {
/* Compute derived values for Huffman table */
/* We may do this more than once for a table, but it's not expensive */
jpeg_make_c_derived_tbl(cinfo, cinfo->Ss == 0, tbl,
& entropy->derived_tbls[tbl]);
}
}
/* Initialize AC stuff */ /* Initialize AC stuff */
entropy->ac_tbl_no = cinfo->cur_comp_info[0]->ac_tbl_no;
entropy->EOBRUN = 0; entropy->EOBRUN = 0;
entropy->BE = 0; entropy->BE = 0;
} else { } else {
@@ -1532,41 +1493,50 @@ start_pass_huff (j_compress_ptr cinfo, boolean gather_statistics)
entropy->pub.encode_mcu = encode_mcu_gather; entropy->pub.encode_mcu = encode_mcu_gather;
else else
entropy->pub.encode_mcu = encode_mcu_huff; entropy->pub.encode_mcu = encode_mcu_huff;
}
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
dctbl = compptr->dc_tbl_no; /* DC needs no table for refinement scan */
actbl = compptr->ac_tbl_no; if (cinfo->Ss == 0 && cinfo->Ah == 0) {
tbl = compptr->dc_tbl_no;
if (gather_statistics) { if (gather_statistics) {
/* Check for invalid table indexes */ /* Check for invalid table index */
/* (make_c_derived_tbl does this in the other path) */ /* (make_c_derived_tbl does this in the other path) */
if (dctbl < 0 || dctbl >= NUM_HUFF_TBLS) if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, dctbl); ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
if (actbl < 0 || actbl >= NUM_HUFF_TBLS)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, actbl);
/* Allocate and zero the statistics tables */ /* Allocate and zero the statistics tables */
/* Note that jpeg_gen_optimal_table expects 257 entries in each table! */ /* Note that jpeg_gen_optimal_table expects 257 entries in each table! */
if (entropy->dc_count_ptrs[dctbl] == NULL) if (entropy->dc_count_ptrs[tbl] == NULL)
entropy->dc_count_ptrs[dctbl] = (long *) entropy->dc_count_ptrs[tbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long)); 257 * SIZEOF(long));
MEMZERO(entropy->dc_count_ptrs[dctbl], 257 * SIZEOF(long)); MEMZERO(entropy->dc_count_ptrs[tbl], 257 * SIZEOF(long));
if (entropy->ac_count_ptrs[actbl] == NULL)
entropy->ac_count_ptrs[actbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long));
MEMZERO(entropy->ac_count_ptrs[actbl], 257 * SIZEOF(long));
} else { } else {
/* Compute derived values for Huffman tables */ /* Compute derived values for Huffman tables */
/* We may do this more than once for a table, but it's not expensive */ /* We may do this more than once for a table, but it's not expensive */
jpeg_make_c_derived_tbl(cinfo, TRUE, dctbl, jpeg_make_c_derived_tbl(cinfo, TRUE, tbl,
& entropy->dc_derived_tbls[dctbl]); & entropy->dc_derived_tbls[tbl]);
jpeg_make_c_derived_tbl(cinfo, FALSE, actbl,
& entropy->ac_derived_tbls[actbl]);
} }
/* Initialize DC predictions to 0 */ /* Initialize DC predictions to 0 */
entropy->saved.last_dc_val[ci] = 0; entropy->saved.last_dc_val[ci] = 0;
} }
/* AC needs no table when not present */
if (cinfo->Se) {
tbl = compptr->ac_tbl_no;
if (gather_statistics) {
if (tbl < 0 || tbl >= NUM_HUFF_TBLS)
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, tbl);
if (entropy->ac_count_ptrs[tbl] == NULL)
entropy->ac_count_ptrs[tbl] = (long *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
257 * SIZEOF(long));
MEMZERO(entropy->ac_count_ptrs[tbl], 257 * SIZEOF(long));
} else {
jpeg_make_c_derived_tbl(cinfo, FALSE, tbl,
& entropy->ac_derived_tbls[tbl]);
}
}
} }
/* Initialize bit buffer to empty */ /* Initialize bit buffer to empty */
@@ -1595,18 +1565,12 @@ jinit_huff_encoder (j_compress_ptr cinfo)
cinfo->entropy = (struct jpeg_entropy_encoder *) entropy; cinfo->entropy = (struct jpeg_entropy_encoder *) entropy;
entropy->pub.start_pass = start_pass_huff; entropy->pub.start_pass = start_pass_huff;
if (cinfo->progressive_mode) {
/* Mark tables unallocated */
for (i = 0; i < NUM_HUFF_TBLS; i++) {
entropy->derived_tbls[i] = NULL;
entropy->count_ptrs[i] = NULL;
}
entropy->bit_buffer = NULL; /* needed only in AC refinement scan */
} else {
/* Mark tables unallocated */ /* Mark tables unallocated */
for (i = 0; i < NUM_HUFF_TBLS; i++) { for (i = 0; i < NUM_HUFF_TBLS; i++) {
entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL; entropy->dc_derived_tbls[i] = entropy->ac_derived_tbls[i] = NULL;
entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL; entropy->dc_count_ptrs[i] = entropy->ac_count_ptrs[i] = NULL;
} }
}
if (cinfo->progressive_mode)
entropy->bit_buffer = NULL; /* needed only in AC refinement scan */
} }

View File

@@ -2,6 +2,7 @@
* jcmarker.c * jcmarker.c
* *
* Copyright (C) 1991-1998, Thomas G. Lane. * Copyright (C) 1991-1998, Thomas G. Lane.
* Modified 2003-2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -153,21 +154,22 @@ emit_dqt (j_compress_ptr cinfo, int index)
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index); ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
prec = 0; prec = 0;
for (i = 0; i < DCTSIZE2; i++) { for (i = 0; i <= cinfo->lim_Se; i++) {
if (qtbl->quantval[i] > 255) if (qtbl->quantval[cinfo->natural_order[i]] > 255)
prec = 1; prec = 1;
} }
if (! qtbl->sent_table) { if (! qtbl->sent_table) {
emit_marker(cinfo, M_DQT); emit_marker(cinfo, M_DQT);
emit_2bytes(cinfo, prec ? DCTSIZE2*2 + 1 + 2 : DCTSIZE2 + 1 + 2); emit_2bytes(cinfo,
prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2);
emit_byte(cinfo, index + (prec<<4)); emit_byte(cinfo, index + (prec<<4));
for (i = 0; i < DCTSIZE2; i++) { for (i = 0; i <= cinfo->lim_Se; i++) {
/* The table entries must be emitted in zigzag order. */ /* The table entries must be emitted in zigzag order. */
unsigned int qval = qtbl->quantval[jpeg_natural_order[i]]; unsigned int qval = qtbl->quantval[cinfo->natural_order[i]];
if (prec) if (prec)
emit_byte(cinfo, (int) (qval >> 8)); emit_byte(cinfo, (int) (qval >> 8));
emit_byte(cinfo, (int) (qval & 0xFF)); emit_byte(cinfo, (int) (qval & 0xFF));
@@ -235,7 +237,11 @@ emit_dac (j_compress_ptr cinfo)
for (i = 0; i < cinfo->comps_in_scan; i++) { for (i = 0; i < cinfo->comps_in_scan; i++) {
compptr = cinfo->cur_comp_info[i]; compptr = cinfo->cur_comp_info[i];
/* DC needs no table for refinement scan */
if (cinfo->Ss == 0 && cinfo->Ah == 0)
dc_in_use[compptr->dc_tbl_no] = 1; dc_in_use[compptr->dc_tbl_no] = 1;
/* AC needs no table when not present */
if (cinfo->Se)
ac_in_use[compptr->ac_tbl_no] = 1; ac_in_use[compptr->ac_tbl_no] = 1;
} }
@@ -243,6 +249,7 @@ emit_dac (j_compress_ptr cinfo)
for (i = 0; i < NUM_ARITH_TBLS; i++) for (i = 0; i < NUM_ARITH_TBLS; i++)
length += dc_in_use[i] + ac_in_use[i]; length += dc_in_use[i] + ac_in_use[i];
if (length) {
emit_marker(cinfo, M_DAC); emit_marker(cinfo, M_DAC);
emit_2bytes(cinfo, length*2 + 2); emit_2bytes(cinfo, length*2 + 2);
@@ -257,6 +264,7 @@ emit_dac (j_compress_ptr cinfo)
emit_byte(cinfo, cinfo->arith_ac_K[i]); emit_byte(cinfo, cinfo->arith_ac_K[i]);
} }
} }
}
#endif /* C_ARITH_CODING_SUPPORTED */ #endif /* C_ARITH_CODING_SUPPORTED */
} }
@@ -320,22 +328,16 @@ emit_sos (j_compress_ptr cinfo)
for (i = 0; i < cinfo->comps_in_scan; i++) { for (i = 0; i < cinfo->comps_in_scan; i++) {
compptr = cinfo->cur_comp_info[i]; compptr = cinfo->cur_comp_info[i];
emit_byte(cinfo, compptr->component_id); emit_byte(cinfo, compptr->component_id);
td = compptr->dc_tbl_no;
ta = compptr->ac_tbl_no; /* We emit 0 for unused field(s); this is recommended by the P&M text
if (cinfo->progressive_mode) {
/* Progressive mode: only DC or only AC tables are used in one scan;
* furthermore, Huffman coding of DC refinement uses no table at all.
* We emit 0 for unused field(s); this is recommended by the P&M text
* but does not seem to be specified in the standard. * but does not seem to be specified in the standard.
*/ */
if (cinfo->Ss == 0) {
ta = 0; /* DC scan */ /* DC needs no table for refinement scan */
if (cinfo->Ah != 0 && !cinfo->arith_code) td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0;
td = 0; /* no DC table either */ /* AC needs no table when not present */
} else { ta = cinfo->Se ? compptr->ac_tbl_no : 0;
td = 0; /* AC scan */
}
}
emit_byte(cinfo, (td << 4) + ta); emit_byte(cinfo, (td << 4) + ta);
} }
@@ -345,6 +347,22 @@ emit_sos (j_compress_ptr cinfo)
} }
LOCAL(void)
emit_pseudo_sos (j_compress_ptr cinfo)
/* Emit a pseudo SOS marker */
{
emit_marker(cinfo, M_SOS);
emit_2bytes(cinfo, 2 + 1 + 3); /* length */
emit_byte(cinfo, 0); /* Ns */
emit_byte(cinfo, 0); /* Ss */
emit_byte(cinfo, cinfo->block_size * cinfo->block_size - 1); /* Se */
emit_byte(cinfo, 0); /* Ah/Al */
}
LOCAL(void) LOCAL(void)
emit_jfif_app0 (j_compress_ptr cinfo) emit_jfif_app0 (j_compress_ptr cinfo)
/* Emit a JFIF-compliant APP0 marker */ /* Emit a JFIF-compliant APP0 marker */
@@ -484,7 +502,7 @@ write_file_header (j_compress_ptr cinfo)
/* /*
* Write frame header. * Write frame header.
* This consists of DQT and SOFn markers. * This consists of DQT and SOFn markers, and a conditional pseudo SOS marker.
* Note that we do not emit the SOF until we have emitted the DQT(s). * Note that we do not emit the SOF until we have emitted the DQT(s).
* This avoids compatibility problems with incorrect implementations that * This avoids compatibility problems with incorrect implementations that
* try to error-check the quant table numbers as soon as they see the SOF. * try to error-check the quant table numbers as soon as they see the SOF.
@@ -511,7 +529,7 @@ write_frame_header (j_compress_ptr cinfo)
* Note we assume that Huffman table numbers won't be changed later. * Note we assume that Huffman table numbers won't be changed later.
*/ */
if (cinfo->arith_code || cinfo->progressive_mode || if (cinfo->arith_code || cinfo->progressive_mode ||
cinfo->data_precision != 8) { cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) {
is_baseline = FALSE; is_baseline = FALSE;
} else { } else {
is_baseline = TRUE; is_baseline = TRUE;
@@ -541,6 +559,10 @@ write_frame_header (j_compress_ptr cinfo)
else else
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */ emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
} }
/* Check to emit pseudo SOS marker */
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
emit_pseudo_sos(cinfo);
} }
@@ -569,20 +591,13 @@ write_scan_header (j_compress_ptr cinfo)
*/ */
for (i = 0; i < cinfo->comps_in_scan; i++) { for (i = 0; i < cinfo->comps_in_scan; i++) {
compptr = cinfo->cur_comp_info[i]; compptr = cinfo->cur_comp_info[i];
if (cinfo->progressive_mode) { /* DC needs no table for refinement scan */
/* Progressive mode: only DC or only AC tables are used in one scan */ if (cinfo->Ss == 0 && cinfo->Ah == 0)
if (cinfo->Ss == 0) {
if (cinfo->Ah == 0) /* DC needs no table for refinement scan */
emit_dht(cinfo, compptr->dc_tbl_no, FALSE); emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
} else { /* AC needs no table when not present */
if (cinfo->Se)
emit_dht(cinfo, compptr->ac_tbl_no, TRUE); emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
} }
} else {
/* Sequential mode: need both DC and AC tables */
emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
}
}
} }
/* Emit DRI if required --- note that DRI value could change for each scan. /* Emit DRI if required --- note that DRI value could change for each scan.

View File

@@ -2,7 +2,7 @@
* jcmaster.c * jcmaster.c
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2003-2009 by Guido Vollbeding. * Modified 2003-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -55,125 +55,140 @@ jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo)
{ {
#ifdef DCT_SCALING_SUPPORTED #ifdef DCT_SCALING_SUPPORTED
/* Sanity check on input image dimensions to prevent overflow in
* following calculation.
* We do check jpeg_width and jpeg_height in initial_setup below,
* but image_width and image_height can come from arbitrary data,
* and we need some space for multiplication by block_size.
*/
if (((long) cinfo->image_width >> 24) || ((long) cinfo->image_height >> 24))
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
/* Compute actual JPEG image dimensions and DCT scaling choices. */ /* Compute actual JPEG image dimensions and DCT scaling choices. */
if (cinfo->scale_num >= cinfo->scale_denom * 8) { if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/1 scaling */ /* Provide block_size/1 scaling */
cinfo->jpeg_width = cinfo->image_width << 3; cinfo->jpeg_width = cinfo->image_width * cinfo->block_size;
cinfo->jpeg_height = cinfo->image_height << 3; cinfo->jpeg_height = cinfo->image_height * cinfo->block_size;
cinfo->min_DCT_h_scaled_size = 1; cinfo->min_DCT_h_scaled_size = 1;
cinfo->min_DCT_v_scaled_size = 1; cinfo->min_DCT_v_scaled_size = 1;
} else if (cinfo->scale_num >= cinfo->scale_denom * 4) { } else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 4/1 scaling */ /* Provide block_size/2 scaling */
cinfo->jpeg_width = cinfo->image_width << 2; cinfo->jpeg_width = (JDIMENSION)
cinfo->jpeg_height = cinfo->image_height << 2; jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 2L);
cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 2L);
cinfo->min_DCT_h_scaled_size = 2; cinfo->min_DCT_h_scaled_size = 2;
cinfo->min_DCT_v_scaled_size = 2; cinfo->min_DCT_v_scaled_size = 2;
} else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/3 scaling */ /* Provide block_size/3 scaling */
cinfo->jpeg_width = (cinfo->image_width << 1) + (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 2, 3L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L);
cinfo->jpeg_height = (cinfo->image_height << 1) + (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 2, 3L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L);
cinfo->min_DCT_h_scaled_size = 3; cinfo->min_DCT_h_scaled_size = 3;
cinfo->min_DCT_v_scaled_size = 3; cinfo->min_DCT_v_scaled_size = 3;
} else if (cinfo->scale_num >= cinfo->scale_denom * 2) { } else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 2/1 scaling */ /* Provide block_size/4 scaling */
cinfo->jpeg_width = cinfo->image_width << 1; cinfo->jpeg_width = (JDIMENSION)
cinfo->jpeg_height = cinfo->image_height << 1; jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 4L);
cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 4L);
cinfo->min_DCT_h_scaled_size = 4; cinfo->min_DCT_h_scaled_size = 4;
cinfo->min_DCT_v_scaled_size = 4; cinfo->min_DCT_v_scaled_size = 4;
} else if (cinfo->scale_num * 5 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/5 scaling */ /* Provide block_size/5 scaling */
cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3, 5L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L);
cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3, 5L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L);
cinfo->min_DCT_h_scaled_size = 5; cinfo->min_DCT_h_scaled_size = 5;
cinfo->min_DCT_v_scaled_size = 5; cinfo->min_DCT_v_scaled_size = 5;
} else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 4) { } else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 4/3 scaling */ /* Provide block_size/6 scaling */
cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 3L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L);
cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 3L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L);
cinfo->min_DCT_h_scaled_size = 6; cinfo->min_DCT_h_scaled_size = 6;
cinfo->min_DCT_v_scaled_size = 6; cinfo->min_DCT_v_scaled_size = 6;
} else if (cinfo->scale_num * 7 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/7 scaling */ /* Provide block_size/7 scaling */
cinfo->jpeg_width = cinfo->image_width + (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 7L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L);
cinfo->jpeg_height = cinfo->image_height + (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 7L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L);
cinfo->min_DCT_h_scaled_size = 7; cinfo->min_DCT_h_scaled_size = 7;
cinfo->min_DCT_v_scaled_size = 7; cinfo->min_DCT_v_scaled_size = 7;
} else if (cinfo->scale_num >= cinfo->scale_denom) { } else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 1/1 scaling */ /* Provide block_size/8 scaling */
cinfo->jpeg_width = cinfo->image_width;
cinfo->jpeg_height = cinfo->image_height;
cinfo->min_DCT_h_scaled_size = DCTSIZE;
cinfo->min_DCT_v_scaled_size = DCTSIZE;
} else if (cinfo->scale_num * 9 >= cinfo->scale_denom * 8) {
/* Provide 8/9 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 8, 9L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 8, 9L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 8L);
cinfo->min_DCT_h_scaled_size = 8;
cinfo->min_DCT_v_scaled_size = 8;
} else if (cinfo->scale_num * 9 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide block_size/9 scaling */
cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 9L);
cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 9L);
cinfo->min_DCT_h_scaled_size = 9; cinfo->min_DCT_h_scaled_size = 9;
cinfo->min_DCT_v_scaled_size = 9; cinfo->min_DCT_v_scaled_size = 9;
} else if (cinfo->scale_num * 5 >= cinfo->scale_denom * 4) { } else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 4/5 scaling */ /* Provide block_size/10 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 4, 5L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 4, 5L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L);
cinfo->min_DCT_h_scaled_size = 10; cinfo->min_DCT_h_scaled_size = 10;
cinfo->min_DCT_v_scaled_size = 10; cinfo->min_DCT_v_scaled_size = 10;
} else if (cinfo->scale_num * 11 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/11 scaling */ /* Provide block_size/11 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 8, 11L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 8, 11L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L);
cinfo->min_DCT_h_scaled_size = 11; cinfo->min_DCT_h_scaled_size = 11;
cinfo->min_DCT_v_scaled_size = 11; cinfo->min_DCT_v_scaled_size = 11;
} else if (cinfo->scale_num * 3 >= cinfo->scale_denom * 2) { } else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 2/3 scaling */ /* Provide block_size/12 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 2, 3L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 2, 3L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L);
cinfo->min_DCT_h_scaled_size = 12; cinfo->min_DCT_h_scaled_size = 12;
cinfo->min_DCT_v_scaled_size = 12; cinfo->min_DCT_v_scaled_size = 12;
} else if (cinfo->scale_num * 13 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/13 scaling */ /* Provide block_size/13 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 8, 13L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 8, 13L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L);
cinfo->min_DCT_h_scaled_size = 13; cinfo->min_DCT_h_scaled_size = 13;
cinfo->min_DCT_v_scaled_size = 13; cinfo->min_DCT_v_scaled_size = 13;
} else if (cinfo->scale_num * 7 >= cinfo->scale_denom * 4) { } else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 4/7 scaling */ /* Provide block_size/14 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 4, 7L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 4, 7L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L);
cinfo->min_DCT_h_scaled_size = 14; cinfo->min_DCT_h_scaled_size = 14;
cinfo->min_DCT_v_scaled_size = 14; cinfo->min_DCT_v_scaled_size = 14;
} else if (cinfo->scale_num * 15 >= cinfo->scale_denom * 8) { } else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) {
/* Provide 8/15 scaling */ /* Provide block_size/15 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 8, 15L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 8, 15L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L);
cinfo->min_DCT_h_scaled_size = 15; cinfo->min_DCT_h_scaled_size = 15;
cinfo->min_DCT_v_scaled_size = 15; cinfo->min_DCT_v_scaled_size = 15;
} else { } else {
/* Provide 1/2 scaling */ /* Provide block_size/16 scaling */
cinfo->jpeg_width = (JDIMENSION) cinfo->jpeg_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 2L); jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L);
cinfo->jpeg_height = (JDIMENSION) cinfo->jpeg_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 2L); jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L);
cinfo->min_DCT_h_scaled_size = 16; cinfo->min_DCT_h_scaled_size = 16;
cinfo->min_DCT_v_scaled_size = 16; cinfo->min_DCT_v_scaled_size = 16;
} }
@@ -191,7 +206,18 @@ jpeg_calc_jpeg_dimensions (j_compress_ptr cinfo)
LOCAL(void) LOCAL(void)
initial_setup (j_compress_ptr cinfo) jpeg_calc_trans_dimensions (j_compress_ptr cinfo)
{
if (cinfo->min_DCT_h_scaled_size != cinfo->min_DCT_v_scaled_size)
ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
cinfo->min_DCT_h_scaled_size, cinfo->min_DCT_v_scaled_size);
cinfo->block_size = cinfo->min_DCT_h_scaled_size;
}
LOCAL(void)
initial_setup (j_compress_ptr cinfo, boolean transcode_only)
/* Do computations that are needed before master selection phase */ /* Do computations that are needed before master selection phase */
{ {
int ci, ssize; int ci, ssize;
@@ -199,11 +225,33 @@ initial_setup (j_compress_ptr cinfo)
long samplesperrow; long samplesperrow;
JDIMENSION jd_samplesperrow; JDIMENSION jd_samplesperrow;
if (transcode_only)
jpeg_calc_trans_dimensions(cinfo);
else
jpeg_calc_jpeg_dimensions(cinfo); jpeg_calc_jpeg_dimensions(cinfo);
/* Sanity check on block_size */
if (cinfo->block_size < 1 || cinfo->block_size > 16)
ERREXIT2(cinfo, JERR_BAD_DCTSIZE, cinfo->block_size, cinfo->block_size);
/* Derive natural_order from block_size */
switch (cinfo->block_size) {
case 2: cinfo->natural_order = jpeg_natural_order2; break;
case 3: cinfo->natural_order = jpeg_natural_order3; break;
case 4: cinfo->natural_order = jpeg_natural_order4; break;
case 5: cinfo->natural_order = jpeg_natural_order5; break;
case 6: cinfo->natural_order = jpeg_natural_order6; break;
case 7: cinfo->natural_order = jpeg_natural_order7; break;
default: cinfo->natural_order = jpeg_natural_order; break;
}
/* Derive lim_Se from block_size */
cinfo->lim_Se = cinfo->block_size < DCTSIZE ?
cinfo->block_size * cinfo->block_size - 1 : DCTSIZE2-1;
/* Sanity check on image dimensions */ /* Sanity check on image dimensions */
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
|| cinfo->num_components <= 0 || cinfo->input_components <= 0) cinfo->num_components <= 0 || cinfo->input_components <= 0)
ERREXIT(cinfo, JERR_EMPTY_IMAGE); ERREXIT(cinfo, JERR_EMPTY_IMAGE);
/* Make sure image isn't bigger than I can handle */ /* Make sure image isn't bigger than I can handle */
@@ -278,19 +326,19 @@ initial_setup (j_compress_ptr cinfo)
/* Size in DCT blocks */ /* Size in DCT blocks */
compptr->width_in_blocks = (JDIMENSION) compptr->width_in_blocks = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor, jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor,
(long) (cinfo->max_h_samp_factor * DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
compptr->height_in_blocks = (JDIMENSION) compptr->height_in_blocks = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor, jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor,
(long) (cinfo->max_v_samp_factor * DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
/* Size in samples */ /* Size in samples */
compptr->downsampled_width = (JDIMENSION) compptr->downsampled_width = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_width * jdiv_round_up((long) cinfo->jpeg_width *
(long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),
(long) (cinfo->max_h_samp_factor * DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
compptr->downsampled_height = (JDIMENSION) compptr->downsampled_height = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_height * jdiv_round_up((long) cinfo->jpeg_height *
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
(long) (cinfo->max_v_samp_factor * DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
/* Mark component needed (this flag isn't actually used for compression) */ /* Mark component needed (this flag isn't actually used for compression) */
compptr->component_needed = TRUE; compptr->component_needed = TRUE;
} }
@@ -300,7 +348,7 @@ initial_setup (j_compress_ptr cinfo)
*/ */
cinfo->total_iMCU_rows = (JDIMENSION) cinfo->total_iMCU_rows = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_height, jdiv_round_up((long) cinfo->jpeg_height,
(long) (cinfo->max_v_samp_factor*DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
} }
@@ -440,6 +488,39 @@ validate_script (j_compress_ptr cinfo)
} }
} }
LOCAL(void)
reduce_script (j_compress_ptr cinfo)
/* Adapt scan script for use with reduced block size;
* assume that script has been validated before.
*/
{
jpeg_scan_info * scanptr;
int idxout, idxin;
/* Circumvent const declaration for this function */
scanptr = (jpeg_scan_info *) cinfo->scan_info;
idxout = 0;
for (idxin = 0; idxin < cinfo->num_scans; idxin++) {
/* After skipping, idxout becomes smaller than idxin */
if (idxin != idxout)
/* Copy rest of data;
* note we stay in given chunk of allocated memory.
*/
scanptr[idxout] = scanptr[idxin];
if (scanptr[idxout].Ss > cinfo->lim_Se)
/* Entire scan out of range - skip this entry */
continue;
if (scanptr[idxout].Se > cinfo->lim_Se)
/* Limit scan to end of block */
scanptr[idxout].Se = cinfo->lim_Se;
idxout++;
}
cinfo->num_scans = idxout;
}
#endif /* C_MULTISCAN_FILES_SUPPORTED */ #endif /* C_MULTISCAN_FILES_SUPPORTED */
@@ -460,10 +541,13 @@ select_scan_parameters (j_compress_ptr cinfo)
cinfo->cur_comp_info[ci] = cinfo->cur_comp_info[ci] =
&cinfo->comp_info[scanptr->component_index[ci]]; &cinfo->comp_info[scanptr->component_index[ci]];
} }
if (cinfo->progressive_mode) {
cinfo->Ss = scanptr->Ss; cinfo->Ss = scanptr->Ss;
cinfo->Se = scanptr->Se; cinfo->Se = scanptr->Se;
cinfo->Ah = scanptr->Ah; cinfo->Ah = scanptr->Ah;
cinfo->Al = scanptr->Al; cinfo->Al = scanptr->Al;
return;
}
} }
else else
#endif #endif
@@ -476,11 +560,11 @@ select_scan_parameters (j_compress_ptr cinfo)
for (ci = 0; ci < cinfo->num_components; ci++) { for (ci = 0; ci < cinfo->num_components; ci++) {
cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci]; cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
} }
}
cinfo->Ss = 0; cinfo->Ss = 0;
cinfo->Se = DCTSIZE2-1; cinfo->Se = cinfo->block_size * cinfo->block_size - 1;
cinfo->Ah = 0; cinfo->Ah = 0;
cinfo->Al = 0; cinfo->Al = 0;
}
} }
@@ -528,10 +612,10 @@ per_scan_setup (j_compress_ptr cinfo)
/* Overall image size in MCUs */ /* Overall image size in MCUs */
cinfo->MCUs_per_row = (JDIMENSION) cinfo->MCUs_per_row = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_width, jdiv_round_up((long) cinfo->jpeg_width,
(long) (cinfo->max_h_samp_factor*DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
cinfo->MCU_rows_in_scan = (JDIMENSION) cinfo->MCU_rows_in_scan = (JDIMENSION)
jdiv_round_up((long) cinfo->jpeg_height, jdiv_round_up((long) cinfo->jpeg_height,
(long) (cinfo->max_v_samp_factor*DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
cinfo->blocks_in_MCU = 0; cinfo->blocks_in_MCU = 0;
@@ -734,11 +818,13 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
master->pub.is_last_pass = FALSE; master->pub.is_last_pass = FALSE;
/* Validate parameters, determine derived values */ /* Validate parameters, determine derived values */
initial_setup(cinfo); initial_setup(cinfo, transcode_only);
if (cinfo->scan_info != NULL) { if (cinfo->scan_info != NULL) {
#ifdef C_MULTISCAN_FILES_SUPPORTED #ifdef C_MULTISCAN_FILES_SUPPORTED
validate_script(cinfo); validate_script(cinfo);
if (cinfo->block_size < DCTSIZE)
reduce_script(cinfo);
#else #else
ERREXIT(cinfo, JERR_NOT_COMPILED); ERREXIT(cinfo, JERR_NOT_COMPILED);
#endif #endif
@@ -747,8 +833,10 @@ jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
cinfo->num_scans = 1; cinfo->num_scans = 1;
} }
if (cinfo->progressive_mode && cinfo->arith_code == 0) /* TEMPORARY HACK ??? */ if ((cinfo->progressive_mode || cinfo->block_size < DCTSIZE) &&
cinfo->optimize_coding = TRUE; /* assume default tables no good for progressive mode */ !cinfo->arith_code) /* TEMPORARY HACK ??? */
/* assume default tables no good for progressive or downscale mode */
cinfo->optimize_coding = TRUE;
/* Initialize my private state */ /* Initialize my private state */
if (transcode_only) { if (transcode_only) {

View File

@@ -17,6 +17,14 @@
/* Define this if you get warnings about undefined structures. */ /* Define this if you get warnings about undefined structures. */
#undef INCOMPLETE_TYPES_BROKEN #undef INCOMPLETE_TYPES_BROKEN
/* Define "boolean" as unsigned char, not int, on Windows systems. */
#ifdef _WIN32
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
#ifdef JPEG_INTERNALS #ifdef JPEG_INTERNALS
#undef RIGHT_SHIFT_IS_UNSIGNED #undef RIGHT_SHIFT_IS_UNSIGNED

View File

@@ -30,7 +30,7 @@
#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */ #define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */
/* Note: the above define is known to improve the code with Microsoft C 6.00A. /* Note: the above define is known to improve the code with Microsoft C 6.00A.
* I do not know whether it is good for later compiler versions. * I do not know whether it is good for later compiler versions.
* Please report any info on this point to jpeg-info@uunet.uu.net. * Please report any info on this point to jpeg-info@jpegclub.org.
*/ */
#endif /* JPEG_INTERNALS */ #endif /* JPEG_INTERNALS */

View File

@@ -91,6 +91,15 @@
*/ */
#undef INCOMPLETE_TYPES_BROKEN #undef INCOMPLETE_TYPES_BROKEN
/* Define "boolean" as unsigned char, not int, on Windows systems.
*/
#ifdef _WIN32
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
typedef unsigned char boolean;
#endif
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
#endif
/* /*
* The following options affect code selection within the JPEG library, * The following options affect code selection within the JPEG library,

View File

@@ -2,6 +2,7 @@
* jctrans.c * jctrans.c
* *
* Copyright (C) 1995-1998, Thomas G. Lane. * Copyright (C) 1995-1998, Thomas G. Lane.
* Modified 2000-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -76,6 +77,10 @@ jpeg_copy_critical_parameters (j_decompress_ptr srcinfo,
dstinfo->image_height = srcinfo->image_height; dstinfo->image_height = srcinfo->image_height;
dstinfo->input_components = srcinfo->num_components; dstinfo->input_components = srcinfo->num_components;
dstinfo->in_color_space = srcinfo->jpeg_color_space; dstinfo->in_color_space = srcinfo->jpeg_color_space;
dstinfo->jpeg_width = srcinfo->output_width;
dstinfo->jpeg_height = srcinfo->output_height;
dstinfo->min_DCT_h_scaled_size = srcinfo->min_DCT_h_scaled_size;
dstinfo->min_DCT_v_scaled_size = srcinfo->min_DCT_v_scaled_size;
/* Initialize all parameters to default values */ /* Initialize all parameters to default values */
jpeg_set_defaults(dstinfo); jpeg_set_defaults(dstinfo);
/* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB. /* jpeg_set_defaults may choose wrong colorspace, eg YCbCr if input is RGB.
@@ -158,17 +163,13 @@ LOCAL(void)
transencode_master_selection (j_compress_ptr cinfo, transencode_master_selection (j_compress_ptr cinfo,
jvirt_barray_ptr * coef_arrays) jvirt_barray_ptr * coef_arrays)
{ {
/* Although we don't actually use input_components for transcoding,
* jcmaster.c's initial_setup will complain if input_components is 0.
*/
cinfo->input_components = 1;
/* Initialize master control (includes parameter checking/processing) */ /* Initialize master control (includes parameter checking/processing) */
jinit_c_master_control(cinfo, TRUE /* transcode only */); jinit_c_master_control(cinfo, TRUE /* transcode only */);
/* Entropy encoding: either Huffman or arithmetic coding. */ /* Entropy encoding: either Huffman or arithmetic coding. */
if (cinfo->arith_code) { if (cinfo->arith_code)
jinit_arith_encoder(cinfo); jinit_arith_encoder(cinfo);
} else { else {
jinit_huff_encoder(cinfo); jinit_huff_encoder(cinfo);
} }
@@ -374,7 +375,7 @@ transencode_coef_controller (j_compress_ptr cinfo,
buffer = (JBLOCKROW) buffer = (JBLOCKROW)
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE, (*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
jzero_far((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)); FMEMZERO((void FAR *) buffer, C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) { for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
coef->dummy_buffer[i] = buffer + i; coef->dummy_buffer[i] = buffer + i;
} }

View File

@@ -186,8 +186,8 @@ default_decompress_parms (j_decompress_ptr cinfo)
} }
/* Set defaults for other decompression parameters. */ /* Set defaults for other decompression parameters. */
cinfo->scale_num = DCTSIZE; /* 1:1 scaling */ cinfo->scale_num = cinfo->block_size; /* 1:1 scaling */
cinfo->scale_denom = DCTSIZE; cinfo->scale_denom = cinfo->block_size;
cinfo->output_gamma = 1.0; cinfo->output_gamma = 1.0;
cinfo->buffered_image = FALSE; cinfo->buffered_image = FALSE;
cinfo->raw_data_out = FALSE; cinfo->raw_data_out = FALSE;

View File

@@ -1,7 +1,7 @@
/* /*
* jdarith.c * jdarith.c
* *
* Developed 1997 by Guido Vollbeding. * Developed 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -37,6 +37,9 @@ typedef struct {
/* Pointers to statistics areas (these workspaces have image lifespan) */ /* Pointers to statistics areas (these workspaces have image lifespan) */
unsigned char * dc_stats[NUM_ARITH_TBLS]; unsigned char * dc_stats[NUM_ARITH_TBLS];
unsigned char * ac_stats[NUM_ARITH_TBLS]; unsigned char * ac_stats[NUM_ARITH_TBLS];
/* Statistics bin for coding with fixed probability 0.5 */
unsigned char fixed_bin[4];
} arith_entropy_decoder; } arith_entropy_decoder;
typedef arith_entropy_decoder * arith_entropy_ptr; typedef arith_entropy_decoder * arith_entropy_ptr;
@@ -45,8 +48,6 @@ typedef arith_entropy_decoder * arith_entropy_ptr;
* for the statistics area. * for the statistics area.
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least * 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. * 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, * We use a compact representation with 1 byte per statistics bin,
* thus the numbers directly represent byte sizes. * thus the numbers directly represent byte sizes.
@@ -104,7 +105,6 @@ get_byte (j_decompress_ptr cinfo)
LOCAL(int) LOCAL(int)
arith_decode (j_decompress_ptr cinfo, unsigned char *st) arith_decode (j_decompress_ptr cinfo, unsigned char *st)
{ {
extern const INT32 jaritab[];
register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy; register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
register unsigned char nl, nm; register unsigned char nl, nm;
register INT32 qe, temp; register INT32 qe, temp;
@@ -145,11 +145,11 @@ arith_decode (j_decompress_ptr cinfo, unsigned char *st)
e->a <<= 1; e->a <<= 1;
} }
/* Fetch values from our compact representation of Table D.2: /* Fetch values from our compact representation of Table D.3(D.2):
* Qe values and probability estimation state machine * Qe values and probability estimation state machine
*/ */
sv = *st; sv = *st;
qe = jaritab[sv & 0x7F]; /* => Qe_Value */ qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */ nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */ nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
@@ -197,16 +197,17 @@ process_restart (j_decompress_ptr cinfo)
if (! (*cinfo->marker->read_restart_marker) (cinfo)) if (! (*cinfo->marker->read_restart_marker) (cinfo))
ERREXIT(cinfo, JERR_CANT_SUSPEND); ERREXIT(cinfo, JERR_CANT_SUSPEND);
/* Re-initialize statistics areas */
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
/* Re-initialize statistics areas */ if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS); MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
/* Reset DC predictions to 0 */ /* Reset DC predictions to 0 */
entropy->last_dc_val[ci] = 0; entropy->last_dc_val[ci] = 0;
entropy->dc_context[ci] = 0; entropy->dc_context[ci] = 0;
} }
if (cinfo->progressive_mode == 0 || cinfo->Ss) { if ((! cinfo->progressive_mode && cinfo->lim_Se) ||
(cinfo->progressive_mode && cinfo->Ss)) {
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS); MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
} }
} }
@@ -288,9 +289,9 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
} }
} }
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1)) if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
entropy->dc_context[ci] = 0; /* zero diff category */ entropy->dc_context[ci] = 0; /* zero diff category */
else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1)) else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
else else
entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */
@@ -324,6 +325,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int tbl, sign, k; int tbl, sign, k;
int v, m; int v, m;
const int * natural_order;
/* Process restart marker if needed */ /* Process restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -334,6 +336,8 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->ct == -1) return TRUE; /* if error do nothing */ if (entropy->ct == -1) return TRUE; /* if error do nothing */
natural_order = cinfo->natural_order;
/* There is always only one block per MCU */ /* There is always only one block per MCU */
block = MCU_data[0]; block = MCU_data[0];
tbl = cinfo->cur_comp_info[0]->ac_tbl_no; tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
@@ -354,8 +358,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
} }
/* Figure F.21: Decoding nonzero value v */ /* Figure F.21: Decoding nonzero value v */
/* Figure F.22: Decoding the sign of v */ /* Figure F.22: Decoding the sign of v */
entropy->ac_stats[tbl][245] = 0; sign = arith_decode(cinfo, entropy->fixed_bin);
sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
st += 2; st += 2;
/* Figure F.23: Decoding the magnitude category of v */ /* Figure F.23: Decoding the magnitude category of v */
if ((m = arith_decode(cinfo, st)) != 0) { if ((m = arith_decode(cinfo, st)) != 0) {
@@ -380,7 +383,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (arith_decode(cinfo, st)) v |= m; if (arith_decode(cinfo, st)) v |= m;
v += 1; if (sign) v = -v; v += 1; if (sign) v = -v;
/* Scale and output coefficient in natural (dezigzagged) order */ /* Scale and output coefficient in natural (dezigzagged) order */
(*block)[jpeg_natural_order[k]] = (JCOEF) (v << cinfo->Al); (*block)[natural_order[k]] = (JCOEF) (v << cinfo->Al);
} }
return TRUE; return TRUE;
@@ -395,7 +398,7 @@ METHODDEF(boolean)
decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{ {
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy; arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
unsigned char st[4]; unsigned char *st;
int p1, blkn; int p1, blkn;
/* Process restart marker if needed */ /* Process restart marker if needed */
@@ -405,12 +408,12 @@ decode_mcu_DC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
entropy->restarts_to_go--; entropy->restarts_to_go--;
} }
st = entropy->fixed_bin; /* use fixed probability estimation */
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */ p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
/* Outer loop handles each block in the MCU */ /* Outer loop handles each block in the MCU */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { 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 */ /* Encoded data is simply the next bit of the two's-complement DC value */
if (arith_decode(cinfo, st)) if (arith_decode(cinfo, st))
MCU_data[blkn][0][0] |= p1; MCU_data[blkn][0][0] |= p1;
@@ -433,6 +436,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int tbl, k, kex; int tbl, k, kex;
int p1, m1; int p1, m1;
const int * natural_order;
/* Process restart marker if needed */ /* Process restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -443,6 +447,8 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->ct == -1) return TRUE; /* if error do nothing */ if (entropy->ct == -1) return TRUE; /* if error do nothing */
natural_order = cinfo->natural_order;
/* There is always only one block per MCU */ /* There is always only one block per MCU */
block = MCU_data[0]; block = MCU_data[0];
tbl = cinfo->cur_comp_info[0]->ac_tbl_no; tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
@@ -451,15 +457,15 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
m1 = (-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 */ /* Establish EOBx (previous stage end-of-block) index */
for (kex = cinfo->Se + 1; kex > 1; kex--) for (kex = cinfo->Se; kex > 0; kex--)
if ((*block)[jpeg_natural_order[kex - 1]]) break; if ((*block)[natural_order[kex]]) break;
for (k = cinfo->Ss; k <= cinfo->Se; k++) { for (k = cinfo->Ss; k <= cinfo->Se; k++) {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * (k - 1);
if (k >= kex) if (k > kex)
if (arith_decode(cinfo, st)) break; /* EOB flag */ if (arith_decode(cinfo, st)) break; /* EOB flag */
for (;;) { for (;;) {
thiscoef = *block + jpeg_natural_order[k]; thiscoef = *block + natural_order[k];
if (*thiscoef) { /* previously nonzero coef */ if (*thiscoef) { /* previously nonzero coef */
if (arith_decode(cinfo, st + 2)) { if (arith_decode(cinfo, st + 2)) {
if (*thiscoef < 0) if (*thiscoef < 0)
@@ -470,8 +476,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
break; break;
} }
if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */ if (arith_decode(cinfo, st + 1)) { /* newly nonzero coef */
entropy->ac_stats[tbl][245] = 0; if (arith_decode(cinfo, entropy->fixed_bin))
if (arith_decode(cinfo, entropy->ac_stats[tbl] + 245))
*thiscoef = m1; *thiscoef = m1;
else else
*thiscoef = p1; *thiscoef = p1;
@@ -503,6 +508,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
unsigned char *st; unsigned char *st;
int blkn, ci, tbl, sign, k; int blkn, ci, tbl, sign, k;
int v, m; int v, m;
const int * natural_order;
/* Process restart marker if needed */ /* Process restart marker if needed */
if (cinfo->restart_interval) { if (cinfo->restart_interval) {
@@ -513,6 +519,8 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
if (entropy->ct == -1) return TRUE; /* if error do nothing */ if (entropy->ct == -1) return TRUE; /* if error do nothing */
natural_order = cinfo->natural_order;
/* Outer loop handles each block in the MCU */ /* Outer loop handles each block in the MCU */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) { for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
@@ -548,9 +556,9 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
} }
} }
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */ /* Section F.1.4.4.1.2: Establish dc_context conditioning category */
if (m < (int) (((INT32) 1 << cinfo->arith_dc_L[tbl]) >> 1)) if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
entropy->dc_context[ci] = 0; /* zero diff category */ entropy->dc_context[ci] = 0; /* zero diff category */
else if (m > (int) (((INT32) 1 << cinfo->arith_dc_U[tbl]) >> 1)) else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */ entropy->dc_context[ci] = 12 + (sign * 4); /* large diff category */
else else
entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */ entropy->dc_context[ci] = 4 + (sign * 4); /* small diff category */
@@ -567,15 +575,19 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */ /* Sections F.2.4.2 & F.1.4.4.2: Decoding of AC coefficients */
if (cinfo->lim_Se == 0) continue;
tbl = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
k = 0;
/* Figure F.20: Decode_AC_coefficients */ /* Figure F.20: Decode_AC_coefficients */
for (k = 1; k < DCTSIZE2; k++) { do {
st = entropy->ac_stats[tbl] + 3 * (k - 1); st = entropy->ac_stats[tbl] + 3 * k;
if (arith_decode(cinfo, st)) break; /* EOB flag */ if (arith_decode(cinfo, st)) break; /* EOB flag */
while (arith_decode(cinfo, st + 1) == 0) { for (;;) {
st += 3; k++; k++;
if (k >= DCTSIZE2) { if (arith_decode(cinfo, st + 1)) break;
st += 3;
if (k >= cinfo->lim_Se) {
WARNMS(cinfo, JWRN_ARITH_BAD_CODE); WARNMS(cinfo, JWRN_ARITH_BAD_CODE);
entropy->ct = -1; /* spectral overflow */ entropy->ct = -1; /* spectral overflow */
return TRUE; return TRUE;
@@ -583,8 +595,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
} }
/* Figure F.21: Decoding nonzero value v */ /* Figure F.21: Decoding nonzero value v */
/* Figure F.22: Decoding the sign of v */ /* Figure F.22: Decoding the sign of v */
entropy->ac_stats[tbl][245] = 0; sign = arith_decode(cinfo, entropy->fixed_bin);
sign = arith_decode(cinfo, entropy->ac_stats[tbl] + 245);
st += 2; st += 2;
/* Figure F.23: Decoding the magnitude category of v */ /* Figure F.23: Decoding the magnitude category of v */
if ((m = arith_decode(cinfo, st)) != 0) { if ((m = arith_decode(cinfo, st)) != 0) {
@@ -608,8 +619,8 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
while (m >>= 1) while (m >>= 1)
if (arith_decode(cinfo, st)) v |= m; if (arith_decode(cinfo, st)) v |= m;
v += 1; if (sign) v = -v; v += 1; if (sign) v = -v;
(*block)[jpeg_natural_order[k]] = (JCOEF) v; (*block)[natural_order[k]] = (JCOEF) v;
} } while (k < cinfo->lim_Se);
} }
return TRUE; return TRUE;
@@ -634,7 +645,7 @@ start_pass (j_decompress_ptr cinfo)
goto bad; goto bad;
} else { } else {
/* need not check Ss/Se < 0 since they came from unsigned bytes */ /* need not check Ss/Se < 0 since they came from unsigned bytes */
if (cinfo->Se < cinfo->Ss || cinfo->Se >= DCTSIZE2) if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se)
goto bad; goto bad;
/* AC scans may have only one component */ /* AC scans may have only one component */
if (cinfo->comps_in_scan != 1) if (cinfo->comps_in_scan != 1)
@@ -680,20 +691,19 @@ start_pass (j_decompress_ptr cinfo)
} }
} else { } else {
/* Check that the scan parameters Ss, Se, Ah/Al are OK for sequential JPEG. /* 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 * This ought to be an error condition, but we make it a warning.
* there are some baseline files out there with all zeroes in these bytes.
*/ */
if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||
cinfo->Ah != 0 || cinfo->Al != 0) (cinfo->Se < DCTSIZE2 && cinfo->Se != cinfo->lim_Se))
WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
/* Select MCU decoding routine */ /* Select MCU decoding routine */
entropy->pub.decode_mcu = decode_mcu; entropy->pub.decode_mcu = decode_mcu;
} }
/* Allocate & initialize requested statistics areas */
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
/* Allocate & initialize requested statistics areas */ if (! cinfo->progressive_mode || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
if (cinfo->progressive_mode == 0 || (cinfo->Ss == 0 && cinfo->Ah == 0)) {
tbl = compptr->dc_tbl_no; tbl = compptr->dc_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -705,7 +715,8 @@ start_pass (j_decompress_ptr cinfo)
entropy->last_dc_val[ci] = 0; entropy->last_dc_val[ci] = 0;
entropy->dc_context[ci] = 0; entropy->dc_context[ci] = 0;
} }
if (cinfo->progressive_mode == 0 || cinfo->Ss) { if ((! cinfo->progressive_mode && cinfo->lim_Se) ||
(cinfo->progressive_mode && cinfo->Ss)) {
tbl = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
if (tbl < 0 || tbl >= NUM_ARITH_TBLS) if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl); ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
@@ -748,6 +759,9 @@ jinit_arith_decoder (j_decompress_ptr cinfo)
entropy->ac_stats[i] = NULL; entropy->ac_stats[i] = NULL;
} }
/* Initialize index for fixed probability estimation */
entropy->fixed_bin[0] = 113;
if (cinfo->progressive_mode) { if (cinfo->progressive_mode) {
/* Create progression status table */ /* Create progression status table */
int *coef_bit_ptr, ci; int *coef_bit_ptr, ci;

View File

@@ -2,13 +2,14 @@
* jdatadst.c * jdatadst.c
* *
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* Modified 2009-2012 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains compression data destination routines for the case of * This file contains compression data destination routines for the case of
* emitting JPEG data to a file (or any stdio stream). While these routines * emitting JPEG data to memory or to a file (or any stdio stream).
* are sufficient for most applications, some will want to use a different * While these routines are sufficient for most applications,
* destination manager. * some will want to use a different destination manager.
* IMPORTANT: we assume that fwrite() will correctly transcribe an array of * IMPORTANT: we assume that fwrite() will correctly transcribe an array of
* JOCTETs into 8-bit-wide elements on external storage. If char is wider * JOCTETs into 8-bit-wide elements on external storage. If char is wider
* than 8 bits on your machine, you may need to do some tweaking. * than 8 bits on your machine, you may need to do some tweaking.
@@ -19,6 +20,11 @@
#include "jpeglib.h" #include "jpeglib.h"
#include "jerror.h" #include "jerror.h"
#ifndef HAVE_STDLIB_H /* <stdlib.h> should declare malloc(),free() */
extern void * malloc JPP((size_t size));
extern void free JPP((void *ptr));
#endif
/* Expanded data destination object for stdio output */ /* Expanded data destination object for stdio output */
@@ -34,6 +40,21 @@ typedef my_destination_mgr * my_dest_ptr;
#define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */ #define OUTPUT_BUF_SIZE 4096 /* choose an efficiently fwrite'able size */
/* Expanded data destination object for memory output */
typedef struct {
struct jpeg_destination_mgr pub; /* public fields */
unsigned char ** outbuffer; /* target buffer */
unsigned long * outsize;
unsigned char * newbuffer; /* newly allocated buffer */
JOCTET * buffer; /* start of buffer */
size_t bufsize;
} my_mem_destination_mgr;
typedef my_mem_destination_mgr * my_mem_dest_ptr;
/* /*
* Initialize destination --- called by jpeg_start_compress * Initialize destination --- called by jpeg_start_compress
* before any data is actually written. * before any data is actually written.
@@ -53,6 +74,12 @@ init_destination (j_compress_ptr cinfo)
dest->pub.free_in_buffer = OUTPUT_BUF_SIZE; dest->pub.free_in_buffer = OUTPUT_BUF_SIZE;
} }
METHODDEF(void)
init_mem_destination (j_compress_ptr cinfo)
{
/* no work necessary here */
}
/* /*
* Empty the output buffer --- called whenever buffer fills up. * Empty the output buffer --- called whenever buffer fills up.
@@ -92,6 +119,36 @@ empty_output_buffer (j_compress_ptr cinfo)
return TRUE; return TRUE;
} }
METHODDEF(boolean)
empty_mem_output_buffer (j_compress_ptr cinfo)
{
size_t nextsize;
JOCTET * nextbuffer;
my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
/* Try to allocate new buffer with double size */
nextsize = dest->bufsize * 2;
nextbuffer = (JOCTET *) malloc(nextsize);
if (nextbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
MEMCOPY(nextbuffer, dest->buffer, dest->bufsize);
if (dest->newbuffer != NULL)
free(dest->newbuffer);
dest->newbuffer = nextbuffer;
dest->pub.next_output_byte = nextbuffer + dest->bufsize;
dest->pub.free_in_buffer = dest->bufsize;
dest->buffer = nextbuffer;
dest->bufsize = nextsize;
return TRUE;
}
/* /*
* Terminate destination --- called by jpeg_finish_compress * Terminate destination --- called by jpeg_finish_compress
@@ -119,6 +176,15 @@ term_destination (j_compress_ptr cinfo)
ERREXIT(cinfo, JERR_FILE_WRITE); ERREXIT(cinfo, JERR_FILE_WRITE);
} }
METHODDEF(void)
term_mem_destination (j_compress_ptr cinfo)
{
my_mem_dest_ptr dest = (my_mem_dest_ptr) cinfo->dest;
*dest->outbuffer = dest->buffer;
*dest->outsize = dest->bufsize - dest->pub.free_in_buffer;
}
/* /*
* Prepare for output to a stdio stream. * Prepare for output to a stdio stream.
@@ -149,3 +215,53 @@ jpeg_stdio_dest (j_compress_ptr cinfo, FILE * outfile)
dest->pub.term_destination = term_destination; dest->pub.term_destination = term_destination;
dest->outfile = outfile; dest->outfile = outfile;
} }
/*
* Prepare for output to a memory buffer.
* The caller may supply an own initial buffer with appropriate size.
* Otherwise, or when the actual data output exceeds the given size,
* the library adapts the buffer size as necessary.
* The standard library functions malloc/free are used for allocating
* larger memory, so the buffer is available to the application after
* finishing compression, and then the application is responsible for
* freeing the requested memory.
*/
GLOBAL(void)
jpeg_mem_dest (j_compress_ptr cinfo,
unsigned char ** outbuffer, unsigned long * outsize)
{
my_mem_dest_ptr dest;
if (outbuffer == NULL || outsize == NULL) /* sanity check */
ERREXIT(cinfo, JERR_BUFFER_SIZE);
/* The destination object is made permanent so that multiple JPEG images
* can be written to the same buffer without re-executing jpeg_mem_dest.
*/
if (cinfo->dest == NULL) { /* first time for this JPEG object? */
cinfo->dest = (struct jpeg_destination_mgr *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(my_mem_destination_mgr));
}
dest = (my_mem_dest_ptr) cinfo->dest;
dest->pub.init_destination = init_mem_destination;
dest->pub.empty_output_buffer = empty_mem_output_buffer;
dest->pub.term_destination = term_mem_destination;
dest->outbuffer = outbuffer;
dest->outsize = outsize;
dest->newbuffer = NULL;
if (*outbuffer == NULL || *outsize == 0) {
/* Allocate initial buffer */
dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE);
if (dest->newbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
*outsize = OUTPUT_BUF_SIZE;
}
dest->pub.next_output_byte = dest->buffer = *outbuffer;
dest->pub.free_in_buffer = dest->bufsize = *outsize;
}

View File

@@ -2,13 +2,14 @@
* jdatasrc.c * jdatasrc.c
* *
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* Modified 2009-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains decompression data source routines for the case of * This file contains decompression data source routines for the case of
* reading JPEG data from a file (or any stdio stream). While these routines * reading JPEG data from memory or from a file (or any stdio stream).
* are sufficient for most applications, some will want to use a different * While these routines are sufficient for most applications,
* source manager. * some will want to use a different source manager.
* IMPORTANT: we assume that fread() will correctly transcribe an array of * IMPORTANT: we assume that fread() will correctly transcribe an array of
* JOCTETs from 8-bit-wide elements on external storage. If char is wider * JOCTETs from 8-bit-wide elements on external storage. If char is wider
* than 8 bits on your machine, you may need to do some tweaking. * than 8 bits on your machine, you may need to do some tweaking.
@@ -52,6 +53,12 @@ init_source (j_decompress_ptr cinfo)
src->start_of_file = TRUE; src->start_of_file = TRUE;
} }
METHODDEF(void)
init_mem_source (j_decompress_ptr cinfo)
{
/* no work necessary here */
}
/* /*
* Fill the input buffer --- called whenever buffer is emptied. * Fill the input buffer --- called whenever buffer is emptied.
@@ -111,6 +118,27 @@ fill_input_buffer (j_decompress_ptr cinfo)
return TRUE; return TRUE;
} }
METHODDEF(boolean)
fill_mem_input_buffer (j_decompress_ptr cinfo)
{
static const JOCTET mybuffer[4] = {
(JOCTET) 0xFF, (JOCTET) JPEG_EOI, 0, 0
};
/* The whole JPEG data is expected to reside in the supplied memory
* buffer, so any request for more data beyond the given buffer size
* is treated as an error.
*/
WARNMS(cinfo, JWRN_JPEG_EOF);
/* Insert a fake EOI marker */
cinfo->src->next_input_byte = mybuffer;
cinfo->src->bytes_in_buffer = 2;
return TRUE;
}
/* /*
* Skip data --- used to skip over a potentially large amount of * Skip data --- used to skip over a potentially large amount of
@@ -127,22 +155,22 @@ fill_input_buffer (j_decompress_ptr cinfo)
METHODDEF(void) METHODDEF(void)
skip_input_data (j_decompress_ptr cinfo, long num_bytes) skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{ {
my_src_ptr src = (my_src_ptr) cinfo->src; struct jpeg_source_mgr * src = cinfo->src;
/* Just a dumb implementation for now. Could use fseek() except /* Just a dumb implementation for now. Could use fseek() except
* it doesn't work on pipes. Not clear that being smart is worth * it doesn't work on pipes. Not clear that being smart is worth
* any trouble anyway --- large skips are infrequent. * any trouble anyway --- large skips are infrequent.
*/ */
if (num_bytes > 0) { if (num_bytes > 0) {
while (num_bytes > (long) src->pub.bytes_in_buffer) { while (num_bytes > (long) src->bytes_in_buffer) {
num_bytes -= (long) src->pub.bytes_in_buffer; num_bytes -= (long) src->bytes_in_buffer;
(void) fill_input_buffer(cinfo); (void) (*src->fill_input_buffer) (cinfo);
/* note we assume that fill_input_buffer will never return FALSE, /* note we assume that fill_input_buffer will never return FALSE,
* so suspension need not be handled. * so suspension need not be handled.
*/ */
} }
src->pub.next_input_byte += (size_t) num_bytes; src->next_input_byte += (size_t) num_bytes;
src->pub.bytes_in_buffer -= (size_t) num_bytes; src->bytes_in_buffer -= (size_t) num_bytes;
} }
} }
@@ -210,3 +238,38 @@ jpeg_stdio_src (j_decompress_ptr cinfo, FILE * infile)
src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */ src->pub.bytes_in_buffer = 0; /* forces fill_input_buffer on first read */
src->pub.next_input_byte = NULL; /* until buffer loaded */ src->pub.next_input_byte = NULL; /* until buffer loaded */
} }
/*
* Prepare for input from a supplied memory buffer.
* The buffer must contain the whole JPEG data.
*/
GLOBAL(void)
jpeg_mem_src (j_decompress_ptr cinfo,
unsigned char * inbuffer, unsigned long insize)
{
struct jpeg_source_mgr * src;
if (inbuffer == NULL || insize == 0) /* Treat empty input as fatal error */
ERREXIT(cinfo, JERR_INPUT_EMPTY);
/* The source object is made permanent so that a series of JPEG images
* can be read from the same buffer by calling jpeg_mem_src only before
* the first one.
*/
if (cinfo->src == NULL) { /* first time for this JPEG object? */
cinfo->src = (struct jpeg_source_mgr *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_PERMANENT,
SIZEOF(struct jpeg_source_mgr));
}
src = cinfo->src;
src->init_source = init_mem_source;
src->fill_input_buffer = fill_mem_input_buffer;
src->skip_input_data = skip_input_data;
src->resync_to_restart = jpeg_resync_to_restart; /* use default method */
src->term_source = term_source;
src->bytes_in_buffer = (size_t) insize;
src->next_input_byte = (JOCTET *) inbuffer;
}

View File

@@ -2,6 +2,7 @@
* jdcoefct.c * jdcoefct.c
* *
* Copyright (C) 1994-1997, Thomas G. Lane. * Copyright (C) 1994-1997, Thomas G. Lane.
* Modified 2002-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -162,7 +163,8 @@ decompress_onepass (j_decompress_ptr cinfo, JSAMPIMAGE output_buf)
for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col; for (MCU_col_num = coef->MCU_ctr; MCU_col_num <= last_MCU_col;
MCU_col_num++) { MCU_col_num++) {
/* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */ /* Try to fetch an MCU. Entropy decoder expects buffer to be zeroed. */
jzero_far((void FAR *) coef->MCU_buffer[0], if (cinfo->lim_Se) /* can bypass in DC only case */
FMEMZERO((void FAR *) coef->MCU_buffer[0],
(size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK))); (size_t) (cinfo->blocks_in_MCU * SIZEOF(JBLOCK)));
if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) { if (! (*cinfo->entropy->decode_mcu) (cinfo, coef->MCU_buffer)) {
/* Suspension forced; update state counters and exit */ /* Suspension forced; update state counters and exit */
@@ -729,6 +731,9 @@ jinit_d_coef_controller (j_decompress_ptr cinfo, boolean need_full_buffer)
for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) { for (i = 0; i < D_MAX_BLOCKS_IN_MCU; i++) {
coef->MCU_buffer[i] = buffer + i; coef->MCU_buffer[i] = buffer + i;
} }
if (cinfo->lim_Se == 0) /* DC only case: want to bypass later */
FMEMZERO((void FAR *) buffer,
(size_t) (D_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK)));
coef->pub.consume_data = dummy_consume_data; coef->pub.consume_data = dummy_consume_data;
coef->pub.decompress_data = decompress_onepass; coef->pub.decompress_data = decompress_onepass;
coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */ coef->pub.coef_arrays = NULL; /* flag for no virtual arrays */

120
jdcolor.c
View File

@@ -2,6 +2,7 @@
* jdcolor.c * jdcolor.c
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -23,20 +24,28 @@ typedef struct {
int * Cb_b_tab; /* => table for Cb to B conversion */ int * Cb_b_tab; /* => table for Cb to B conversion */
INT32 * Cr_g_tab; /* => table for Cr to G conversion */ INT32 * Cr_g_tab; /* => table for Cr to G conversion */
INT32 * Cb_g_tab; /* => table for Cb to G conversion */ INT32 * Cb_g_tab; /* => table for Cb to G conversion */
/* Private state for RGB->Y conversion */
INT32 * rgb_y_tab; /* => table for RGB to Y conversion */
} my_color_deconverter; } my_color_deconverter;
typedef my_color_deconverter * my_cconvert_ptr; typedef my_color_deconverter * my_cconvert_ptr;
/**************** YCbCr -> RGB conversion: most common case **************/ /**************** YCbCr -> RGB conversion: most common case **************/
/**************** RGB -> Y conversion: less common case **************/
/* /*
* YCbCr is defined per CCIR 601-1, except that Cb and Cr are * YCbCr is defined per CCIR 601-1, except that Cb and Cr are
* normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5. * normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
* The conversion equations to be implemented are therefore * The conversion equations to be implemented are therefore
*
* R = Y + 1.40200 * Cr * R = Y + 1.40200 * Cr
* G = Y - 0.34414 * Cb - 0.71414 * Cr * G = Y - 0.34414 * Cb - 0.71414 * Cr
* B = Y + 1.77200 * Cb * B = Y + 1.77200 * Cb
*
* Y = 0.29900 * R + 0.58700 * G + 0.11400 * B
*
* where Cb and Cr represent the incoming values less CENTERJSAMPLE. * where Cb and Cr represent the incoming values less CENTERJSAMPLE.
* (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.) * (These numbers are derived from TIFF 6.0 section 21, dated 3-June-92.)
* *
@@ -61,6 +70,18 @@ typedef my_color_deconverter * my_cconvert_ptr;
#define ONE_HALF ((INT32) 1 << (SCALEBITS-1)) #define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5)) #define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
/* We allocate one big table for RGB->Y conversion and divide it up into
* three parts, instead of doing three alloc_small requests. This lets us
* use a single table base address, which can be held in a register in the
* inner loops on many machines (more than can hold all three addresses,
* anyway).
*/
#define R_Y_OFF 0 /* offset to R => Y section */
#define G_Y_OFF (1*(MAXJSAMPLE+1)) /* offset to G => Y section */
#define B_Y_OFF (2*(MAXJSAMPLE+1)) /* etc. */
#define TABLE_SIZE (3*(MAXJSAMPLE+1))
/* /*
* Initialize tables for YCC->RGB colorspace conversion. * Initialize tables for YCC->RGB colorspace conversion.
@@ -160,6 +181,98 @@ ycc_rgb_convert (j_decompress_ptr cinfo,
/**************** Cases other than YCbCr -> RGB **************/ /**************** Cases other than YCbCr -> RGB **************/
/*
* Initialize for RGB->grayscale colorspace conversion.
*/
LOCAL(void)
build_rgb_y_table (j_decompress_ptr cinfo)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
INT32 * rgb_y_tab;
INT32 i;
/* Allocate and fill in the conversion tables. */
cconvert->rgb_y_tab = rgb_y_tab = (INT32 *)
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
(TABLE_SIZE * SIZEOF(INT32)));
for (i = 0; i <= MAXJSAMPLE; i++) {
rgb_y_tab[i+R_Y_OFF] = FIX(0.29900) * i;
rgb_y_tab[i+G_Y_OFF] = FIX(0.58700) * i;
rgb_y_tab[i+B_Y_OFF] = FIX(0.11400) * i + ONE_HALF;
}
}
/*
* Convert RGB to grayscale.
*/
METHODDEF(void)
rgb_gray_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
register int r, g, b;
register INT32 * ctab = cconvert->rgb_y_tab;
register JSAMPROW outptr;
register JSAMPROW inptr0, inptr1, inptr2;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->output_width;
while (--num_rows >= 0) {
inptr0 = input_buf[0][input_row];
inptr1 = input_buf[1][input_row];
inptr2 = input_buf[2][input_row];
input_row++;
outptr = *output_buf++;
for (col = 0; col < num_cols; col++) {
r = GETJSAMPLE(inptr0[col]);
g = GETJSAMPLE(inptr1[col]);
b = GETJSAMPLE(inptr2[col]);
/* Y */
outptr[col] = (JSAMPLE)
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
>> SCALEBITS);
}
}
}
/*
* No colorspace change, but conversion from separate-planes
* to interleaved representation.
*/
METHODDEF(void)
rgb_convert (j_decompress_ptr cinfo,
JSAMPIMAGE input_buf, JDIMENSION input_row,
JSAMPARRAY output_buf, int num_rows)
{
register JSAMPROW outptr;
register JSAMPROW inptr0, inptr1, inptr2;
register JDIMENSION col;
JDIMENSION num_cols = cinfo->output_width;
while (--num_rows >= 0) {
inptr0 = input_buf[0][input_row];
inptr1 = input_buf[1][input_row];
inptr2 = input_buf[2][input_row];
input_row++;
outptr = *output_buf++;
for (col = 0; col < num_cols; col++) {
/* We can dispense with GETJSAMPLE() here */
outptr[RGB_RED] = inptr0[col];
outptr[RGB_GREEN] = inptr1[col];
outptr[RGB_BLUE] = inptr2[col];
outptr += RGB_PIXELSIZE;
}
}
}
/* /*
* Color conversion for no colorspace change: just copy the data, * Color conversion for no colorspace change: just copy the data,
* converting from separate-planes to interleaved representation. * converting from separate-planes to interleaved representation.
@@ -351,6 +464,9 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
/* For color->grayscale conversion, only the Y (0) component is needed */ /* For color->grayscale conversion, only the Y (0) component is needed */
for (ci = 1; ci < cinfo->num_components; ci++) for (ci = 1; ci < cinfo->num_components; ci++)
cinfo->comp_info[ci].component_needed = FALSE; cinfo->comp_info[ci].component_needed = FALSE;
} else if (cinfo->jpeg_color_space == JCS_RGB) {
cconvert->pub.color_convert = rgb_gray_convert;
build_rgb_y_table(cinfo);
} else } else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;
@@ -362,8 +478,8 @@ jinit_color_deconverter (j_decompress_ptr cinfo)
build_ycc_rgb_table(cinfo); build_ycc_rgb_table(cinfo);
} else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) { } else if (cinfo->jpeg_color_space == JCS_GRAYSCALE) {
cconvert->pub.color_convert = gray_rgb_convert; cconvert->pub.color_convert = gray_rgb_convert;
} else if (cinfo->jpeg_color_space == JCS_RGB && RGB_PIXELSIZE == 3) { } else if (cinfo->jpeg_color_space == JCS_RGB) {
cconvert->pub.color_convert = null_convert; cconvert->pub.color_convert = rgb_convert;
} else } else
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL); ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
break; break;

View File

@@ -2,6 +2,7 @@
* jddctmgr.c * jddctmgr.c
* *
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* Modified 2002-2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -324,6 +325,7 @@ start_pass (j_decompress_ptr cinfo)
* coefficients scaled by scalefactor[row]*scalefactor[col], where * coefficients scaled by scalefactor[row]*scalefactor[col], where
* scalefactor[0] = 1 * scalefactor[0] = 1
* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7 * scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
* We apply a further scale factor of 1/8.
*/ */
FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table; FLOAT_MULT_TYPE * fmtbl = (FLOAT_MULT_TYPE *) compptr->dct_table;
int row, col; int row, col;
@@ -337,7 +339,7 @@ start_pass (j_decompress_ptr cinfo)
for (col = 0; col < DCTSIZE; col++) { for (col = 0; col < DCTSIZE; col++) {
fmtbl[i] = (FLOAT_MULT_TYPE) fmtbl[i] = (FLOAT_MULT_TYPE)
((double) qtbl->quantval[i] * ((double) qtbl->quantval[i] *
aanscalefactor[row] * aanscalefactor[col]); aanscalefactor[row] * aanscalefactor[col] * 0.125);
i++; i++;
} }
} }

304
jdhuff.c
View File

@@ -229,6 +229,7 @@ typedef struct {
savable_state saved; /* Other state at start of MCU */ savable_state saved; /* Other state at start of MCU */
/* These fields are NOT loaded into local working state. */ /* These fields are NOT loaded into local working state. */
boolean insufficient_data; /* set TRUE after emitting warning */
unsigned int restarts_to_go; /* MCUs left in this restart interval */ unsigned int restarts_to_go; /* MCUs left in this restart interval */
/* Following two fields used only in progressive mode */ /* Following two fields used only in progressive mode */
@@ -267,6 +268,51 @@ static const int jpeg_zigzag_order[8][8] = {
{ 35, 36, 48, 49, 57, 58, 62, 63 } { 35, 36, 48, 49, 57, 58, 62, 63 }
}; };
static const int jpeg_zigzag_order7[7][7] = {
{ 0, 1, 5, 6, 14, 15, 27 },
{ 2, 4, 7, 13, 16, 26, 28 },
{ 3, 8, 12, 17, 25, 29, 38 },
{ 9, 11, 18, 24, 30, 37, 39 },
{ 10, 19, 23, 31, 36, 40, 45 },
{ 20, 22, 32, 35, 41, 44, 46 },
{ 21, 33, 34, 42, 43, 47, 48 }
};
static const int jpeg_zigzag_order6[6][6] = {
{ 0, 1, 5, 6, 14, 15 },
{ 2, 4, 7, 13, 16, 25 },
{ 3, 8, 12, 17, 24, 26 },
{ 9, 11, 18, 23, 27, 32 },
{ 10, 19, 22, 28, 31, 33 },
{ 20, 21, 29, 30, 34, 35 }
};
static const int jpeg_zigzag_order5[5][5] = {
{ 0, 1, 5, 6, 14 },
{ 2, 4, 7, 13, 15 },
{ 3, 8, 12, 16, 21 },
{ 9, 11, 17, 20, 22 },
{ 10, 18, 19, 23, 24 }
};
static const int jpeg_zigzag_order4[4][4] = {
{ 0, 1, 5, 6 },
{ 2, 4, 7, 12 },
{ 3, 8, 11, 13 },
{ 9, 10, 14, 15 }
};
static const int jpeg_zigzag_order3[3][3] = {
{ 0, 1, 5 },
{ 2, 4, 6 },
{ 3, 7, 8 }
};
static const int jpeg_zigzag_order2[2][2] = {
{ 0, 1 },
{ 2, 3 }
};
/* /*
* Compute the derived values for a Huffman table. * Compute the derived values for a Huffman table.
@@ -496,9 +542,9 @@ jpeg_fill_bit_buffer (bitread_working_state * state,
* We use a nonvolatile flag to ensure that only one warning message * We use a nonvolatile flag to ensure that only one warning message
* appears per data segment. * appears per data segment.
*/ */
if (! cinfo->entropy->insufficient_data) { if (! ((huff_entropy_ptr) cinfo->entropy)->insufficient_data) {
WARNMS(cinfo, JWRN_HIT_MARKER); WARNMS(cinfo, JWRN_HIT_MARKER);
cinfo->entropy->insufficient_data = TRUE; ((huff_entropy_ptr) cinfo->entropy)->insufficient_data = TRUE;
} }
/* Fill the buffer with zero bits */ /* Fill the buffer with zero bits */
get_buffer <<= MIN_GET_BITS - bits_left; get_buffer <<= MIN_GET_BITS - bits_left;
@@ -616,7 +662,7 @@ process_restart (j_decompress_ptr cinfo)
* leaving the flag set. * leaving the flag set.
*/ */
if (cinfo->unread_marker == 0) if (cinfo->unread_marker == 0)
entropy->pub.insufficient_data = FALSE; entropy->insufficient_data = FALSE;
return TRUE; return TRUE;
} }
@@ -668,7 +714,7 @@ decode_mcu_DC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* If we've run out of data, just leave the MCU set to zeroes. /* If we've run out of data, just leave the MCU set to zeroes.
* This way, we return uniform gray for the remainder of the segment. * This way, we return uniform gray for the remainder of the segment.
*/ */
if (! entropy->pub.insufficient_data) { if (! entropy->insufficient_data) {
/* Load up working state */ /* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate); BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
@@ -720,10 +766,10 @@ METHODDEF(boolean)
decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{ {
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int Se = cinfo->Se;
int Al = cinfo->Al;
register int s, k, r; register int s, k, r;
unsigned int EOBRUN; unsigned int EOBRUN;
int Se, Al;
const int * natural_order;
JBLOCKROW block; JBLOCKROW block;
BITREAD_STATE_VARS; BITREAD_STATE_VARS;
d_derived_tbl * tbl; d_derived_tbl * tbl;
@@ -738,7 +784,11 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* If we've run out of data, just leave the MCU set to zeroes. /* If we've run out of data, just leave the MCU set to zeroes.
* This way, we return uniform gray for the remainder of the segment. * This way, we return uniform gray for the remainder of the segment.
*/ */
if (! entropy->pub.insufficient_data) { if (! entropy->insufficient_data) {
Se = cinfo->Se;
Al = cinfo->Al;
natural_order = cinfo->natural_order;
/* Load up working state. /* Load up working state.
* We can avoid loading/saving bitread state if in an EOB run. * We can avoid loading/saving bitread state if in an EOB run.
@@ -764,7 +814,7 @@ decode_mcu_AC_first (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
r = GET_BITS(s); r = GET_BITS(s);
s = HUFF_EXTEND(r, s); s = HUFF_EXTEND(r, s);
/* Scale and output coefficient in natural (dezigzagged) order */ /* Scale and output coefficient in natural (dezigzagged) order */
(*block)[jpeg_natural_order[k]] = (JCOEF) (s << Al); (*block)[natural_order[k]] = (JCOEF) (s << Al);
} else { } else {
if (r == 15) { /* ZRL */ if (r == 15) { /* ZRL */
k += 15; /* skip 15 zeroes in band */ k += 15; /* skip 15 zeroes in band */
@@ -854,11 +904,10 @@ METHODDEF(boolean)
decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data) decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{ {
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int Se = cinfo->Se;
int p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
int m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
register int s, k, r; register int s, k, r;
unsigned int EOBRUN; unsigned int EOBRUN;
int Se, p1, m1;
const int * natural_order;
JBLOCKROW block; JBLOCKROW block;
JCOEFPTR thiscoef; JCOEFPTR thiscoef;
BITREAD_STATE_VARS; BITREAD_STATE_VARS;
@@ -875,7 +924,12 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* If we've run out of data, don't modify the MCU. /* If we've run out of data, don't modify the MCU.
*/ */
if (! entropy->pub.insufficient_data) { if (! entropy->insufficient_data) {
Se = cinfo->Se;
p1 = 1 << cinfo->Al; /* 1 in the bit position being coded */
m1 = (-1) << cinfo->Al; /* -1 in the bit position being coded */
natural_order = cinfo->natural_order;
/* Load up working state */ /* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate); BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
@@ -926,7 +980,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
* if the absolute value of the coefficient must be increased. * if the absolute value of the coefficient must be increased.
*/ */
do { do {
thiscoef = *block + jpeg_natural_order[k]; thiscoef = *block + natural_order[k];
if (*thiscoef != 0) { if (*thiscoef != 0) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit); CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) { if (GET_BITS(1)) {
@@ -944,7 +998,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
k++; k++;
} while (k <= Se); } while (k <= Se);
if (s) { if (s) {
int pos = jpeg_natural_order[k]; int pos = natural_order[k];
/* Output newly nonzero coefficient */ /* Output newly nonzero coefficient */
(*block)[pos] = (JCOEF) s; (*block)[pos] = (JCOEF) s;
/* Remember its position in case we have to suspend */ /* Remember its position in case we have to suspend */
@@ -960,7 +1014,7 @@ decode_mcu_AC_refine (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
* if the absolute value of the coefficient must be increased. * if the absolute value of the coefficient must be increased.
*/ */
for (; k <= Se; k++) { for (; k <= Se; k++) {
thiscoef = *block + jpeg_natural_order[k]; thiscoef = *block + natural_order[k];
if (*thiscoef != 0) { if (*thiscoef != 0) {
CHECK_BIT_BUFFER(br_state, 1, goto undoit); CHECK_BIT_BUFFER(br_state, 1, goto undoit);
if (GET_BITS(1)) { if (GET_BITS(1)) {
@@ -997,7 +1051,136 @@ undoit:
/* /*
* Decode one MCU's worth of Huffman-compressed coefficients. * Decode one MCU's worth of Huffman-compressed coefficients,
* partial blocks.
*/
METHODDEF(boolean)
decode_mcu_sub (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
{
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
const int * natural_order;
int Se, blkn;
BITREAD_STATE_VARS;
savable_state state;
/* Process restart marker if needed; may have to suspend */
if (cinfo->restart_interval) {
if (entropy->restarts_to_go == 0)
if (! process_restart(cinfo))
return FALSE;
}
/* If we've run out of data, just leave the MCU set to zeroes.
* This way, we return uniform gray for the remainder of the segment.
*/
if (! entropy->insufficient_data) {
natural_order = cinfo->natural_order;
Se = cinfo->lim_Se;
/* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
ASSIGN_STATE(state, entropy->saved);
/* Outer loop handles each block in the MCU */
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
JBLOCKROW block = MCU_data[blkn];
d_derived_tbl * htbl;
register int s, k, r;
int coef_limit, ci;
/* Decode a single block's worth of coefficients */
/* Section F.2.2.1: decode the DC coefficient difference */
htbl = entropy->dc_cur_tbls[blkn];
HUFF_DECODE(s, br_state, htbl, return FALSE, label1);
htbl = entropy->ac_cur_tbls[blkn];
k = 1;
coef_limit = entropy->coef_limit[blkn];
if (coef_limit) {
/* Convert DC difference to actual value, update last_dc_val */
if (s) {
CHECK_BIT_BUFFER(br_state, s, return FALSE);
r = GET_BITS(s);
s = HUFF_EXTEND(r, s);
}
ci = cinfo->MCU_membership[blkn];
s += state.last_dc_val[ci];
state.last_dc_val[ci] = s;
/* Output the DC coefficient */
(*block)[0] = (JCOEF) s;
/* Section F.2.2.2: decode the AC coefficients */
/* Since zeroes are skipped, output area must be cleared beforehand */
for (; k < coef_limit; k++) {
HUFF_DECODE(s, br_state, htbl, return FALSE, label2);
r = s >> 4;
s &= 15;
if (s) {
k += r;
CHECK_BIT_BUFFER(br_state, s, return FALSE);
r = GET_BITS(s);
s = HUFF_EXTEND(r, s);
/* Output coefficient in natural (dezigzagged) order.
* Note: the extra entries in natural_order[] will save us
* if k > Se, which could happen if the data is corrupted.
*/
(*block)[natural_order[k]] = (JCOEF) s;
} else {
if (r != 15)
goto EndOfBlock;
k += 15;
}
}
} else {
if (s) {
CHECK_BIT_BUFFER(br_state, s, return FALSE);
DROP_BITS(s);
}
}
/* Section F.2.2.2: decode the AC coefficients */
/* In this path we just discard the values */
for (; k <= Se; k++) {
HUFF_DECODE(s, br_state, htbl, return FALSE, label3);
r = s >> 4;
s &= 15;
if (s) {
k += r;
CHECK_BIT_BUFFER(br_state, s, return FALSE);
DROP_BITS(s);
} else {
if (r != 15)
break;
k += 15;
}
}
EndOfBlock: ;
}
/* Completed MCU, so update state */
BITREAD_SAVE_STATE(cinfo,entropy->bitstate);
ASSIGN_STATE(entropy->saved, state);
}
/* Account for restart interval (no-op if not using restarts) */
entropy->restarts_to_go--;
return TRUE;
}
/*
* Decode one MCU's worth of Huffman-compressed coefficients,
* full-size blocks.
*/ */
METHODDEF(boolean) METHODDEF(boolean)
@@ -1018,7 +1201,7 @@ decode_mcu (j_decompress_ptr cinfo, JBLOCKROW *MCU_data)
/* If we've run out of data, just leave the MCU set to zeroes. /* If we've run out of data, just leave the MCU set to zeroes.
* This way, we return uniform gray for the remainder of the segment. * This way, we return uniform gray for the remainder of the segment.
*/ */
if (! entropy->pub.insufficient_data) { if (! entropy->insufficient_data) {
/* Load up working state */ /* Load up working state */
BITREAD_LOAD_STATE(cinfo,entropy->bitstate); BITREAD_LOAD_STATE(cinfo,entropy->bitstate);
@@ -1127,7 +1310,7 @@ METHODDEF(void)
start_pass_huff_decoder (j_decompress_ptr cinfo) start_pass_huff_decoder (j_decompress_ptr cinfo)
{ {
huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy; huff_entropy_ptr entropy = (huff_entropy_ptr) cinfo->entropy;
int ci, blkn, dctbl, actbl, i; int ci, blkn, tbl, i;
jpeg_component_info * compptr; jpeg_component_info * compptr;
if (cinfo->progressive_mode) { if (cinfo->progressive_mode) {
@@ -1137,7 +1320,7 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
goto bad; goto bad;
} else { } else {
/* need not check Ss/Se < 0 since they came from unsigned bytes */ /* need not check Ss/Se < 0 since they came from unsigned bytes */
if (cinfo->Se < cinfo->Ss || cinfo->Se >= DCTSIZE2) if (cinfo->Se < cinfo->Ss || cinfo->Se > cinfo->lim_Se)
goto bad; goto bad;
/* AC scans may have only one component */ /* AC scans may have only one component */
if (cinfo->comps_in_scan != 1) if (cinfo->comps_in_scan != 1)
@@ -1196,16 +1379,16 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
*/ */
if (cinfo->Ss == 0) { if (cinfo->Ss == 0) {
if (cinfo->Ah == 0) { /* DC refinement needs no table */ if (cinfo->Ah == 0) { /* DC refinement needs no table */
i = compptr->dc_tbl_no; tbl = compptr->dc_tbl_no;
jpeg_make_d_derived_tbl(cinfo, TRUE, i, jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
& entropy->derived_tbls[i]); & entropy->derived_tbls[tbl]);
} }
} else { } else {
i = compptr->ac_tbl_no; tbl = compptr->ac_tbl_no;
jpeg_make_d_derived_tbl(cinfo, FALSE, i, jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
& entropy->derived_tbls[i]); & entropy->derived_tbls[tbl]);
/* remember the single active table */ /* remember the single active table */
entropy->ac_derived_tbl = entropy->derived_tbls[i]; entropy->ac_derived_tbl = entropy->derived_tbls[tbl];
} }
/* Initialize DC predictions to 0 */ /* Initialize DC predictions to 0 */
entropy->saved.last_dc_val[ci] = 0; entropy->saved.last_dc_val[ci] = 0;
@@ -1218,23 +1401,35 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
* This ought to be an error condition, but we make it a warning because * 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. * there are some baseline files out there with all zeroes in these bytes.
*/ */
if (cinfo->Ss != 0 || cinfo->Se != DCTSIZE2-1 || if (cinfo->Ss != 0 || cinfo->Ah != 0 || cinfo->Al != 0 ||
cinfo->Ah != 0 || cinfo->Al != 0) ((cinfo->is_baseline || cinfo->Se < DCTSIZE2) &&
cinfo->Se != cinfo->lim_Se))
WARNMS(cinfo, JWRN_NOT_SEQUENTIAL); WARNMS(cinfo, JWRN_NOT_SEQUENTIAL);
/* Select MCU decoding routine */ /* Select MCU decoding routine */
/* We retain the hard-coded case for full-size blocks.
* This is not necessary, but it appears that this version is slightly
* more performant in the given implementation.
* With an improved implementation we would prefer a single optimized
* function.
*/
if (cinfo->lim_Se != DCTSIZE2-1)
entropy->pub.decode_mcu = decode_mcu_sub;
else
entropy->pub.decode_mcu = decode_mcu; entropy->pub.decode_mcu = decode_mcu;
for (ci = 0; ci < cinfo->comps_in_scan; ci++) { for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
compptr = cinfo->cur_comp_info[ci]; compptr = cinfo->cur_comp_info[ci];
dctbl = compptr->dc_tbl_no;
actbl = compptr->ac_tbl_no;
/* Compute derived values for Huffman tables */ /* Compute derived values for Huffman tables */
/* We may do this more than once for a table, but it's not expensive */ /* We may do this more than once for a table, but it's not expensive */
jpeg_make_d_derived_tbl(cinfo, TRUE, dctbl, tbl = compptr->dc_tbl_no;
& entropy->dc_derived_tbls[dctbl]); jpeg_make_d_derived_tbl(cinfo, TRUE, tbl,
jpeg_make_d_derived_tbl(cinfo, FALSE, actbl, & entropy->dc_derived_tbls[tbl]);
& entropy->ac_derived_tbls[actbl]); if (cinfo->lim_Se) { /* AC needs no table when not present */
tbl = compptr->ac_tbl_no;
jpeg_make_d_derived_tbl(cinfo, FALSE, tbl,
& entropy->ac_derived_tbls[tbl]);
}
/* Initialize DC predictions to 0 */ /* Initialize DC predictions to 0 */
entropy->saved.last_dc_val[ci] = 0; entropy->saved.last_dc_val[ci] = 0;
} }
@@ -1249,10 +1444,47 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
/* Decide whether we really care about the coefficient values */ /* Decide whether we really care about the coefficient values */
if (compptr->component_needed) { if (compptr->component_needed) {
ci = compptr->DCT_v_scaled_size; ci = compptr->DCT_v_scaled_size;
if (ci <= 0 || ci > 8) ci = 8;
i = compptr->DCT_h_scaled_size; i = compptr->DCT_h_scaled_size;
switch (cinfo->lim_Se) {
case (1*1-1):
entropy->coef_limit[blkn] = 1;
break;
case (2*2-1):
if (ci <= 0 || ci > 2) ci = 2;
if (i <= 0 || i > 2) i = 2;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order2[ci - 1][i - 1];
break;
case (3*3-1):
if (ci <= 0 || ci > 3) ci = 3;
if (i <= 0 || i > 3) i = 3;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order3[ci - 1][i - 1];
break;
case (4*4-1):
if (ci <= 0 || ci > 4) ci = 4;
if (i <= 0 || i > 4) i = 4;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order4[ci - 1][i - 1];
break;
case (5*5-1):
if (ci <= 0 || ci > 5) ci = 5;
if (i <= 0 || i > 5) i = 5;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order5[ci - 1][i - 1];
break;
case (6*6-1):
if (ci <= 0 || ci > 6) ci = 6;
if (i <= 0 || i > 6) i = 6;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order6[ci - 1][i - 1];
break;
case (7*7-1):
if (ci <= 0 || ci > 7) ci = 7;
if (i <= 0 || i > 7) i = 7;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order7[ci - 1][i - 1];
break;
default:
if (ci <= 0 || ci > 8) ci = 8;
if (i <= 0 || i > 8) i = 8; if (i <= 0 || i > 8) i = 8;
entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1]; entropy->coef_limit[blkn] = 1 + jpeg_zigzag_order[ci - 1][i - 1];
break;
}
} else { } else {
entropy->coef_limit[blkn] = 0; entropy->coef_limit[blkn] = 0;
} }
@@ -1262,7 +1494,7 @@ start_pass_huff_decoder (j_decompress_ptr cinfo)
/* Initialize bitread state variables */ /* Initialize bitread state variables */
entropy->bitstate.bits_left = 0; entropy->bitstate.bits_left = 0;
entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */ entropy->bitstate.get_buffer = 0; /* unnecessary, but keeps Purify quiet */
entropy->pub.insufficient_data = FALSE; entropy->insufficient_data = FALSE;
/* Initialize restart counter */ /* Initialize restart counter */
entropy->restarts_to_go = cinfo->restart_interval; entropy->restarts_to_go = cinfo->restart_interval;

321
jdinput.c
View File

@@ -22,7 +22,7 @@
typedef struct { typedef struct {
struct jpeg_input_controller pub; /* public fields */ struct jpeg_input_controller pub; /* public fields */
boolean inheaders; /* TRUE until first SOS is reached */ int inheaders; /* Nonzero until first SOS is reached */
} my_input_controller; } my_input_controller;
typedef my_input_controller * my_inputctl_ptr; typedef my_input_controller * my_inputctl_ptr;
@@ -36,6 +36,174 @@ METHODDEF(int) consume_markers JPP((j_decompress_ptr cinfo));
* Routines to calculate various quantities related to the size of the image. * Routines to calculate various quantities related to the size of the image.
*/ */
/*
* Compute output image dimensions and related values.
* NOTE: this is exported for possible use by application.
* Hence it mustn't do anything that can't be done twice.
*/
GLOBAL(void)
jpeg_core_output_dimensions (j_decompress_ptr cinfo)
/* Do computations that are needed before master selection phase.
* This function is used for transcoding and full decompression.
*/
{
#ifdef IDCT_SCALING_SUPPORTED
int ci;
jpeg_component_info *compptr;
/* Compute actual output image dimensions and DCT scaling choices. */
if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom) {
/* Provide 1/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 1;
cinfo->min_DCT_v_scaled_size = 1;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 2) {
/* Provide 2/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 2L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 2L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 2;
cinfo->min_DCT_v_scaled_size = 2;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 3) {
/* Provide 3/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 3;
cinfo->min_DCT_v_scaled_size = 3;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 4) {
/* Provide 4/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 4L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 4L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 4;
cinfo->min_DCT_v_scaled_size = 4;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 5) {
/* Provide 5/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 5L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 5L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 5;
cinfo->min_DCT_v_scaled_size = 5;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 6) {
/* Provide 6/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 6L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 6L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 6;
cinfo->min_DCT_v_scaled_size = 6;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 7) {
/* Provide 7/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 7L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 7L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 7;
cinfo->min_DCT_v_scaled_size = 7;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 8) {
/* Provide 8/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 8L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 8L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 8;
cinfo->min_DCT_v_scaled_size = 8;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 9) {
/* Provide 9/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 9L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 9L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 9;
cinfo->min_DCT_v_scaled_size = 9;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 10) {
/* Provide 10/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 10L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 10L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 10;
cinfo->min_DCT_v_scaled_size = 10;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 11) {
/* Provide 11/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 11L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 11L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 11;
cinfo->min_DCT_v_scaled_size = 11;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 12) {
/* Provide 12/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 12L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 12L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 12;
cinfo->min_DCT_v_scaled_size = 12;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 13) {
/* Provide 13/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 13L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 13L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 13;
cinfo->min_DCT_v_scaled_size = 13;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 14) {
/* Provide 14/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 14L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 14L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 14;
cinfo->min_DCT_v_scaled_size = 14;
} else if (cinfo->scale_num * cinfo->block_size <= cinfo->scale_denom * 15) {
/* Provide 15/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 15L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 15L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 15;
cinfo->min_DCT_v_scaled_size = 15;
} else {
/* Provide 16/block_size scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 16L, (long) cinfo->block_size);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 16L, (long) cinfo->block_size);
cinfo->min_DCT_h_scaled_size = 16;
cinfo->min_DCT_v_scaled_size = 16;
}
/* Recompute dimensions of components */
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) {
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size;
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size;
}
#else /* !IDCT_SCALING_SUPPORTED */
/* Hardwire it to "no scaling" */
cinfo->output_width = cinfo->image_width;
cinfo->output_height = cinfo->image_height;
/* jdinput.c has already initialized DCT_scaled_size,
* and has computed unscaled downsampled_width and downsampled_height.
*/
#endif /* IDCT_SCALING_SUPPORTED */
}
LOCAL(void) LOCAL(void)
initial_setup (j_decompress_ptr cinfo) initial_setup (j_decompress_ptr cinfo)
/* Called once, when first SOS marker is reached */ /* Called once, when first SOS marker is reached */
@@ -71,25 +239,121 @@ initial_setup (j_decompress_ptr cinfo)
compptr->v_samp_factor); compptr->v_samp_factor);
} }
/* We initialize DCT_scaled_size and min_DCT_scaled_size to DCTSIZE. /* Derive block_size, natural_order, and lim_Se */
* In the full decompressor, this will be overridden by jdmaster.c; if (cinfo->is_baseline || (cinfo->progressive_mode &&
* but in the transcoder, jdmaster.c is not used, so we must do it here. cinfo->comps_in_scan)) { /* no pseudo SOS marker */
cinfo->block_size = DCTSIZE;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
} else
switch (cinfo->Se) {
case (1*1-1):
cinfo->block_size = 1;
cinfo->natural_order = jpeg_natural_order; /* not needed */
cinfo->lim_Se = cinfo->Se;
break;
case (2*2-1):
cinfo->block_size = 2;
cinfo->natural_order = jpeg_natural_order2;
cinfo->lim_Se = cinfo->Se;
break;
case (3*3-1):
cinfo->block_size = 3;
cinfo->natural_order = jpeg_natural_order3;
cinfo->lim_Se = cinfo->Se;
break;
case (4*4-1):
cinfo->block_size = 4;
cinfo->natural_order = jpeg_natural_order4;
cinfo->lim_Se = cinfo->Se;
break;
case (5*5-1):
cinfo->block_size = 5;
cinfo->natural_order = jpeg_natural_order5;
cinfo->lim_Se = cinfo->Se;
break;
case (6*6-1):
cinfo->block_size = 6;
cinfo->natural_order = jpeg_natural_order6;
cinfo->lim_Se = cinfo->Se;
break;
case (7*7-1):
cinfo->block_size = 7;
cinfo->natural_order = jpeg_natural_order7;
cinfo->lim_Se = cinfo->Se;
break;
case (8*8-1):
cinfo->block_size = 8;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (9*9-1):
cinfo->block_size = 9;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (10*10-1):
cinfo->block_size = 10;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (11*11-1):
cinfo->block_size = 11;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (12*12-1):
cinfo->block_size = 12;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (13*13-1):
cinfo->block_size = 13;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (14*14-1):
cinfo->block_size = 14;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (15*15-1):
cinfo->block_size = 15;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
case (16*16-1):
cinfo->block_size = 16;
cinfo->natural_order = jpeg_natural_order;
cinfo->lim_Se = DCTSIZE2-1;
break;
default:
ERREXIT4(cinfo, JERR_BAD_PROGRESSION,
cinfo->Ss, cinfo->Se, cinfo->Ah, cinfo->Al);
break;
}
/* We initialize DCT_scaled_size and min_DCT_scaled_size to block_size.
* In the full decompressor,
* this will be overridden by jpeg_calc_output_dimensions in jdmaster.c;
* but in the transcoder,
* jpeg_calc_output_dimensions is not used, so we must do it here.
*/ */
cinfo->min_DCT_h_scaled_size = DCTSIZE; cinfo->min_DCT_h_scaled_size = cinfo->block_size;
cinfo->min_DCT_v_scaled_size = DCTSIZE; cinfo->min_DCT_v_scaled_size = cinfo->block_size;
/* Compute dimensions of components */ /* Compute dimensions of components */
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components; for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
ci++, compptr++) { ci++, compptr++) {
compptr->DCT_h_scaled_size = DCTSIZE; compptr->DCT_h_scaled_size = cinfo->block_size;
compptr->DCT_v_scaled_size = DCTSIZE; compptr->DCT_v_scaled_size = cinfo->block_size;
/* Size in DCT blocks */ /* Size in DCT blocks */
compptr->width_in_blocks = (JDIMENSION) compptr->width_in_blocks = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor, jdiv_round_up((long) cinfo->image_width * (long) compptr->h_samp_factor,
(long) (cinfo->max_h_samp_factor * DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
compptr->height_in_blocks = (JDIMENSION) compptr->height_in_blocks = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor, jdiv_round_up((long) cinfo->image_height * (long) compptr->v_samp_factor,
(long) (cinfo->max_v_samp_factor * DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
/* downsampled_width and downsampled_height will also be overridden by /* downsampled_width and downsampled_height will also be overridden by
* jdmaster.c if we are doing full decompression. The transcoder library * jdmaster.c if we are doing full decompression. The transcoder library
* doesn't use these values, but the calling application might. * doesn't use these values, but the calling application might.
@@ -110,7 +374,7 @@ initial_setup (j_decompress_ptr cinfo)
/* Compute number of fully interleaved MCU rows. */ /* Compute number of fully interleaved MCU rows. */
cinfo->total_iMCU_rows = (JDIMENSION) cinfo->total_iMCU_rows = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, jdiv_round_up((long) cinfo->image_height,
(long) (cinfo->max_v_samp_factor*DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
/* Decide whether file contains multiple scans */ /* Decide whether file contains multiple scans */
if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode) if (cinfo->comps_in_scan < cinfo->num_components || cinfo->progressive_mode)
@@ -164,10 +428,10 @@ per_scan_setup (j_decompress_ptr cinfo)
/* Overall image size in MCUs */ /* Overall image size in MCUs */
cinfo->MCUs_per_row = (JDIMENSION) cinfo->MCUs_per_row = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, jdiv_round_up((long) cinfo->image_width,
(long) (cinfo->max_h_samp_factor*DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
cinfo->MCU_rows_in_scan = (JDIMENSION) cinfo->MCU_rows_in_scan = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, jdiv_round_up((long) cinfo->image_height,
(long) (cinfo->max_v_samp_factor*DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
cinfo->blocks_in_MCU = 0; cinfo->blocks_in_MCU = 0;
@@ -285,6 +549,10 @@ finish_input_pass (j_decompress_ptr cinfo)
* The consume_input method pointer points either here or to the * The consume_input method pointer points either here or to the
* coefficient controller's consume_data routine, depending on whether * coefficient controller's consume_data routine, depending on whether
* we are reading a compressed data segment or inter-segment markers. * we are reading a compressed data segment or inter-segment markers.
*
* Note: This function should NOT return a pseudo SOS marker (with zero
* component number) to the caller. A pseudo marker received by
* read_markers is processed and then skipped for other markers.
*/ */
METHODDEF(int) METHODDEF(int)
@@ -296,13 +564,19 @@ consume_markers (j_decompress_ptr cinfo)
if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */ if (inputctl->pub.eoi_reached) /* After hitting EOI, read no further */
return JPEG_REACHED_EOI; return JPEG_REACHED_EOI;
for (;;) { /* Loop to pass pseudo SOS marker */
val = (*cinfo->marker->read_markers) (cinfo); val = (*cinfo->marker->read_markers) (cinfo);
switch (val) { switch (val) {
case JPEG_REACHED_SOS: /* Found SOS */ case JPEG_REACHED_SOS: /* Found SOS */
if (inputctl->inheaders) { /* 1st SOS */ if (inputctl->inheaders) { /* 1st SOS */
if (inputctl->inheaders == 1)
initial_setup(cinfo); initial_setup(cinfo);
inputctl->inheaders = FALSE; if (cinfo->comps_in_scan == 0) { /* pseudo SOS marker */
inputctl->inheaders = 2;
break;
}
inputctl->inheaders = 0;
/* Note: start_input_pass must be called by jdmaster.c /* Note: start_input_pass must be called by jdmaster.c
* before any more input can be consumed. jdapimin.c is * before any more input can be consumed. jdapimin.c is
* responsible for enforcing this sequencing. * responsible for enforcing this sequencing.
@@ -310,9 +584,11 @@ consume_markers (j_decompress_ptr cinfo)
} else { /* 2nd or later SOS marker */ } else { /* 2nd or later SOS marker */
if (! inputctl->pub.has_multiple_scans) if (! inputctl->pub.has_multiple_scans)
ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */ ERREXIT(cinfo, JERR_EOI_EXPECTED); /* Oops, I wasn't expecting this! */
if (cinfo->comps_in_scan == 0) /* unexpected pseudo SOS marker */
break;
start_input_pass(cinfo); start_input_pass(cinfo);
} }
break; return val;
case JPEG_REACHED_EOI: /* Found EOI */ case JPEG_REACHED_EOI: /* Found EOI */
inputctl->pub.eoi_reached = TRUE; inputctl->pub.eoi_reached = TRUE;
if (inputctl->inheaders) { /* Tables-only datastream, apparently */ if (inputctl->inheaders) { /* Tables-only datastream, apparently */
@@ -325,12 +601,13 @@ consume_markers (j_decompress_ptr cinfo)
if (cinfo->output_scan_number > cinfo->input_scan_number) if (cinfo->output_scan_number > cinfo->input_scan_number)
cinfo->output_scan_number = cinfo->input_scan_number; cinfo->output_scan_number = cinfo->input_scan_number;
} }
break;
case JPEG_SUSPENDED:
break;
}
return val; return val;
case JPEG_SUSPENDED:
return val;
default:
return val;
}
}
} }
@@ -346,7 +623,7 @@ reset_input_controller (j_decompress_ptr cinfo)
inputctl->pub.consume_input = consume_markers; inputctl->pub.consume_input = consume_markers;
inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
inputctl->pub.eoi_reached = FALSE; inputctl->pub.eoi_reached = FALSE;
inputctl->inheaders = TRUE; inputctl->inheaders = 1;
/* Reset other modules */ /* Reset other modules */
(*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo); (*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
(*cinfo->marker->reset_marker_reader) (cinfo); (*cinfo->marker->reset_marker_reader) (cinfo);
@@ -380,5 +657,5 @@ jinit_input_controller (j_decompress_ptr cinfo)
*/ */
inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */ inputctl->pub.has_multiple_scans = FALSE; /* "unknown" would be better */
inputctl->pub.eoi_reached = FALSE; inputctl->pub.eoi_reached = FALSE;
inputctl->inheaders = TRUE; inputctl->inheaders = 1;
} }

View File

@@ -2,6 +2,7 @@
* jdmarker.c * jdmarker.c
* *
* Copyright (C) 1991-1998, Thomas G. Lane. * Copyright (C) 1991-1998, Thomas G. Lane.
* Modified 2009 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -234,7 +235,8 @@ get_soi (j_decompress_ptr cinfo)
LOCAL(boolean) LOCAL(boolean)
get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith) get_sof (j_decompress_ptr cinfo, boolean is_baseline, boolean is_prog,
boolean is_arith)
/* Process a SOFn marker */ /* Process a SOFn marker */
{ {
INT32 length; INT32 length;
@@ -242,6 +244,7 @@ get_sof (j_decompress_ptr cinfo, boolean is_prog, boolean is_arith)
jpeg_component_info * compptr; jpeg_component_info * compptr;
INPUT_VARS(cinfo); INPUT_VARS(cinfo);
cinfo->is_baseline = is_baseline;
cinfo->progressive_mode = is_prog; cinfo->progressive_mode = is_prog;
cinfo->arith_code = is_arith; cinfo->arith_code = is_arith;
@@ -315,7 +318,9 @@ get_sos (j_decompress_ptr cinfo)
TRACEMS1(cinfo, 1, JTRC_SOS, n); TRACEMS1(cinfo, 1, JTRC_SOS, n);
if (length != (n * 2 + 6) || n < 1 || n > MAX_COMPS_IN_SCAN) if (length != (n * 2 + 6) || n > MAX_COMPS_IN_SCAN ||
(n == 0 && !cinfo->progressive_mode))
/* pseudo SOS marker only allowed in progressive mode */
ERREXIT(cinfo, JERR_BAD_LENGTH); ERREXIT(cinfo, JERR_BAD_LENGTH);
cinfo->comps_in_scan = n; cinfo->comps_in_scan = n;
@@ -359,8 +364,8 @@ get_sos (j_decompress_ptr cinfo)
/* Prepare to scan data & restart markers */ /* Prepare to scan data & restart markers */
cinfo->marker->next_restart_num = 0; cinfo->marker->next_restart_num = 0;
/* Count another SOS marker */ /* Count another (non-pseudo) SOS marker */
cinfo->input_scan_number++; if (n) cinfo->input_scan_number++;
INPUT_SYNC(cinfo); INPUT_SYNC(cinfo);
return TRUE; return TRUE;
@@ -490,16 +495,18 @@ LOCAL(boolean)
get_dqt (j_decompress_ptr cinfo) get_dqt (j_decompress_ptr cinfo)
/* Process a DQT marker */ /* Process a DQT marker */
{ {
INT32 length; INT32 length, count, i;
int n, i, prec; int n, prec;
unsigned int tmp; unsigned int tmp;
JQUANT_TBL *quant_ptr; JQUANT_TBL *quant_ptr;
const int *natural_order;
INPUT_VARS(cinfo); INPUT_VARS(cinfo);
INPUT_2BYTES(cinfo, length, return FALSE); INPUT_2BYTES(cinfo, length, return FALSE);
length -= 2; length -= 2;
while (length > 0) { while (length > 0) {
length--;
INPUT_BYTE(cinfo, n, return FALSE); INPUT_BYTE(cinfo, n, return FALSE);
prec = n >> 4; prec = n >> 4;
n &= 0x0F; n &= 0x0F;
@@ -513,13 +520,43 @@ get_dqt (j_decompress_ptr cinfo)
cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo); cinfo->quant_tbl_ptrs[n] = jpeg_alloc_quant_table((j_common_ptr) cinfo);
quant_ptr = cinfo->quant_tbl_ptrs[n]; quant_ptr = cinfo->quant_tbl_ptrs[n];
if (prec) {
if (length < DCTSIZE2 * 2) {
/* Initialize full table for safety. */
for (i = 0; i < DCTSIZE2; i++) { for (i = 0; i < DCTSIZE2; i++) {
quant_ptr->quantval[i] = 1;
}
count = length >> 1;
} else
count = DCTSIZE2;
} else {
if (length < DCTSIZE2) {
/* Initialize full table for safety. */
for (i = 0; i < DCTSIZE2; i++) {
quant_ptr->quantval[i] = 1;
}
count = length;
} else
count = DCTSIZE2;
}
switch (count) {
case (2*2): natural_order = jpeg_natural_order2; break;
case (3*3): natural_order = jpeg_natural_order3; break;
case (4*4): natural_order = jpeg_natural_order4; break;
case (5*5): natural_order = jpeg_natural_order5; break;
case (6*6): natural_order = jpeg_natural_order6; break;
case (7*7): natural_order = jpeg_natural_order7; break;
default: natural_order = jpeg_natural_order; break;
}
for (i = 0; i < count; i++) {
if (prec) if (prec)
INPUT_2BYTES(cinfo, tmp, return FALSE); INPUT_2BYTES(cinfo, tmp, return FALSE);
else else
INPUT_BYTE(cinfo, tmp, return FALSE); INPUT_BYTE(cinfo, tmp, return FALSE);
/* We convert the zigzag-order table to natural array order. */ /* We convert the zigzag-order table to natural array order. */
quant_ptr->quantval[jpeg_natural_order[i]] = (UINT16) tmp; quant_ptr->quantval[natural_order[i]] = (UINT16) tmp;
} }
if (cinfo->err->trace_level >= 2) { if (cinfo->err->trace_level >= 2) {
@@ -532,8 +569,8 @@ get_dqt (j_decompress_ptr cinfo)
} }
} }
length -= DCTSIZE2+1; length -= count;
if (prec) length -= DCTSIZE2; if (prec) length -= count;
} }
if (length != 0) if (length != 0)
@@ -946,6 +983,11 @@ first_marker (j_decompress_ptr cinfo)
* *
* Returns same codes as are defined for jpeg_consume_input: * Returns same codes as are defined for jpeg_consume_input:
* JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI.
*
* Note: This function may return a pseudo SOS marker (with zero
* component number) for treat by input controller's consume_input.
* consume_input itself should filter out (skip) the pseudo marker
* after processing for the caller.
*/ */
METHODDEF(int) METHODDEF(int)
@@ -975,23 +1017,27 @@ read_markers (j_decompress_ptr cinfo)
break; break;
case M_SOF0: /* Baseline */ case M_SOF0: /* Baseline */
if (! get_sof(cinfo, TRUE, FALSE, FALSE))
return JPEG_SUSPENDED;
break;
case M_SOF1: /* Extended sequential, Huffman */ case M_SOF1: /* Extended sequential, Huffman */
if (! get_sof(cinfo, FALSE, FALSE)) if (! get_sof(cinfo, FALSE, FALSE, FALSE))
return JPEG_SUSPENDED; return JPEG_SUSPENDED;
break; break;
case M_SOF2: /* Progressive, Huffman */ case M_SOF2: /* Progressive, Huffman */
if (! get_sof(cinfo, TRUE, FALSE)) if (! get_sof(cinfo, FALSE, TRUE, FALSE))
return JPEG_SUSPENDED; return JPEG_SUSPENDED;
break; break;
case M_SOF9: /* Extended sequential, arithmetic */ case M_SOF9: /* Extended sequential, arithmetic */
if (! get_sof(cinfo, FALSE, TRUE)) if (! get_sof(cinfo, FALSE, FALSE, TRUE))
return JPEG_SUSPENDED; return JPEG_SUSPENDED;
break; break;
case M_SOF10: /* Progressive, arithmetic */ case M_SOF10: /* Progressive, arithmetic */
if (! get_sof(cinfo, TRUE, TRUE)) if (! get_sof(cinfo, FALSE, TRUE, TRUE))
return JPEG_SUSPENDED; return JPEG_SUSPENDED;
break; break;

View File

@@ -2,7 +2,7 @@
* jdmaster.c * jdmaster.c
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2002-2008 by Guido Vollbeding. * Modified 2002-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -86,7 +86,9 @@ use_merged_upsample (j_decompress_ptr cinfo)
GLOBAL(void) GLOBAL(void)
jpeg_calc_output_dimensions (j_decompress_ptr cinfo) jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
/* Do computations that are needed before master selection phase */ /* Do computations that are needed before master selection phase.
* This function is used for full decompression.
*/
{ {
#ifdef IDCT_SCALING_SUPPORTED #ifdef IDCT_SCALING_SUPPORTED
int ci; int ci;
@@ -97,134 +99,11 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
if (cinfo->global_state != DSTATE_READY) if (cinfo->global_state != DSTATE_READY)
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state); ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
/* Compute core output image dimensions and DCT scaling choices. */
jpeg_core_output_dimensions(cinfo);
#ifdef IDCT_SCALING_SUPPORTED #ifdef IDCT_SCALING_SUPPORTED
/* Compute actual output image dimensions and DCT scaling choices. */
if (cinfo->scale_num * 8 <= cinfo->scale_denom) {
/* Provide 1/8 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 8L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 8L);
cinfo->min_DCT_h_scaled_size = 1;
cinfo->min_DCT_v_scaled_size = 1;
} else if (cinfo->scale_num * 4 <= cinfo->scale_denom) {
/* Provide 1/4 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 4L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 4L);
cinfo->min_DCT_h_scaled_size = 2;
cinfo->min_DCT_v_scaled_size = 2;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 3) {
/* Provide 3/8 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3L, 8L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3L, 8L);
cinfo->min_DCT_h_scaled_size = 3;
cinfo->min_DCT_v_scaled_size = 3;
} else if (cinfo->scale_num * 2 <= cinfo->scale_denom) {
/* Provide 1/2 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 2L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 2L);
cinfo->min_DCT_h_scaled_size = 4;
cinfo->min_DCT_v_scaled_size = 4;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 5) {
/* Provide 5/8 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 5L, 8L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 5L, 8L);
cinfo->min_DCT_h_scaled_size = 5;
cinfo->min_DCT_v_scaled_size = 5;
} else if (cinfo->scale_num * 4 <= cinfo->scale_denom * 3) {
/* Provide 3/4 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3L, 4L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3L, 4L);
cinfo->min_DCT_h_scaled_size = 6;
cinfo->min_DCT_v_scaled_size = 6;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 7) {
/* Provide 7/8 scaling */
cinfo->output_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 7L, 8L);
cinfo->output_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 7L, 8L);
cinfo->min_DCT_h_scaled_size = 7;
cinfo->min_DCT_v_scaled_size = 7;
} else if (cinfo->scale_num <= cinfo->scale_denom) {
/* Provide 1/1 scaling */
cinfo->output_width = cinfo->image_width;
cinfo->output_height = cinfo->image_height;
cinfo->min_DCT_h_scaled_size = DCTSIZE;
cinfo->min_DCT_v_scaled_size = DCTSIZE;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 9) {
/* Provide 9/8 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 8L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 8L);
cinfo->min_DCT_h_scaled_size = 9;
cinfo->min_DCT_v_scaled_size = 9;
} else if (cinfo->scale_num * 4 <= cinfo->scale_denom * 5) {
/* Provide 5/4 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 4L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 4L);
cinfo->min_DCT_h_scaled_size = 10;
cinfo->min_DCT_v_scaled_size = 10;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 11) {
/* Provide 11/8 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3L, 8L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3L, 8L);
cinfo->min_DCT_h_scaled_size = 11;
cinfo->min_DCT_v_scaled_size = 11;
} else if (cinfo->scale_num * 2 <= cinfo->scale_denom * 3) {
/* Provide 3/2 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width, 2L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height, 2L);
cinfo->min_DCT_h_scaled_size = 12;
cinfo->min_DCT_v_scaled_size = 12;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 13) {
/* Provide 13/8 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 5L, 8L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 5L, 8L);
cinfo->min_DCT_h_scaled_size = 13;
cinfo->min_DCT_v_scaled_size = 13;
} else if (cinfo->scale_num * 4 <= cinfo->scale_denom * 7) {
/* Provide 7/4 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 3L, 4L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 3L, 4L);
cinfo->min_DCT_h_scaled_size = 14;
cinfo->min_DCT_v_scaled_size = 14;
} else if (cinfo->scale_num * 8 <= cinfo->scale_denom * 15) {
/* Provide 15/8 scaling */
cinfo->output_width = cinfo->image_width + (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * 7L, 8L);
cinfo->output_height = cinfo->image_height + (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * 7L, 8L);
cinfo->min_DCT_h_scaled_size = 15;
cinfo->min_DCT_v_scaled_size = 15;
} else {
/* Provide 2/1 scaling */
cinfo->output_width = cinfo->image_width << 1;
cinfo->output_height = cinfo->image_height << 1;
cinfo->min_DCT_h_scaled_size = 16;
cinfo->min_DCT_v_scaled_size = 16;
}
/* In selecting the actual DCT scaling for each component, we try to /* In selecting the actual DCT scaling for each component, we try to
* scale up the chroma components via IDCT scaling rather than upsampling. * scale up the chroma components via IDCT scaling rather than upsampling.
* This saves time if the upsampler gets to use 1:1 scaling. * This saves time if the upsampler gets to use 1:1 scaling.
@@ -263,22 +142,13 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
compptr->downsampled_width = (JDIMENSION) compptr->downsampled_width = (JDIMENSION)
jdiv_round_up((long) cinfo->image_width * jdiv_round_up((long) cinfo->image_width *
(long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size), (long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),
(long) (cinfo->max_h_samp_factor * DCTSIZE)); (long) (cinfo->max_h_samp_factor * cinfo->block_size));
compptr->downsampled_height = (JDIMENSION) compptr->downsampled_height = (JDIMENSION)
jdiv_round_up((long) cinfo->image_height * jdiv_round_up((long) cinfo->image_height *
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size), (long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
(long) (cinfo->max_v_samp_factor * DCTSIZE)); (long) (cinfo->max_v_samp_factor * cinfo->block_size));
} }
#else /* !IDCT_SCALING_SUPPORTED */
/* Hardwire it to "no scaling" */
cinfo->output_width = cinfo->image_width;
cinfo->output_height = cinfo->image_height;
/* jdinput.c has already initialized DCT_scaled_size to DCTSIZE,
* and has computed unscaled downsampled_width and downsampled_height.
*/
#endif /* IDCT_SCALING_SUPPORTED */ #endif /* IDCT_SCALING_SUPPORTED */
/* Report number of components in selected colorspace. */ /* Report number of components in selected colorspace. */
@@ -288,10 +158,8 @@ jpeg_calc_output_dimensions (j_decompress_ptr cinfo)
cinfo->out_color_components = 1; cinfo->out_color_components = 1;
break; break;
case JCS_RGB: case JCS_RGB:
#if RGB_PIXELSIZE != 3
cinfo->out_color_components = RGB_PIXELSIZE; cinfo->out_color_components = RGB_PIXELSIZE;
break; break;
#endif /* else share code with YCbCr */
case JCS_YCbCr: case JCS_YCbCr:
cinfo->out_color_components = 3; cinfo->out_color_components = 3;
break; break;
@@ -485,9 +353,9 @@ master_selection (j_decompress_ptr cinfo)
/* Inverse DCT */ /* Inverse DCT */
jinit_inverse_dct(cinfo); jinit_inverse_dct(cinfo);
/* Entropy decoding: either Huffman or arithmetic coding. */ /* Entropy decoding: either Huffman or arithmetic coding. */
if (cinfo->arith_code) { if (cinfo->arith_code)
jinit_arith_decoder(cinfo); jinit_arith_decoder(cinfo);
} else { else {
jinit_huff_decoder(cinfo); jinit_huff_decoder(cinfo);
} }

View File

@@ -2,6 +2,7 @@
* jdtrans.c * jdtrans.c
* *
* Copyright (C) 1995-1997, Thomas G. Lane. * Copyright (C) 1995-1997, Thomas G. Lane.
* Modified 2000-2009 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -99,6 +100,9 @@ transdecode_master_selection (j_decompress_ptr cinfo)
/* This is effectively a buffered-image operation. */ /* This is effectively a buffered-image operation. */
cinfo->buffered_image = TRUE; cinfo->buffered_image = TRUE;
/* Compute output image dimensions and related values. */
jpeg_core_output_dimensions(cinfo);
/* Entropy decoding: either Huffman or arithmetic coding. */ /* Entropy decoding: either Huffman or arithmetic coding. */
if (cinfo->arith_code) if (cinfo->arith_code)
jinit_arith_decoder(cinfo); jinit_arith_decoder(cinfo);

View File

@@ -2,6 +2,7 @@
* jidctflt.c * jidctflt.c
* *
* Copyright (C) 1994-1998, Thomas G. Lane. * Copyright (C) 1994-1998, Thomas G. Lane.
* Modified 2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -76,10 +77,9 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
FLOAT_MULT_TYPE * quantptr; FLOAT_MULT_TYPE * quantptr;
FAST_FLOAT * wsptr; FAST_FLOAT * wsptr;
JSAMPROW outptr; JSAMPROW outptr;
JSAMPLE *range_limit = IDCT_range_limit(cinfo); JSAMPLE *range_limit = cinfo->sample_range_limit;
int ctr; int ctr;
FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */ FAST_FLOAT workspace[DCTSIZE2]; /* buffers data between passes */
SHIFT_TEMPS
/* Pass 1: process columns from input, store into work array. */ /* Pass 1: process columns from input, store into work array. */
@@ -152,12 +152,12 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */ tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); /* 2*c4 */
z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */
tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */
tmp6 = tmp12 - tmp7; /* phase 2 */ tmp6 = tmp12 - tmp7; /* phase 2 */
tmp5 = tmp11 - tmp6; tmp5 = tmp11 - tmp6;
tmp4 = tmp10 + tmp5; tmp4 = tmp10 - tmp5;
wsptr[DCTSIZE*0] = tmp0 + tmp7; wsptr[DCTSIZE*0] = tmp0 + tmp7;
wsptr[DCTSIZE*7] = tmp0 - tmp7; wsptr[DCTSIZE*7] = tmp0 - tmp7;
@@ -165,8 +165,8 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
wsptr[DCTSIZE*6] = tmp1 - tmp6; wsptr[DCTSIZE*6] = tmp1 - tmp6;
wsptr[DCTSIZE*2] = tmp2 + tmp5; wsptr[DCTSIZE*2] = tmp2 + tmp5;
wsptr[DCTSIZE*5] = tmp2 - tmp5; wsptr[DCTSIZE*5] = tmp2 - tmp5;
wsptr[DCTSIZE*4] = tmp3 + tmp4; wsptr[DCTSIZE*3] = tmp3 + tmp4;
wsptr[DCTSIZE*3] = tmp3 - tmp4; wsptr[DCTSIZE*4] = tmp3 - tmp4;
inptr++; /* advance pointers to next column */ inptr++; /* advance pointers to next column */
quantptr++; quantptr++;
@@ -174,7 +174,6 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
} }
/* Pass 2: process rows from work array, store into output array. */ /* Pass 2: process rows from work array, store into output array. */
/* Note that we must descale the results by a factor of 8 == 2**3. */
wsptr = workspace; wsptr = workspace;
for (ctr = 0; ctr < DCTSIZE; ctr++) { for (ctr = 0; ctr < DCTSIZE; ctr++) {
@@ -187,8 +186,10 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
/* Even part */ /* Even part */
tmp10 = wsptr[0] + wsptr[4]; /* Apply signed->unsigned and prepare float->int conversion */
tmp11 = wsptr[0] - wsptr[4]; z5 = wsptr[0] + ((FAST_FLOAT) CENTERJSAMPLE + (FAST_FLOAT) 0.5);
tmp10 = z5 + wsptr[4];
tmp11 = z5 - wsptr[4];
tmp13 = wsptr[2] + wsptr[6]; tmp13 = wsptr[2] + wsptr[6];
tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13; tmp12 = (wsptr[2] - wsptr[6]) * ((FAST_FLOAT) 1.414213562) - tmp13;
@@ -209,31 +210,23 @@ jpeg_idct_float (j_decompress_ptr cinfo, jpeg_component_info * compptr,
tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562); tmp11 = (z11 - z13) * ((FAST_FLOAT) 1.414213562);
z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */ z5 = (z10 + z12) * ((FAST_FLOAT) 1.847759065); /* 2*c2 */
tmp10 = ((FAST_FLOAT) 1.082392200) * z12 - z5; /* 2*(c2-c6) */ tmp10 = z5 - z12 * ((FAST_FLOAT) 1.082392200); /* 2*(c2-c6) */
tmp12 = ((FAST_FLOAT) -2.613125930) * z10 + z5; /* -2*(c2+c6) */ tmp12 = z5 - z10 * ((FAST_FLOAT) 2.613125930); /* 2*(c2+c6) */
tmp6 = tmp12 - tmp7; tmp6 = tmp12 - tmp7;
tmp5 = tmp11 - tmp6; tmp5 = tmp11 - tmp6;
tmp4 = tmp10 + tmp5; tmp4 = tmp10 - tmp5;
/* Final output stage: scale down by a factor of 8 and range-limit */ /* Final output stage: float->int conversion and range-limit */
outptr[0] = range_limit[(int) DESCALE((INT32) (tmp0 + tmp7), 3) outptr[0] = range_limit[((int) (tmp0 + tmp7)) & RANGE_MASK];
& RANGE_MASK]; outptr[7] = range_limit[((int) (tmp0 - tmp7)) & RANGE_MASK];
outptr[7] = range_limit[(int) DESCALE((INT32) (tmp0 - tmp7), 3) outptr[1] = range_limit[((int) (tmp1 + tmp6)) & RANGE_MASK];
& RANGE_MASK]; outptr[6] = range_limit[((int) (tmp1 - tmp6)) & RANGE_MASK];
outptr[1] = range_limit[(int) DESCALE((INT32) (tmp1 + tmp6), 3) outptr[2] = range_limit[((int) (tmp2 + tmp5)) & RANGE_MASK];
& RANGE_MASK]; outptr[5] = range_limit[((int) (tmp2 - tmp5)) & RANGE_MASK];
outptr[6] = range_limit[(int) DESCALE((INT32) (tmp1 - tmp6), 3) outptr[3] = range_limit[((int) (tmp3 + tmp4)) & RANGE_MASK];
& RANGE_MASK]; outptr[4] = range_limit[((int) (tmp3 - tmp4)) & RANGE_MASK];
outptr[2] = range_limit[(int) DESCALE((INT32) (tmp2 + tmp5), 3)
& RANGE_MASK];
outptr[5] = range_limit[(int) DESCALE((INT32) (tmp2 - tmp5), 3)
& RANGE_MASK];
outptr[4] = range_limit[(int) DESCALE((INT32) (tmp3 + tmp4), 3)
& RANGE_MASK];
outptr[3] = range_limit[(int) DESCALE((INT32) (tmp3 - tmp4), 3)
& RANGE_MASK];
wsptr += DCTSIZE; /* advance pointer to next row */ wsptr += DCTSIZE; /* advance pointer to next row */
} }

View File

@@ -2,6 +2,7 @@
* jmemmgr.c * jmemmgr.c
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -821,7 +822,7 @@ access_virt_sarray (j_common_ptr cinfo, jvirt_sarray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row; end_row -= ptr->cur_start_row;
while (undef_row < end_row) { while (undef_row < end_row) {
jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++; undef_row++;
} }
} else { } else {
@@ -906,7 +907,7 @@ access_virt_barray (j_common_ptr cinfo, jvirt_barray_ptr ptr,
undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */ undef_row -= ptr->cur_start_row; /* make indexes relative to buffer */
end_row -= ptr->cur_start_row; end_row -= ptr->cur_start_row;
while (undef_row < end_row) { while (undef_row < end_row) {
jzero_far((void FAR *) ptr->mem_buffer[undef_row], bytesperrow); FMEMZERO((void FAR *) ptr->mem_buffer[undef_row], bytesperrow);
undef_row++; undef_row++;
} }
} else { } else {

View File

@@ -2,7 +2,7 @@
* jmorecfg.h * jmorecfg.h
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 1997-2009 by Guido Vollbeding. * Modified 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -160,11 +160,13 @@ typedef short INT16;
#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ #ifndef XMD_H /* X11/xmd.h correctly defines INT32 */
#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ #ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */
#ifndef _BASETSD_H /* MinGW is slightly different */
#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ #ifndef QGLOBAL_H /* Qt defines it in qglobal.h */
typedef long INT32; typedef long INT32;
#endif #endif
#endif #endif
#endif #endif
#endif
/* Datatype used for image dimensions. The JPEG standard only supports /* Datatype used for image dimensions. The JPEG standard only supports
* images up to 64K*64K due to 16-bit fields in SOF markers. Therefore * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore
@@ -310,9 +312,7 @@ typedef int boolean;
* the offsets will also change the order in which colormap data is organized. * the offsets will also change the order in which colormap data is organized.
* RESTRICTIONS: * RESTRICTIONS:
* 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats.
* 2. These macros only affect RGB<=>YCbCr color conversion, so they are not * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
* useful if you are using JPEG color spaces other than YCbCr or grayscale.
* 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE
* is not 3 (they don't understand about dummy color components!). So you * is not 3 (they don't understand about dummy color components!). So you
* can't use color quantization if you change that value. * can't use color quantization if you change that value.
*/ */

View File

@@ -2,7 +2,7 @@
* jpegint.h * jpegint.h
* *
* Copyright (C) 1991-1997, Thomas G. Lane. * Copyright (C) 1991-1997, Thomas G. Lane.
* Modified 1997-2009 by Guido Vollbeding. * Modified 1997-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -213,10 +213,6 @@ struct jpeg_entropy_decoder {
JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); JMETHOD(void, start_pass, (j_decompress_ptr cinfo));
JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo,
JBLOCKROW *MCU_data)); JBLOCKROW *MCU_data));
/* This is here to share code between baseline and progressive decoders; */
/* other modules probably should not use it */
boolean insufficient_data; /* set TRUE after emitting warning */
}; };
/* Inverse DCT (also performs dequantization) */ /* Inverse DCT (also performs dequantization) */
@@ -325,14 +321,41 @@ struct jpeg_color_quantizer {
#define jinit_memory_mgr jIMemMgr #define jinit_memory_mgr jIMemMgr
#define jdiv_round_up jDivRound #define jdiv_round_up jDivRound
#define jround_up jRound #define jround_up jRound
#define jzero_far jZeroFar
#define jcopy_sample_rows jCopySamples #define jcopy_sample_rows jCopySamples
#define jcopy_block_row jCopyBlocks #define jcopy_block_row jCopyBlocks
#define jzero_far jZeroFar
#define jpeg_zigzag_order jZIGTable #define jpeg_zigzag_order jZIGTable
#define jpeg_natural_order jZAGTable #define jpeg_natural_order jZAGTable
#define jpeg_natural_order7 jZAG7Table
#define jpeg_natural_order6 jZAG6Table
#define jpeg_natural_order5 jZAG5Table
#define jpeg_natural_order4 jZAG4Table
#define jpeg_natural_order3 jZAG3Table
#define jpeg_natural_order2 jZAG2Table
#define jpeg_aritab jAriTab
#endif /* NEED_SHORT_EXTERNAL_NAMES */ #endif /* NEED_SHORT_EXTERNAL_NAMES */
/* On normal machines we can apply MEMCOPY() and MEMZERO() to sample arrays
* and coefficient-block arrays. This won't work on 80x86 because the arrays
* are FAR and we're assuming a small-pointer memory model. However, some
* DOS compilers provide far-pointer versions of memcpy() and memset() even
* in the small-model libraries. These will be used if USE_FMEM is defined.
* Otherwise, the routines in jutils.c do it the hard way.
*/
#ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
#define FMEMZERO(target,size) MEMZERO(target,size)
#else /* 80x86 case */
#ifdef USE_FMEM
#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size))
#else
EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
#define FMEMZERO(target,size) jzero_far(target, size)
#endif
#endif
/* Compression module initialization routines */ /* Compression module initialization routines */
EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo));
EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo,
@@ -378,12 +401,20 @@ EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row,
int num_rows, JDIMENSION num_cols)); int num_rows, JDIMENSION num_cols));
EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row,
JDIMENSION num_blocks)); JDIMENSION num_blocks));
EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero));
/* Constant tables in jutils.c */ /* Constant tables in jutils.c */
#if 0 /* This table is not actually needed in v6a */ #if 0 /* This table is not actually needed in v6a */
extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */
#endif #endif
extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */
extern const int jpeg_natural_order7[]; /* zz to natural order for 7x7 block */
extern const int jpeg_natural_order6[]; /* zz to natural order for 6x6 block */
extern const int jpeg_natural_order5[]; /* zz to natural order for 5x5 block */
extern const int jpeg_natural_order4[]; /* zz to natural order for 4x4 block */
extern const int jpeg_natural_order3[]; /* zz to natural order for 3x3 block */
extern const int jpeg_natural_order2[]; /* zz to natural order for 2x2 block */
/* Arithmetic coding probability estimation tables in jaricom.c */
extern const INT32 jpeg_aritab[];
/* Suppress undefined-structure complaints if necessary. */ /* Suppress undefined-structure complaints if necessary. */

View File

@@ -2,7 +2,7 @@
* jpeglib.h * jpeglib.h
* *
* Copyright (C) 1991-1998, Thomas G. Lane. * Copyright (C) 1991-1998, Thomas G. Lane.
* Modified 2002-2009 by Guido Vollbeding. * Modified 2002-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -33,11 +33,13 @@ extern "C" {
#endif #endif
#endif #endif
/* Version ID for the JPEG library. /* Version IDs for the JPEG library.
* Might be useful for tests like "#if JPEG_LIB_VERSION >= 70". * Might be useful for tests like "#if JPEG_LIB_VERSION >= 80".
*/ */
#define JPEG_LIB_VERSION 70 /* Version 7.0 */ #define JPEG_LIB_VERSION 80 /* Compatibility version 8.0 */
#define JPEG_LIB_VERSION_MAJOR 8
#define JPEG_LIB_VERSION_MINOR 4
/* Various constants determining the sizes of things. /* Various constants determining the sizes of things.
@@ -45,7 +47,7 @@ extern "C" {
* if you want to be compatible. * if you want to be compatible.
*/ */
#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ #define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */
#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ #define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */
#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ #define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */
#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ #define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */
@@ -171,7 +173,7 @@ typedef struct {
int MCU_width; /* number of blocks per MCU, horizontally */ int MCU_width; /* number of blocks per MCU, horizontally */
int MCU_height; /* number of blocks per MCU, vertically */ int MCU_height; /* number of blocks per MCU, vertically */
int MCU_blocks; /* MCU_width * MCU_height */ int MCU_blocks; /* MCU_width * MCU_height */
int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */
int last_col_width; /* # of non-dummy blocks across in last MCU */ int last_col_width; /* # of non-dummy blocks across in last MCU */
int last_row_height; /* # of non-dummy blocks down in last MCU */ int last_row_height; /* # of non-dummy blocks down in last MCU */
@@ -414,6 +416,10 @@ struct jpeg_compress_struct {
int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
int block_size; /* the basic DCT block size: 1..16 */
const int * natural_order; /* natural-order position array */
int lim_Se; /* min( Se, DCTSIZE2-1 ) */
/* /*
* Links to compression subobjects (methods and private variables of modules) * Links to compression subobjects (methods and private variables of modules)
*/ */
@@ -560,6 +566,7 @@ struct jpeg_decompress_struct {
jpeg_component_info * comp_info; jpeg_component_info * comp_info;
/* comp_info[i] describes component that appears i'th in SOF */ /* comp_info[i] describes component that appears i'th in SOF */
boolean is_baseline; /* TRUE if Baseline SOF0 encountered */
boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */
boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */
@@ -633,6 +640,12 @@ struct jpeg_decompress_struct {
int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */
/* These fields are derived from Se of first SOS marker.
*/
int block_size; /* the basic DCT block size: 1..16 */
const int * natural_order; /* natural-order position array for entropy decode */
int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */
/* This field is shared between entropy decoder and marker parser. /* This field is shared between entropy decoder and marker parser.
* It is either zero or the code of a JPEG marker that has been * It is either zero or the code of a JPEG marker that has been
* read from the data source, but has not yet been processed. * read from the data source, but has not yet been processed.
@@ -862,6 +875,8 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
#define jpeg_destroy_decompress jDestDecompress #define jpeg_destroy_decompress jDestDecompress
#define jpeg_stdio_dest jStdDest #define jpeg_stdio_dest jStdDest
#define jpeg_stdio_src jStdSrc #define jpeg_stdio_src jStdSrc
#define jpeg_mem_dest jMemDest
#define jpeg_mem_src jMemSrc
#define jpeg_set_defaults jSetDefaults #define jpeg_set_defaults jSetDefaults
#define jpeg_set_colorspace jSetColorspace #define jpeg_set_colorspace jSetColorspace
#define jpeg_default_colorspace jDefColorspace #define jpeg_default_colorspace jDefColorspace
@@ -894,6 +909,7 @@ typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo));
#define jpeg_input_complete jInComplete #define jpeg_input_complete jInComplete
#define jpeg_new_colormap jNewCMap #define jpeg_new_colormap jNewCMap
#define jpeg_consume_input jConsumeInput #define jpeg_consume_input jConsumeInput
#define jpeg_core_output_dimensions jCoreDimensions
#define jpeg_calc_output_dimensions jCalcDimensions #define jpeg_calc_output_dimensions jCalcDimensions
#define jpeg_save_markers jSaveMarkers #define jpeg_save_markers jSaveMarkers
#define jpeg_set_marker_processor jSetMarker #define jpeg_set_marker_processor jSetMarker
@@ -938,6 +954,14 @@ EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo));
EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile));
EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile));
/* Data source and destination managers: memory buffers. */
EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo,
unsigned char ** outbuffer,
unsigned long * outsize));
EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo,
unsigned char * inbuffer,
unsigned long insize));
/* Default parameter setup for compression */ /* Default parameter setup for compression */
EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo));
/* Compression parameter setup aids */ /* Compression parameter setup aids */
@@ -1032,6 +1056,7 @@ EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo));
#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ #define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */
/* Precalculate output dimensions for current decompression parameters. */ /* Precalculate output dimensions for current decompression parameters. */
EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo));
EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo));
/* Control saving of COM and APPn markers into marker_list. */ /* Control saving of COM and APPn markers into marker_list. */

View File

@@ -1,4 +1,4 @@
.TH JPEGTRAN 1 "28 March 2009" .TH JPEGTRAN 1 "28 December 2009"
.SH NAME .SH NAME
jpegtran \- lossless transformation of JPEG files jpegtran \- lossless transformation of JPEG files
.SH SYNOPSIS .SH SYNOPSIS
@@ -165,7 +165,7 @@ The image can be losslessly cropped by giving the switch:
.B \-crop WxH+X+Y .B \-crop WxH+X+Y
Crop to a rectangular subarea of width W, height H starting at point X,Y. Crop to a rectangular subarea of width W, height H starting at point X,Y.
.PP .PP
Another not-strictly-lossless transformation switch is: Other not-strictly-lossless transformation switches are:
.TP .TP
.B \-grayscale .B \-grayscale
Force grayscale output. Force grayscale output.
@@ -178,6 +178,19 @@ is particularly handy for fixing a monochrome picture that was mistakenly
encoded as a color JPEG. (In such a case, the space savings from getting rid encoded as a color JPEG. (In such a case, the space savings from getting rid
of the near-empty chroma channels won't be large; but the decoding time for of the near-empty chroma channels won't be large; but the decoding time for
a grayscale JPEG is substantially less than that for a color JPEG.) a grayscale JPEG is substantially less than that for a color JPEG.)
.TP
.BI \-scale " M/N"
Scale the output image by a factor M/N.
.IP
Currently supported scale factors are M/N with all M from 1 to 16, where N is
the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted,
then M specifies the DCT scaled size to be applied on the given input. For
baseline JPEG this is equivalent to M/8 scaling, since the source DCT size
for baseline JPEG is 8.
.B Caution:
An implementation of the JPEG SmartScale extension is required for this
feature. SmartScale enabled JPEG is not yet widely implemented, so many
decoders will be unable to view a SmartScale extended JPEG file at all.
.PP .PP
.B jpegtran .B jpegtran
also recognizes these switches that control what to do with "extra" markers, also recognizes these switches that control what to do with "extra" markers,

View File

@@ -1,14 +1,14 @@
/* /*
* jpegtran.c * jpegtran.c
* *
* Copyright (C) 1995-2001, Thomas G. Lane. * Copyright (C) 1995-2011, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
* This file contains a command-line user interface for JPEG transcoding. * This file contains a command-line user interface for JPEG transcoding.
* It is very similar to cjpeg.c, but provides lossless transcoding between * It is very similar to cjpeg.c, and partly to djpeg.c, but provides
* different JPEG file formats. It also provides some lossless and sort-of- * lossless transcoding between different JPEG file formats. It also
* lossless transformations of JPEG data. * provides some lossless and sort-of-lossless transformations of JPEG data.
*/ */
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
@@ -37,6 +37,7 @@
static const char * progname; /* program name for error messages */ static const char * progname; /* program name for error messages */
static char * outfilename; /* for -outfile switch */ static char * outfilename; /* for -outfile switch */
static char * scaleoption; /* -scale switch */
static JCOPY_OPTION copyoption; /* -copy switch */ static JCOPY_OPTION copyoption; /* -copy switch */
static jpeg_transform_info transformoption; /* image transformation options */ static jpeg_transform_info transformoption; /* image transformation options */
@@ -62,26 +63,29 @@ usage (void)
#ifdef C_PROGRESSIVE_SUPPORTED #ifdef C_PROGRESSIVE_SUPPORTED
fprintf(stderr, " -progressive Create progressive JPEG file\n"); fprintf(stderr, " -progressive Create progressive JPEG file\n");
#endif #endif
#if TRANSFORMS_SUPPORTED
fprintf(stderr, "Switches for modifying the image:\n"); fprintf(stderr, "Switches for modifying the image:\n");
#if TRANSFORMS_SUPPORTED
fprintf(stderr, " -crop WxH+X+Y Crop to a rectangular subarea\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, " -grayscale Reduce to grayscale (omit color data)\n");
fprintf(stderr, " -flip [horizontal|vertical] Mirror image (left-right or top-bottom)\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, " -perfect Fail if there is non-transformable edge blocks\n");
fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n"); fprintf(stderr, " -rotate [90|180|270] Rotate image (degrees clockwise)\n");
#endif
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
#if TRANSFORMS_SUPPORTED
fprintf(stderr, " -transpose Transpose image\n"); fprintf(stderr, " -transpose Transpose image\n");
fprintf(stderr, " -transverse Transverse transpose image\n"); fprintf(stderr, " -transverse Transverse transpose image\n");
fprintf(stderr, " -trim Drop non-transformable edge blocks\n"); fprintf(stderr, " -trim Drop non-transformable edge blocks\n");
#endif /* TRANSFORMS_SUPPORTED */ #endif
fprintf(stderr, "Switches for advanced users:\n"); fprintf(stderr, "Switches for advanced users:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n"); fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n"); fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
fprintf(stderr, " -outfile name Specify name for output file\n"); fprintf(stderr, " -outfile name Specify name for output file\n");
fprintf(stderr, " -verbose or -debug Emit debug output\n"); fprintf(stderr, " -verbose or -debug Emit debug output\n");
fprintf(stderr, "Switches for wizards:\n"); fprintf(stderr, "Switches for wizards:\n");
#ifdef C_ARITH_CODING_SUPPORTED
fprintf(stderr, " -arithmetic Use arithmetic coding\n");
#endif
#ifdef C_MULTISCAN_FILES_SUPPORTED #ifdef C_MULTISCAN_FILES_SUPPORTED
fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n"); fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n");
#endif #endif
@@ -132,10 +136,11 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
/* Set up default JPEG parameters. */ /* Set up default JPEG parameters. */
simple_progressive = FALSE; simple_progressive = FALSE;
outfilename = NULL; outfilename = NULL;
scaleoption = NULL;
copyoption = JCOPYOPT_DEFAULT; copyoption = JCOPYOPT_DEFAULT;
transformoption.transform = JXFORM_NONE; transformoption.transform = JXFORM_NONE;
transformoption.trim = FALSE;
transformoption.perfect = FALSE; transformoption.perfect = FALSE;
transformoption.trim = FALSE;
transformoption.force_grayscale = FALSE; transformoption.force_grayscale = FALSE;
transformoption.crop = FALSE; transformoption.crop = FALSE;
cinfo->err->trace_level = 0; cinfo->err->trace_level = 0;
@@ -299,6 +304,13 @@ parse_switches (j_compress_ptr cinfo, int argc, char **argv,
else else
usage(); usage();
} else if (keymatch(arg, "scale", 4)) {
/* Scale the output image by a fraction M/N. */
if (++argn >= argc) /* advance to next argument */
usage();
scaleoption = argv[argn];
/* We must postpone processing until decompression startup. */
} else if (keymatch(arg, "scans", 1)) { } else if (keymatch(arg, "scans", 1)) {
/* Set scan script. */ /* Set scan script. */
#ifdef C_MULTISCAN_FILES_SUPPORTED #ifdef C_MULTISCAN_FILES_SUPPORTED
@@ -453,20 +465,22 @@ main (int argc, char **argv)
/* Read file header */ /* Read file header */
(void) jpeg_read_header(&srcinfo, TRUE); (void) jpeg_read_header(&srcinfo, TRUE);
/* Adjust default decompression parameters */
if (scaleoption != NULL)
if (sscanf(scaleoption, "%d/%d",
&srcinfo.scale_num, &srcinfo.scale_denom) < 1)
usage();
/* Any space needed by a transform option must be requested before /* Any space needed by a transform option must be requested before
* jpeg_read_coefficients so that memory allocation will be done right. * jpeg_read_coefficients so that memory allocation will be done right.
*/ */
#if TRANSFORMS_SUPPORTED #if TRANSFORMS_SUPPORTED
/* Fails right away if -perfect is given and transformation is not perfect. /* Fail right away if -perfect is given and transformation is not perfect.
*/ */
if (transformoption.perfect && if (!jtransform_request_workspace(&srcinfo, &transformoption)) {
!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); fprintf(stderr, "%s: transformation is not perfect\n", progname);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
jtransform_request_workspace(&srcinfo, &transformoption);
#endif #endif
/* Read source file as DCT coefficients */ /* Read source file as DCT coefficients */

View File

@@ -2,6 +2,7 @@
* jquant1.c * jquant1.c
* *
* Copyright (C) 1991-1996, Thomas G. Lane. * Copyright (C) 1991-1996, Thomas G. Lane.
* Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -530,7 +531,7 @@ quantize_ord_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) { for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */ /* Initialize output values to 0 so can process components separately */
jzero_far((void FAR *) output_buf[row], FMEMZERO((void FAR *) output_buf[row],
(size_t) (width * SIZEOF(JSAMPLE))); (size_t) (width * SIZEOF(JSAMPLE)));
row_index = cquantize->row_index; row_index = cquantize->row_index;
for (ci = 0; ci < nc; ci++) { for (ci = 0; ci < nc; ci++) {
@@ -635,7 +636,7 @@ quantize_fs_dither (j_decompress_ptr cinfo, JSAMPARRAY input_buf,
for (row = 0; row < num_rows; row++) { for (row = 0; row < num_rows; row++) {
/* Initialize output values to 0 so can process components separately */ /* Initialize output values to 0 so can process components separately */
jzero_far((void FAR *) output_buf[row], FMEMZERO((void FAR *) output_buf[row],
(size_t) (width * SIZEOF(JSAMPLE))); (size_t) (width * SIZEOF(JSAMPLE)));
for (ci = 0; ci < nc; ci++) { for (ci = 0; ci < nc; ci++) {
input_ptr = input_buf[row] + ci; input_ptr = input_buf[row] + ci;
@@ -781,7 +782,7 @@ start_pass_1_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Initialize the propagated errors to zero. */ /* Initialize the propagated errors to zero. */
arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR)); arraysize = (size_t) ((cinfo->output_width + 2) * SIZEOF(FSERROR));
for (i = 0; i < cinfo->out_color_components; i++) for (i = 0; i < cinfo->out_color_components; i++)
jzero_far((void FAR *) cquantize->fserrors[i], arraysize); FMEMZERO((void FAR *) cquantize->fserrors[i], arraysize);
break; break;
default: default:
ERREXIT(cinfo, JERR_NOT_COMPILED); ERREXIT(cinfo, JERR_NOT_COMPILED);

View File

@@ -2,6 +2,7 @@
* jquant2.c * jquant2.c
* *
* Copyright (C) 1991-1996, Thomas G. Lane. * Copyright (C) 1991-1996, Thomas G. Lane.
* Modified 2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -1203,7 +1204,7 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large) cquantize->fserrors = (FSERRPTR) (*cinfo->mem->alloc_large)
((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize); ((j_common_ptr) cinfo, JPOOL_IMAGE, arraysize);
/* Initialize the propagated errors to zero. */ /* Initialize the propagated errors to zero. */
jzero_far((void FAR *) cquantize->fserrors, arraysize); FMEMZERO((void FAR *) cquantize->fserrors, arraysize);
/* Make the error-limit table if we didn't already. */ /* Make the error-limit table if we didn't already. */
if (cquantize->error_limiter == NULL) if (cquantize->error_limiter == NULL)
init_error_limit(cinfo); init_error_limit(cinfo);
@@ -1214,7 +1215,7 @@ start_pass_2_quant (j_decompress_ptr cinfo, boolean is_pre_scan)
/* Zero the histogram or inverse color map, if necessary */ /* Zero the histogram or inverse color map, if necessary */
if (cquantize->needs_zeroed) { if (cquantize->needs_zeroed) {
for (i = 0; i < HIST_C0_ELEMS; i++) { for (i = 0; i < HIST_C0_ELEMS; i++) {
jzero_far((void FAR *) histogram[i], FMEMZERO((void FAR *) histogram[i],
HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell)); HIST_C1_ELEMS*HIST_C2_ELEMS * SIZEOF(histcell));
} }
cquantize->needs_zeroed = FALSE; cquantize->needs_zeroed = FALSE;

View File

@@ -2,6 +2,7 @@
* jutils.c * jutils.c
* *
* Copyright (C) 1991-1996, Thomas G. Lane. * Copyright (C) 1991-1996, Thomas G. Lane.
* Modified 2009-2011 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -63,6 +64,57 @@ const int jpeg_natural_order[DCTSIZE2+16] = {
63, 63, 63, 63, 63, 63, 63, 63 63, 63, 63, 63, 63, 63, 63, 63
}; };
const int jpeg_natural_order7[7*7+16] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 48, 41, 34,
27, 20, 13, 6, 14, 21, 28, 35,
42, 49, 50, 43, 36, 29, 22, 30,
37, 44, 51, 52, 45, 38, 46, 53,
54,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
const int jpeg_natural_order6[6*6+16] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 5,
12, 19, 26, 33, 40, 41, 34, 27,
20, 13, 21, 28, 35, 42, 43, 36,
29, 37, 44, 45,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
const int jpeg_natural_order5[5*5+16] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 32, 25, 18, 11, 4, 12,
19, 26, 33, 34, 27, 20, 28, 35,
36,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
const int jpeg_natural_order4[4*4+16] = {
0, 1, 8, 16, 9, 2, 3, 10,
17, 24, 25, 18, 11, 19, 26, 27,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
const int jpeg_natural_order3[3*3+16] = {
0, 1, 8, 16, 9, 2, 10, 17,
18,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
const int jpeg_natural_order2[2*2+16] = {
0, 1, 8, 9,
63, 63, 63, 63, 63, 63, 63, 63, /* extra entries for safety in decoder */
63, 63, 63, 63, 63, 63, 63, 63
};
/* /*
* Arithmetic utilities * Arithmetic utilities
@@ -96,13 +148,27 @@ jround_up (long a, long b)
* is not all that great, because these routines aren't very heavily used.) * is not all that great, because these routines aren't very heavily used.)
*/ */
#ifndef NEED_FAR_POINTERS /* normal case, same as regular macros */ #ifndef NEED_FAR_POINTERS /* normal case, same as regular macro */
#define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size) #define FMEMCOPY(dest,src,size) MEMCOPY(dest,src,size)
#define FMEMZERO(target,size) MEMZERO(target,size)
#else /* 80x86 case, define if we can */ #else /* 80x86 case, define if we can */
#ifdef USE_FMEM #ifdef USE_FMEM
#define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size)) #define FMEMCOPY(dest,src,size) _fmemcpy((void FAR *)(dest), (const void FAR *)(src), (size_t)(size))
#define FMEMZERO(target,size) _fmemset((void FAR *)(target), 0, (size_t)(size)) #else
/* This function is for use by the FMEMZERO macro defined in jpegint.h.
* Do not call this function directly, use the FMEMZERO macro instead.
*/
GLOBAL(void)
jzero_far (void FAR * target, size_t bytestozero)
/* Zero out a chunk of FAR memory. */
/* This might be sample-array data, block-array data, or alloc_large data. */
{
register char FAR * ptr = (char FAR *) target;
register size_t count;
for (count = bytestozero; count > 0; count--) {
*ptr++ = 0;
}
}
#endif #endif
#endif #endif
@@ -159,21 +225,3 @@ jcopy_block_row (JBLOCKROW input_row, JBLOCKROW output_row,
} }
#endif #endif
} }
GLOBAL(void)
jzero_far (void FAR * target, size_t bytestozero)
/* Zero out a chunk of FAR memory. */
/* This might be sample-array data, block-array data, or alloc_large data. */
{
#ifdef FMEMZERO
FMEMZERO(target, bytestozero);
#else
register char FAR * ptr = (char FAR *) target;
register size_t count;
for (count = bytestozero; count > 0; count--) {
*ptr++ = 0;
}
#endif
}

View File

@@ -1,7 +1,7 @@
/* /*
* jversion.h * jversion.h
* *
* Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. * Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -9,6 +9,6 @@
*/ */
#define JVERSION "7 27-Jun-2009" #define JVERSION "8d 15-Jan-2012"
#define JCOPYRIGHT "Copyright (C) 2009, Thomas G. Lane, Guido Vollbeding" #define JCOPYRIGHT "Copyright (C) 2012, Thomas G. Lane, Guido Vollbeding"

View File

@@ -1,4 +1,4 @@
LIBJPEG_7.0 { LIBJPEG_8.0 {
global: global:
*; *;
}; };

View File

@@ -1,6 +1,6 @@
USING THE IJG JPEG LIBRARY USING THE IJG JPEG LIBRARY
Copyright (C) 1994-2009, Thomas G. Lane, Guido Vollbeding. Copyright (C) 1994-2011, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software. This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file. For conditions of distribution and use, see the accompanying README file.
@@ -876,6 +876,18 @@ jpeg_simple_progression (j_compress_ptr cinfo)
Compression parameters (cinfo fields) include: Compression parameters (cinfo fields) include:
int block_size
Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
Larger values produce higher compression,
smaller values produce higher quality.
An exact DCT stage is possible with 1 or 2.
With the default quality of 75 and default Luminance qtable
the DCT+Quantization stage is lossless for value 1.
Note that values other than 8 require a SmartScale capable decoder,
introduced with IJG JPEG 8. Setting the block_size parameter for
compression works with version 8c and later.
J_DCT_METHOD dct_method J_DCT_METHOD dct_method
Selects the algorithm used for the DCT step. Choices are: Selects the algorithm used for the DCT step. Choices are:
JDCT_ISLOW: slow but accurate integer algorithm JDCT_ISLOW: slow but accurate integer algorithm
@@ -895,8 +907,10 @@ J_DCT_METHOD dct_method
unsigned int scale_num, scale_denom unsigned int scale_num, scale_denom
Scale the image by the fraction scale_num/scale_denom. Default is Scale the image by the fraction scale_num/scale_denom. Default is
1/1, or no scaling. Currently, the supported scaling ratios are 1/1, or no scaling. Currently, the supported scaling ratios are
8/N with all N from 1 to 16. (The library design allows for arbitrary M/N with all N from 1 to 16, where M is the destination DCT size,
scaling ratios but this is not likely to be implemented any time soon.) which is 8 by default (see block_size parameter above).
(The library design allows for arbitrary scaling ratios but this
is not likely to be implemented any time soon.)
J_COLOR_SPACE jpeg_color_space J_COLOR_SPACE jpeg_color_space
int num_components int num_components
@@ -1123,16 +1137,17 @@ J_COLOR_SPACE out_color_space
unsigned int scale_num, scale_denom unsigned int scale_num, scale_denom
Scale the image by the fraction scale_num/scale_denom. Currently, Scale the image by the fraction scale_num/scale_denom. Currently,
the supported scaling ratios are N/8 with all N from 1 to 16. (The the supported scaling ratios are M/N with all M from 1 to 16, where
library design allows for arbitrary scaling ratios but this is not N is the source DCT size, which is 8 for baseline JPEG. (The library
likely to be implemented any time soon.) The values are initialized design allows for arbitrary scaling ratios but this is not likely
by jpeg_read_header() with the source DCT size, which is currently to be implemented any time soon.) The values are initialized by
8/8. If you change only the scale_num value while leaving the other jpeg_read_header() with the source DCT size. For baseline JPEG
unchanged, then this specifies the DCT scaled size to be applied on this is 8/8. If you change only the scale_num value while leaving
the given input, which is currently equivalent to N/8 scaling, since the other unchanged, then this specifies the DCT scaled size to be
the source DCT size is currently always 8. Smaller scaling ratios applied on the given input. For baseline JPEG this is equivalent
permit significantly faster decoding since fewer pixels need be to M/8 scaling, since the source DCT size for baseline JPEG is 8.
processed and a simpler IDCT method can be used. Smaller scaling ratios permit significantly faster decoding since
fewer pixels need be processed and a simpler IDCT method can be used.
boolean quantize_colors boolean quantize_colors
If set TRUE, colormapped output will be delivered. Default is FALSE, If set TRUE, colormapped output will be delivered. Default is FALSE,
@@ -1295,8 +1310,9 @@ jpeg_read_header's guess by setting jpeg_color_space. jpeg_read_header also
selects a default output color space based on (its guess of) jpeg_color_space; selects a default output color space based on (its guess of) jpeg_color_space;
set out_color_space to override this. Again, you must select a supported set out_color_space to override this. Again, you must select a supported
transformation. jdcolor.c currently supports transformation. jdcolor.c currently supports
YCbCr => GRAYSCALE
YCbCr => RGB YCbCr => RGB
YCbCr => GRAYSCALE
RGB => GRAYSCALE
GRAYSCALE => RGB GRAYSCALE => RGB
YCCK => CMYK YCCK => CMYK
as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an as well as the null transforms. (Since GRAYSCALE=>RGB is provided, an
@@ -1432,21 +1448,22 @@ Compressed data handling (source and destination managers)
The JPEG compression library sends its compressed data to a "destination The JPEG compression library sends its compressed data to a "destination
manager" module. The default destination manager just writes the data to a manager" module. The default destination manager just writes the data to a
stdio stream, but you can provide your own manager to do something else. memory buffer or to a stdio stream, but you can provide your own manager to
Similarly, the decompression library calls a "source manager" to obtain the do something else. Similarly, the decompression library calls a "source
compressed data; you can provide your own source manager if you want the data manager" to obtain the compressed data; you can provide your own source
to come from somewhere other than a stdio stream. manager if you want the data to come from somewhere other than a memory
buffer or a stdio stream.
In both cases, compressed data is processed a bufferload at a time: the In both cases, compressed data is processed a bufferload at a time: the
destination or source manager provides a work buffer, and the library invokes destination or source manager provides a work buffer, and the library invokes
the manager only when the buffer is filled or emptied. (You could define a the manager only when the buffer is filled or emptied. (You could define a
one-character buffer to force the manager to be invoked for each byte, but one-character buffer to force the manager to be invoked for each byte, but
that would be rather inefficient.) The buffer's size and location are that would be rather inefficient.) The buffer's size and location are
controlled by the manager, not by the library. For example, if you desired to controlled by the manager, not by the library. For example, the memory
decompress a JPEG datastream that was all in memory, you could just make the source manager just makes the buffer pointer and length point to the original
buffer pointer and length point to the original data in memory. Then the data in memory. In this case the buffer-reload procedure will be invoked
buffer-reload procedure would be invoked only if the decompressor ran off the only if the decompressor ran off the end of the datastream, which would
end of the datastream, which would indicate an erroneous datastream. indicate an erroneous datastream.
The work buffer is defined as an array of datatype JOCTET, which is generally The work buffer is defined as an array of datatype JOCTET, which is generally
"char" or "unsigned char". On a machine where char is not exactly 8 bits "char" or "unsigned char". On a machine where char is not exactly 8 bits
@@ -1498,7 +1515,8 @@ You will also need code to create a jpeg_destination_mgr struct, fill in its
method pointers, and insert a pointer to the struct into the "dest" field of method pointers, and insert a pointer to the struct into the "dest" field of
the JPEG compression object. This can be done in-line in your setup code if the JPEG compression object. This can be done in-line in your setup code if
you like, but it's probably cleaner to provide a separate routine similar to you like, but it's probably cleaner to provide a separate routine similar to
the jpeg_stdio_dest() routine of the supplied destination manager. the jpeg_stdio_dest() or jpeg_mem_dest() routines of the supplied destination
managers.
Decompression source managers follow a parallel design, but with some Decompression source managers follow a parallel design, but with some
additional frammishes. The source manager struct contains a pointer and count additional frammishes. The source manager struct contains a pointer and count
@@ -1574,10 +1592,10 @@ You will also need code to create a jpeg_source_mgr struct, fill in its method
pointers, and insert a pointer to the struct into the "src" field of the JPEG pointers, and insert a pointer to the struct into the "src" field of the JPEG
decompression object. This can be done in-line in your setup code if you decompression object. This can be done in-line in your setup code if you
like, but it's probably cleaner to provide a separate routine similar to the like, but it's probably cleaner to provide a separate routine similar to the
jpeg_stdio_src() routine of the supplied source manager. jpeg_stdio_src() or jpeg_mem_src() routines of the supplied source managers.
For more information, consult the stdio source and destination managers For more information, consult the memory and stdio source and destination
in jdatasrc.c and jdatadst.c. managers in jdatasrc.c and jdatadst.c.
I/O suspension I/O suspension
@@ -2923,7 +2941,7 @@ Library compile-time options
A number of compile-time options are available by modifying jmorecfg.h. A number of compile-time options are available by modifying jmorecfg.h.
The JPEG standard provides for both the baseline 8-bit DCT process and The JPEG standard provides for both the baseline 8-bit DCT process and
a 12-bit DCT process. The IJG code supports 12-bit lossy JPEG if you define a 12-bit DCT process. The IJG code supports 12-bit JPEG if you define
BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be BITS_IN_JSAMPLE as 12 rather than 8. Note that this causes JSAMPLE to be
larger than a char, so it affects the surrounding application's image data. larger than a char, so it affects the surrounding application's image data.
The sample applications cjpeg and djpeg can support 12-bit mode only for PPM The sample applications cjpeg and djpeg can support 12-bit mode only for PPM

3853
ltmain.sh Executable file → Normal file

File diff suppressed because it is too large Load Diff

33
makeasln.v10 Normal file
View File

@@ -0,0 +1,33 @@
<EFBFBD><EFBFBD><EFBFBD>
Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C++ Express 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cjpeg", "cjpeg.vcxproj", "{2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "djpeg", "djpeg.vcxproj", "{11043137-B453-4DFA-9010-4D2B9DC1545C}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegtran", "jpegtran.vcxproj", "{025BAC50-51B5-4FFE-BC47-3F920BB4047E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rdjpgcom", "rdjpgcom.vcxproj", "{C81513DB-78DC-46BC-BC98-82E745203976}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wrjpgcom", "wrjpgcom.vcxproj", "{B57065D4-DDDA-4668-BAF5-2D49270C973C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}.Release|Win32.ActiveCfg = Release|Win32
{2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}.Release|Win32.Build.0 = Release|Win32
{11043137-B453-4DFA-9010-4D2B9DC1545C}.Release|Win32.ActiveCfg = Release|Win32
{11043137-B453-4DFA-9010-4D2B9DC1545C}.Release|Win32.Build.0 = Release|Win32
{025BAC50-51B5-4FFE-BC47-3F920BB4047E}.Release|Win32.ActiveCfg = Release|Win32
{025BAC50-51B5-4FFE-BC47-3F920BB4047E}.Release|Win32.Build.0 = Release|Win32
{C81513DB-78DC-46BC-BC98-82E745203976}.Release|Win32.ActiveCfg = Release|Win32
{C81513DB-78DC-46BC-BC98-82E745203976}.Release|Win32.Build.0 = Release|Win32
{B57065D4-DDDA-4668-BAF5-2D49270C973C}.Release|Win32.ActiveCfg = Release|Win32
{B57065D4-DDDA-4668-BAF5-2D49270C973C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -1,33 +0,0 @@
<EFBFBD><EFBFBD><EFBFBD>
Microsoft Visual Studio Solution File, Format Version 10.00
# Visual C++ Express 2008
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cjpeg", "cjpeg.vcproj", "{B4F61778-C45D-45C6-9E87-06F03F50519F}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "djpeg", "djpeg.vcproj", "{9B7E57AE-31CD-405E-8070-26A8303B9DC9}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpegtran", "jpegtran.vcproj", "{813C33AF-9031-49D2-BA19-93D600CDD404}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "rdjpgcom", "rdjpgcom.vcproj", "{EB107F86-A8CC-4507-8115-88D31DDE4CDF}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "wrjpgcom", "wrjpgcom.vcproj", "{178670D7-FA7F-44A8-96C7-11B1CA14269C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B4F61778-C45D-45C6-9E87-06F03F50519F}.Release|Win32.ActiveCfg = Release|Win32
{B4F61778-C45D-45C6-9E87-06F03F50519F}.Release|Win32.Build.0 = Release|Win32
{9B7E57AE-31CD-405E-8070-26A8303B9DC9}.Release|Win32.ActiveCfg = Release|Win32
{9B7E57AE-31CD-405E-8070-26A8303B9DC9}.Release|Win32.Build.0 = Release|Win32
{813C33AF-9031-49D2-BA19-93D600CDD404}.Release|Win32.ActiveCfg = Release|Win32
{813C33AF-9031-49D2-BA19-93D600CDD404}.Release|Win32.Build.0 = Release|Win32
{EB107F86-A8CC-4507-8115-88D31DDE4CDF}.Release|Win32.ActiveCfg = Release|Win32
{EB107F86-A8CC-4507-8115-88D31DDE4CDF}.Release|Win32.Build.0 = Release|Win32
{178670D7-FA7F-44A8-96C7-11B1CA14269C}.Release|Win32.ActiveCfg = Release|Win32
{178670D7-FA7F-44A8-96C7-11B1CA14269C}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

69
makecfil.v10 Normal file
View File

@@ -0,0 +1,69 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="cderror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="cdjpeg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jerror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jmorecfg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpeglib.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jversion.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="cjpeg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdbmp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdgif.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdppm.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdrle.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdswitch.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdtarga.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,186 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="cjpeg"
ProjectGUID="{B4F61778-C45D-45C6-9E87-06F03F50519F}"
RootNamespace="cjpeg"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Release\jpeg.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\cdjpeg.c"
>
</File>
<File
RelativePath=".\cjpeg.c"
>
</File>
<File
RelativePath=".\rdbmp.c"
>
</File>
<File
RelativePath=".\rdgif.c"
>
</File>
<File
RelativePath=".\rdppm.c"
>
</File>
<File
RelativePath=".\rdrle.c"
>
</File>
<File
RelativePath=".\rdswitch.c"
>
</File>
<File
RelativePath=".\rdtarga.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\cderror.h"
>
</File>
<File
RelativePath=".\cdjpeg.h"
>
</File>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jerror.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
<File
RelativePath=".\jmorecfg.h"
>
</File>
<File
RelativePath=".\jpeglib.h"
>
</File>
<File
RelativePath=".\jversion.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

76
makecvcx.v10 Normal file
View File

@@ -0,0 +1,76 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{2E7FAAD9-2F58-4BDE-81F2-1D6D3FB8BF57}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>cjpeg</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="cderror.h" />
<ClInclude Include="cdjpeg.h" />
<ClInclude Include="jconfig.h" />
<ClInclude Include="jerror.h" />
<ClInclude Include="jinclude.h" />
<ClInclude Include="jmorecfg.h" />
<ClInclude Include="jpeglib.h" />
<ClInclude Include="jversion.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c" />
<ClCompile Include="cjpeg.c" />
<ClCompile Include="rdbmp.c" />
<ClCompile Include="rdgif.c" />
<ClCompile Include="rdppm.c" />
<ClCompile Include="rdrle.c" />
<ClCompile Include="rdswitch.c" />
<ClCompile Include="rdtarga.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

69
makedfil.v10 Normal file
View File

@@ -0,0 +1,69 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="cderror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="cdjpeg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jerror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jmorecfg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpeglib.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jversion.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="djpeg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdcolmap.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="wrbmp.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="wrgif.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="wrppm.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="wrrle.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="wrtarga.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,186 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="djpeg"
ProjectGUID="{9B7E57AE-31CD-405E-8070-26A8303B9DC9}"
RootNamespace="djpeg"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Release\jpeg.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\cdjpeg.c"
>
</File>
<File
RelativePath=".\djpeg.c"
>
</File>
<File
RelativePath=".\rdcolmap.c"
>
</File>
<File
RelativePath=".\wrbmp.c"
>
</File>
<File
RelativePath=".\wrgif.c"
>
</File>
<File
RelativePath=".\wrppm.c"
>
</File>
<File
RelativePath=".\wrrle.c"
>
</File>
<File
RelativePath=".\wrtarga.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\cderror.h"
>
</File>
<File
RelativePath=".\cdjpeg.h"
>
</File>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jerror.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
<File
RelativePath=".\jmorecfg.h"
>
</File>
<File
RelativePath=".\jpeglib.h"
>
</File>
<File
RelativePath=".\jversion.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

76
makedvcx.v10 Normal file
View File

@@ -0,0 +1,76 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{11043137-B453-4DFA-9010-4D2B9DC1545C}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>djpeg</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="cderror.h" />
<ClInclude Include="cdjpeg.h" />
<ClInclude Include="jconfig.h" />
<ClInclude Include="jerror.h" />
<ClInclude Include="jinclude.h" />
<ClInclude Include="jmorecfg.h" />
<ClInclude Include="jpeglib.h" />
<ClInclude Include="jversion.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c" />
<ClCompile Include="djpeg.c" />
<ClCompile Include="rdcolmap.c" />
<ClCompile Include="wrbmp.c" />
<ClCompile Include="wrgif.c" />
<ClCompile Include="wrppm.c" />
<ClCompile Include="wrrle.c" />
<ClCompile Include="wrtarga.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@@ -65,11 +65,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -92,11 +92,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -65,11 +65,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -66,11 +66,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -63,11 +63,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -52,11 +52,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -74,11 +74,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -69,11 +69,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms

View File

@@ -62,11 +62,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \ makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \ makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \ maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 \ makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 \ makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st \ makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms \ makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \ CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \ jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
jconfig.vms jconfig.vms
@@ -130,8 +131,48 @@ clean:
$(RM) *.obj *.exe libjpeg.lib $(RM) *.obj *.exe libjpeg.lib
$(RM) testout* $(RM) testout*
test: cjpeg.exe djpeg.exe jpegtran.exe setup-vc6:
$(RM) testout* ren jconfig.vc jconfig.h
ren makejdsw.vc6 jpeg.dsw
ren makeadsw.vc6 apps.dsw
ren makejmak.vc6 jpeg.mak
ren makejdep.vc6 jpeg.dep
ren makejdsp.vc6 jpeg.dsp
ren makecmak.vc6 cjpeg.mak
ren makecdep.vc6 cjpeg.dep
ren makecdsp.vc6 cjpeg.dsp
ren makedmak.vc6 djpeg.mak
ren makeddep.vc6 djpeg.dep
ren makeddsp.vc6 djpeg.dsp
ren maketmak.vc6 jpegtran.mak
ren maketdep.vc6 jpegtran.dep
ren maketdsp.vc6 jpegtran.dsp
ren makermak.vc6 rdjpgcom.mak
ren makerdep.vc6 rdjpgcom.dep
ren makerdsp.vc6 rdjpgcom.dsp
ren makewmak.vc6 wrjpgcom.mak
ren makewdep.vc6 wrjpgcom.dep
ren makewdsp.vc6 wrjpgcom.dsp
setup-v10:
ren jconfig.vc jconfig.h
ren makejsln.v10 jpeg.sln
ren makeasln.v10 apps.sln
ren makejvcx.v10 jpeg.vcxproj
ren makejfil.v10 jpeg.vcxproj.filters
ren makecvcx.v10 cjpeg.vcxproj
ren makecfil.v10 cjpeg.vcxproj.filters
ren makedvcx.v10 djpeg.vcxproj
ren makedfil.v10 djpeg.vcxproj.filters
ren maketvcx.v10 jpegtran.vcxproj
ren maketfil.v10 jpegtran.vcxproj.filters
ren makervcx.v10 rdjpgcom.vcxproj
ren makerfil.v10 rdjpgcom.vcxproj.filters
ren makewvcx.v10 wrjpgcom.vcxproj
ren makewfil.v10 wrjpgcom.vcxproj.filters
test:
IF EXIST testout* $(RM) testout*
.\djpeg -dct int -ppm -outfile testout.ppm testorig.jpg .\djpeg -dct int -ppm -outfile testout.ppm testorig.jpg
.\djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg .\djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg
.\cjpeg -dct int -outfile testout.jpg testimg.ppm .\cjpeg -dct int -outfile testout.jpg testimg.ppm
@@ -145,6 +186,21 @@ test: cjpeg.exe djpeg.exe jpegtran.exe
fc /b testimgp.jpg testoutp.jpg fc /b testimgp.jpg testoutp.jpg
fc /b testorig.jpg testoutt.jpg fc /b testorig.jpg testoutt.jpg
test-build:
IF EXIST testout* $(RM) testout*
.\djpeg\Release\djpeg -dct int -ppm -outfile testout.ppm testorig.jpg
.\djpeg\Release\djpeg -dct int -bmp -colors 256 -outfile testout.bmp testorig.jpg
.\cjpeg\Release\cjpeg -dct int -outfile testout.jpg testimg.ppm
.\djpeg\Release\djpeg -dct int -ppm -outfile testoutp.ppm testprog.jpg
.\cjpeg\Release\cjpeg -dct int -progressive -opt -outfile testoutp.jpg testimg.ppm
.\jpegtran\Release\jpegtran -outfile testoutt.jpg testprog.jpg
fc /b testimg.ppm testout.ppm
fc /b testimg.bmp testout.bmp
fc /b testimg.jpg testout.jpg
fc /b testimg.ppm testoutp.ppm
fc /b testimgp.jpg testoutp.jpg
fc /b testorig.jpg testoutt.jpg
jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jaricom.obj: jaricom.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h
jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h jcapimin.obj: jcapimin.c jinclude.h jconfig.h jpeglib.h jmorecfg.h jpegint.h jerror.h

View File

@@ -64,11 +64,12 @@ MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc &
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 & makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 &
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 & makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 &
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 & maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 &
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.vc9 & makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 &
makeasln.vc9 makejvcp.vc9 makecvcp.vc9 makedvcp.vc9 maketvcp.vc9 & makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 &
makervcp.vc9 makewvcp.vc9 makeproj.mac makcjpeg.st makdjpeg.st & makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 &
makljpeg.st maktjpeg.st makefile.manx makefile.sas makefile.mms & makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st &
makefile.vms makvms.opt makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas &
makefile.mms makefile.vms makvms.opt
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat & CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat &
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas & jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas &
jconfig.vms jconfig.vms

186
makejfil.v10 Normal file
View File

@@ -0,0 +1,186 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jdct.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jerror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jmemsys.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jmorecfg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpegint.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpeglib.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jversion.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="jaricom.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcapimin.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcapistd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcarith.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jccoefct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jccolor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcdctmgr.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jchuff.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcinit.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcmainct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcmarker.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcmaster.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcomapi.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcparam.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcprepct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jcsample.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jctrans.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdapimin.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdapistd.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdarith.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdatadst.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdatasrc.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdcoefct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdcolor.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jddctmgr.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdhuff.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdinput.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdmainct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdmarker.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdmaster.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdmerge.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdpostct.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdsample.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jdtrans.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jerror.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jfdctflt.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jfdctfst.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jfdctint.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jidctflt.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jidctfst.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jidctint.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jmemmgr.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jmemnobs.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jquant1.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jquant2.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jutils.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,15 +1,15 @@
‹¯¨ ‹¯¨
Microsoft Visual Studio Solution File, Format Version 10.00 Microsoft Visual Studio Solution File, Format Version 11.00
# Visual C++ Express 2008 # Visual C++ Express 2010
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcproj", "{E61592E1-28F4-4AFC-9EE1-9BE833A061C1}" Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}"
EndProject EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|Win32 = Release|Win32 Release|Win32 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution GlobalSection(ProjectConfigurationPlatforms) = postSolution
{E61592E1-28F4-4AFC-9EE1-9BE833A061C1}.Release|Win32.ActiveCfg = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.ActiveCfg = Release|Win32
{E61592E1-28F4-4AFC-9EE1-9BE833A061C1}.Release|Win32.Build.0 = Release|Win32 {019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE

View File

@@ -1,328 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="jpeg"
ProjectGUID="{E61592E1-28F4-4AFC-9EE1-9BE833A061C1}"
RootNamespace="jpeg"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(SolutionDir)$(ConfigurationName)"
IntermediateDirectory="$(ConfigurationName)"
ConfigurationType="4"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\jaricom.c"
>
</File>
<File
RelativePath=".\jcapimin.c"
>
</File>
<File
RelativePath=".\jcapistd.c"
>
</File>
<File
RelativePath=".\jcarith.c"
>
</File>
<File
RelativePath=".\jccoefct.c"
>
</File>
<File
RelativePath=".\jccolor.c"
>
</File>
<File
RelativePath=".\jcdctmgr.c"
>
</File>
<File
RelativePath=".\jchuff.c"
>
</File>
<File
RelativePath=".\jcinit.c"
>
</File>
<File
RelativePath=".\jcmainct.c"
>
</File>
<File
RelativePath=".\jcmarker.c"
>
</File>
<File
RelativePath=".\jcmaster.c"
>
</File>
<File
RelativePath=".\jcomapi.c"
>
</File>
<File
RelativePath=".\jcparam.c"
>
</File>
<File
RelativePath=".\jcprepct.c"
>
</File>
<File
RelativePath=".\jcsample.c"
>
</File>
<File
RelativePath=".\jctrans.c"
>
</File>
<File
RelativePath=".\jdapimin.c"
>
</File>
<File
RelativePath=".\jdapistd.c"
>
</File>
<File
RelativePath=".\jdarith.c"
>
</File>
<File
RelativePath=".\jdatadst.c"
>
</File>
<File
RelativePath=".\jdatasrc.c"
>
</File>
<File
RelativePath=".\jdcoefct.c"
>
</File>
<File
RelativePath=".\jdcolor.c"
>
</File>
<File
RelativePath=".\jddctmgr.c"
>
</File>
<File
RelativePath=".\jdhuff.c"
>
</File>
<File
RelativePath=".\jdinput.c"
>
</File>
<File
RelativePath=".\jdmainct.c"
>
</File>
<File
RelativePath=".\jdmarker.c"
>
</File>
<File
RelativePath=".\jdmaster.c"
>
</File>
<File
RelativePath=".\jdmerge.c"
>
</File>
<File
RelativePath=".\jdpostct.c"
>
</File>
<File
RelativePath=".\jdsample.c"
>
</File>
<File
RelativePath=".\jdtrans.c"
>
</File>
<File
RelativePath=".\jerror.c"
>
</File>
<File
RelativePath=".\jfdctflt.c"
>
</File>
<File
RelativePath=".\jfdctfst.c"
>
</File>
<File
RelativePath=".\jfdctint.c"
>
</File>
<File
RelativePath=".\jidctflt.c"
>
</File>
<File
RelativePath=".\jidctfst.c"
>
</File>
<File
RelativePath=".\jidctint.c"
>
</File>
<File
RelativePath=".\jmemmgr.c"
>
</File>
<File
RelativePath=".\jmemnobs.c"
>
</File>
<File
RelativePath=".\jquant1.c"
>
</File>
<File
RelativePath=".\jquant2.c"
>
</File>
<File
RelativePath=".\jutils.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jdct.h"
>
</File>
<File
RelativePath=".\jerror.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
<File
RelativePath=".\jmemsys.h"
>
</File>
<File
RelativePath=".\jmorecfg.h"
>
</File>
<File
RelativePath=".\jpegint.h"
>
</File>
<File
RelativePath=".\jpeglib.h"
>
</File>
<File
RelativePath=".\jversion.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

112
makejvcx.v10 Normal file
View File

@@ -0,0 +1,112 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClInclude Include="jconfig.h" />
<ClInclude Include="jdct.h" />
<ClInclude Include="jerror.h" />
<ClInclude Include="jinclude.h" />
<ClInclude Include="jmemsys.h" />
<ClInclude Include="jmorecfg.h" />
<ClInclude Include="jpegint.h" />
<ClInclude Include="jpeglib.h" />
<ClInclude Include="jversion.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="jaricom.c" />
<ClCompile Include="jcapimin.c" />
<ClCompile Include="jcapistd.c" />
<ClCompile Include="jcarith.c" />
<ClCompile Include="jccoefct.c" />
<ClCompile Include="jccolor.c" />
<ClCompile Include="jcdctmgr.c" />
<ClCompile Include="jchuff.c" />
<ClCompile Include="jcinit.c" />
<ClCompile Include="jcmainct.c" />
<ClCompile Include="jcmarker.c" />
<ClCompile Include="jcmaster.c" />
<ClCompile Include="jcomapi.c" />
<ClCompile Include="jcparam.c" />
<ClCompile Include="jcprepct.c" />
<ClCompile Include="jcsample.c" />
<ClCompile Include="jctrans.c" />
<ClCompile Include="jdapimin.c" />
<ClCompile Include="jdapistd.c" />
<ClCompile Include="jdarith.c" />
<ClCompile Include="jdatadst.c" />
<ClCompile Include="jdatasrc.c" />
<ClCompile Include="jdcoefct.c" />
<ClCompile Include="jdcolor.c" />
<ClCompile Include="jddctmgr.c" />
<ClCompile Include="jdhuff.c" />
<ClCompile Include="jdinput.c" />
<ClCompile Include="jdmainct.c" />
<ClCompile Include="jdmarker.c" />
<ClCompile Include="jdmaster.c" />
<ClCompile Include="jdmerge.c" />
<ClCompile Include="jdpostct.c" />
<ClCompile Include="jdsample.c" />
<ClCompile Include="jdtrans.c" />
<ClCompile Include="jerror.c" />
<ClCompile Include="jfdctflt.c" />
<ClCompile Include="jfdctfst.c" />
<ClCompile Include="jfdctint.c" />
<ClCompile Include="jidctflt.c" />
<ClCompile Include="jidctfst.c" />
<ClCompile Include="jidctint.c" />
<ClCompile Include="jmemmgr.c" />
<ClCompile Include="jmemnobs.c" />
<ClCompile Include="jquant1.c" />
<ClCompile Include="jquant2.c">
<Optimization Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Disabled</Optimization>
<BufferSecurityCheck Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</BufferSecurityCheck>
</ClCompile>
<ClCompile Include="jutils.c" />
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{019DBD2A-273D-4BA4-BF86-B5EFE2ED76B1}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>jpeg</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_LIB;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

30
makerfil.v10 Normal file
View File

@@ -0,0 +1,30 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="rdjpgcom.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,133 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="rdjpgcom"
ProjectGUID="{EB107F86-A8CC-4507-8115-88D31DDE4CDF}"
RootNamespace="rdjpgcom"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\rdjpgcom.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

62
makervcx.v10 Normal file
View File

@@ -0,0 +1,62 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{C81513DB-78DC-46BC-BC98-82E745203976}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>rdjpgcom</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="jconfig.h" />
<ClInclude Include="jinclude.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="rdjpgcom.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

63
maketfil.v10 Normal file
View File

@@ -0,0 +1,63 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="cderror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="cdjpeg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jerror.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jmorecfg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpegint.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jpeglib.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jversion.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="transupp.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="jpegtran.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="rdswitch.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="transupp.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,178 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="jpegtran"
ProjectGUID="{813C33AF-9031-49D2-BA19-93D600CDD404}"
RootNamespace="jpegtran"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
AdditionalDependencies="Release\jpeg.lib"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\cdjpeg.c"
>
</File>
<File
RelativePath=".\jpegtran.c"
>
</File>
<File
RelativePath=".\rdswitch.c"
>
</File>
<File
RelativePath=".\transupp.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\cderror.h"
>
</File>
<File
RelativePath=".\cdjpeg.h"
>
</File>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jerror.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
<File
RelativePath=".\jmorecfg.h"
>
</File>
<File
RelativePath=".\jpegint.h"
>
</File>
<File
RelativePath=".\jpeglib.h"
>
</File>
<File
RelativePath=".\jversion.h"
>
</File>
<File
RelativePath=".\transupp.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

74
maketvcx.v10 Normal file
View File

@@ -0,0 +1,74 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{025BAC50-51B5-4FFE-BC47-3F920BB4047E}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>jpegtran</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>Release\jpeg.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="cderror.h" />
<ClInclude Include="cdjpeg.h" />
<ClInclude Include="jconfig.h" />
<ClInclude Include="jerror.h" />
<ClInclude Include="jinclude.h" />
<ClInclude Include="jmorecfg.h" />
<ClInclude Include="jpegint.h" />
<ClInclude Include="jpeglib.h" />
<ClInclude Include="jversion.h" />
<ClInclude Include="transupp.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="cdjpeg.c" />
<ClCompile Include="jpegtran.c" />
<ClCompile Include="rdswitch.c" />
<ClCompile Include="transupp.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

30
makewfil.v10 Normal file
View File

@@ -0,0 +1,30 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="jconfig.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="jinclude.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="wrjpgcom.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@@ -1,133 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9,00"
Name="wrjpgcom"
ProjectGUID="{178670D7-FA7F-44A8-96C7-11B1CA14269C}"
RootNamespace="wrjpgcom"
Keyword="Win32Proj"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Release|Win32"
OutputDirectory="$(ProjectName)\$(ConfigurationName)"
IntermediateDirectory="$(ProjectName)\$(ConfigurationName)"
ConfigurationType="1"
CharacterSet="0"
WholeProgramOptimization="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="3"
EnableIntrinsicFunctions="false"
EnableFiberSafeOptimizations="true"
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
CompileAs="0"
DisableSpecificWarnings="4996"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLinkerTool"
LinkIncremental="1"
GenerateDebugInformation="true"
SubSystem="1"
OptimizeReferences="2"
EnableCOMDATFolding="2"
TargetMachine="1"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCManifestTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCAppVerifierTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Quelldateien"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\wrjpgcom.c"
>
</File>
</Filter>
<Filter
Name="Headerdateien"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\jconfig.h"
>
</File>
<File
RelativePath=".\jinclude.h"
>
</File>
</Filter>
<Filter
Name="Ressourcendateien"
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav"
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}"
>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

62
makewvcx.v10 Normal file
View File

@@ -0,0 +1,62 @@
<EFBFBD><EFBFBD><EFBFBD><?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{B57065D4-DDDA-4668-BAF5-2D49270C973C}</ProjectGuid>
<Keyword>Win32Proj</Keyword>
<RootNamespace>wrjpgcom</RootNamespace>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(ProjectName)\$(Configuration)\</OutDir>
<IntDir>$(ProjectName)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
<Optimization>Full</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>false</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS</PreprocessorDefinitions>
<OmitFramePointers>true</OmitFramePointers>
<EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="jconfig.h" />
<ClInclude Include="jinclude.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="wrjpgcom.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

57
rdbmp.c
View File

@@ -2,6 +2,7 @@
* rdbmp.c * rdbmp.c
* *
* Copyright (C) 1994-1996, Thomas G. Lane. * Copyright (C) 1994-1996, Thomas G. Lane.
* Modified 2009-2010 by Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -177,10 +178,41 @@ get_24bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
} }
METHODDEF(JDIMENSION)
get_32bit_row (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
/* This version is for reading 32-bit pixels */
{
bmp_source_ptr source = (bmp_source_ptr) sinfo;
JSAMPARRAY image_ptr;
register JSAMPROW inptr, outptr;
register JDIMENSION col;
/* Fetch next row from virtual array */
source->source_row--;
image_ptr = (*cinfo->mem->access_virt_sarray)
((j_common_ptr) cinfo, source->whole_image,
source->source_row, (JDIMENSION) 1, FALSE);
/* Transfer data. Note source values are in BGR order
* (even though Microsoft's own documents say the opposite).
*/
inptr = image_ptr[0];
outptr = source->pub.buffer[0];
for (col = cinfo->image_width; col > 0; col--) {
outptr[2] = *inptr++; /* can omit GETJSAMPLE() safely */
outptr[1] = *inptr++;
outptr[0] = *inptr++;
inptr++; /* skip the 4th byte (Alpha channel) */
outptr += 3;
}
return 1;
}
/* /*
* This method loads the image into whole_image during the first call on * This method loads the image into whole_image during the first call on
* get_pixel_rows. The get_pixel_rows pointer is then adjusted to call * get_pixel_rows. The get_pixel_rows pointer is then adjusted to call
* get_8bit_row or get_24bit_row on subsequent calls. * get_8bit_row, get_24bit_row, or get_32bit_row on subsequent calls.
*/ */
METHODDEF(JDIMENSION) METHODDEF(JDIMENSION)
@@ -223,6 +255,9 @@ preload_image (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
case 24: case 24:
source->pub.get_pixel_rows = get_24bit_row; source->pub.get_pixel_rows = get_24bit_row;
break; break;
case 32:
source->pub.get_pixel_rows = get_32bit_row;
break;
default: default:
ERREXIT(cinfo, JERR_BMP_BADDEPTH); ERREXIT(cinfo, JERR_BMP_BADDEPTH);
} }
@@ -251,8 +286,8 @@ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
(((INT32) UCH(array[offset+3])) << 24)) (((INT32) UCH(array[offset+3])) << 24))
INT32 bfOffBits; INT32 bfOffBits;
INT32 headerSize; INT32 headerSize;
INT32 biWidth = 0; /* initialize to avoid compiler warning */ INT32 biWidth;
INT32 biHeight = 0; INT32 biHeight;
unsigned int biPlanes; unsigned int biPlanes;
INT32 biCompression; INT32 biCompression;
INT32 biXPelsPerMeter,biYPelsPerMeter; INT32 biXPelsPerMeter,biYPelsPerMeter;
@@ -300,8 +335,6 @@ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
ERREXIT(cinfo, JERR_BMP_BADDEPTH); ERREXIT(cinfo, JERR_BMP_BADDEPTH);
break; break;
} }
if (biPlanes != 1)
ERREXIT(cinfo, JERR_BMP_BADPLANES);
break; break;
case 40: case 40:
case 64: case 64:
@@ -325,12 +358,13 @@ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
case 24: /* RGB image */ case 24: /* RGB image */
TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight); TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);
break; break;
case 32: /* RGB image + Alpha channel */
TRACEMS2(cinfo, 1, JTRC_BMP, (int) biWidth, (int) biHeight);
break;
default: default:
ERREXIT(cinfo, JERR_BMP_BADDEPTH); ERREXIT(cinfo, JERR_BMP_BADDEPTH);
break; break;
} }
if (biPlanes != 1)
ERREXIT(cinfo, JERR_BMP_BADPLANES);
if (biCompression != 0) if (biCompression != 0)
ERREXIT(cinfo, JERR_BMP_COMPRESSED); ERREXIT(cinfo, JERR_BMP_COMPRESSED);
@@ -343,9 +377,14 @@ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
break; break;
default: default:
ERREXIT(cinfo, JERR_BMP_BADHEADER); ERREXIT(cinfo, JERR_BMP_BADHEADER);
break; return;
} }
if (biWidth <= 0 || biHeight <= 0)
ERREXIT(cinfo, JERR_BMP_EMPTY);
if (biPlanes != 1)
ERREXIT(cinfo, JERR_BMP_BADPLANES);
/* Compute distance to bitmap data --- will adjust for colormap below */ /* Compute distance to bitmap data --- will adjust for colormap below */
bPad = bfOffBits - (headerSize + 14); bPad = bfOffBits - (headerSize + 14);
@@ -375,6 +414,8 @@ start_input_bmp (j_compress_ptr cinfo, cjpeg_source_ptr sinfo)
/* Compute row width in file, including padding to 4-byte boundary */ /* Compute row width in file, including padding to 4-byte boundary */
if (source->bits_per_pixel == 24) if (source->bits_per_pixel == 24)
row_width = (JDIMENSION) (biWidth * 3); row_width = (JDIMENSION) (biWidth * 3);
else if (source->bits_per_pixel == 32)
row_width = (JDIMENSION) (biWidth * 4);
else else
row_width = (JDIMENSION) biWidth; row_width = (JDIMENSION) biWidth;
while ((row_width & 3) != 0) row_width++; while ((row_width & 3) != 0) row_width++;

View File

@@ -1,6 +1,6 @@
IJG JPEG LIBRARY: SYSTEM ARCHITECTURE IJG JPEG LIBRARY: SYSTEM ARCHITECTURE
Copyright (C) 1991-2009, Thomas G. Lane, Guido Vollbeding. Copyright (C) 1991-2012, Thomas G. Lane, Guido Vollbeding.
This file is part of the Independent JPEG Group's software. This file is part of the Independent JPEG Group's software.
For conditions of distribution and use, see the accompanying README file. For conditions of distribution and use, see the accompanying README file.
@@ -20,7 +20,7 @@ In this document, JPEG-specific terminology follows the JPEG standard:
A "component" means a color channel, e.g., Red or Luminance. A "component" means a color channel, e.g., Red or Luminance.
A "sample" is a single component value (i.e., one number in the image data). A "sample" is a single component value (i.e., one number in the image data).
A "coefficient" is a frequency coefficient (a DCT transform output number). A "coefficient" is a frequency coefficient (a DCT transform output number).
A "block" is an 8x8 group of samples or coefficients. A "block" is an array of samples or coefficients.
An "MCU" (minimum coded unit) is an interleaved set of blocks of size An "MCU" (minimum coded unit) is an interleaved set of blocks of size
determined by the sampling factors, or a single block in a determined by the sampling factors, or a single block in a
noninterleaved scan. noninterleaved scan.
@@ -43,13 +43,8 @@ command-line user interface and I/O routines for several uncompressed image
formats. This document concentrates on the library itself. formats. This document concentrates on the library itself.
We desire the library to be capable of supporting all JPEG baseline, extended We desire the library to be capable of supporting all JPEG baseline, extended
sequential, and progressive DCT processes. Hierarchical processes are not sequential, and progressive DCT processes. The library does not support the
supported. hierarchical or lossless processes defined in the standard.
The library does not support the lossless (spatial) JPEG process. Lossless
JPEG shares little or no code with lossy JPEG, and would normally be used
without the extensive pre- and post-processing provided by this library.
We feel that lossless JPEG is better handled by a separate library.
Within these limits, any set of compression parameters allowed by the JPEG Within these limits, any set of compression parameters allowed by the JPEG
spec should be readable for decompression. (We can be more restrictive about spec should be readable for decompression. (We can be more restrictive about
@@ -175,7 +170,7 @@ can be simplified a little if they work on padded data: it's not necessary to
have special cases at the right and bottom edges. Therefore the interface have special cases at the right and bottom edges. Therefore the interface
buffer is always an integral number of blocks wide and high, and we expect buffer is always an integral number of blocks wide and high, and we expect
compression preprocessing to pad the source data properly. Padding will occur compression preprocessing to pad the source data properly. Padding will occur
only to the next block (8-sample) boundary. In an interleaved-scan situation, only to the next block (N-sample) boundary. In an interleaved-scan situation,
additional dummy blocks may be used to fill out MCUs, but the MCU assembly and additional dummy blocks may be used to fill out MCUs, but the MCU assembly and
disassembly logic will create or discard these blocks internally. (This is disassembly logic will create or discard these blocks internally. (This is
advantageous for speed reasons, since we avoid DCTing the dummy blocks. advantageous for speed reasons, since we avoid DCTing the dummy blocks.
@@ -350,9 +345,9 @@ The objects shown above are:
require context rows above and below the current row group; the require context rows above and below the current row group; the
preprocessing controller is responsible for supplying these rows via proper preprocessing controller is responsible for supplying these rows via proper
buffering. The downsampler is responsible for edge expansion at the right buffering. The downsampler is responsible for edge expansion at the right
edge (i.e., extending each sample row to a multiple of 8 samples); but the edge (i.e., extending each sample row to a multiple of N samples); but the
preprocessing controller is responsible for vertical edge expansion (i.e., preprocessing controller is responsible for vertical edge expansion (i.e.,
duplicating the bottom sample row as needed to make a multiple of 8 rows). duplicating the bottom sample row as needed to make a multiple of N rows).
* Coefficient controller: buffer controller for the DCT-coefficient data. * Coefficient controller: buffer controller for the DCT-coefficient data.
This controller handles MCU assembly, including insertion of dummy DCT This controller handles MCU assembly, including insertion of dummy DCT
@@ -385,8 +380,9 @@ objects:
* Data destination manager: writes the output JPEG datastream to its final * Data destination manager: writes the output JPEG datastream to its final
destination (e.g., a file). The destination manager supplied with the destination (e.g., a file). The destination manager supplied with the
library knows how to write to a stdio stream; for other behaviors, the library knows how to write to a stdio stream or to a memory buffer;
surrounding application may provide its own destination manager. for other behaviors, the surrounding application may provide its own
destination manager.
* Memory manager: allocates and releases memory, controls virtual arrays * Memory manager: allocates and releases memory, controls virtual arrays
(with backing store management, where required). (with backing store management, where required).
@@ -504,9 +500,9 @@ objects:
* Marker reading: decodes JPEG markers (except for RSTn). * Marker reading: decodes JPEG markers (except for RSTn).
* Data source manager: supplies the input JPEG datastream. The source * Data source manager: supplies the input JPEG datastream. The source
manager supplied with the library knows how to read from a stdio stream; manager supplied with the library knows how to read from a stdio stream
for other behaviors, the surrounding application may provide its own source or from a memory buffer; for other behaviors, the surrounding application
manager. may provide its own source manager.
* Memory manager: same as for compression library. * Memory manager: same as for compression library.
@@ -654,9 +650,9 @@ contain quantized coefficients everywhere outside the DCT/IDCT subsystems.
(This latter decision may need to be revisited to support variable (This latter decision may need to be revisited to support variable
quantization a la JPEG Part 3.) quantization a la JPEG Part 3.)
Notice that the allocation unit is now a row of 8x8 blocks, corresponding to Notice that the allocation unit is now a row of 8x8 coefficient blocks,
eight rows of samples. Otherwise the structure is much the same as for corresponding to N rows of samples. Otherwise the structure is much the same
samples, and for the same reasons. as for samples, and for the same reasons.
On machines where malloc() can't handle a request bigger than 64Kb, this data On machines where malloc() can't handle a request bigger than 64Kb, this data
structure limits us to rows of less than 512 JBLOCKs, or a picture width of structure limits us to rows of less than 512 JBLOCKs, or a picture width of

View File

@@ -1,7 +1,7 @@
/* /*
* transupp.c * transupp.c
* *
* Copyright (C) 1997-2009, Thomas G. Lane, Guido Vollbeding. * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -133,7 +133,8 @@ do_flip_h_no_crop (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
* mirroring by changing the signs of odd-numbered columns. * mirroring by changing the signs of odd-numbered columns.
* Partial iMCUs at the right edge are left untouched. * Partial iMCUs at the right edge are left untouched.
*/ */
MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); MCU_cols = srcinfo->output_width /
(dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -198,7 +199,8 @@ do_flip_h (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
* different rows of a single virtual array simultaneously. Otherwise, * different rows of a single virtual array simultaneously. Otherwise,
* this is essentially the same as the routine above. * this is essentially the same as the routine above.
*/ */
MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); MCU_cols = srcinfo->output_width /
(dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -262,7 +264,8 @@ do_flip_v (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
* of odd-numbered rows. * of odd-numbered rows.
* Partial iMCUs at the bottom edge are copied verbatim. * Partial iMCUs at the bottom edge are copied verbatim.
*/ */
MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); MCU_rows = srcinfo->output_height /
(dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -389,7 +392,8 @@ do_rot_90 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
* at the (output) right edge properly. They just get transposed and * at the (output) right edge properly. They just get transposed and
* not mirrored. * not mirrored.
*/ */
MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE); MCU_cols = srcinfo->output_height /
(dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -469,7 +473,8 @@ do_rot_270 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
* at the (output) bottom edge properly. They just get transposed and * at the (output) bottom edge properly. They just get transposed and
* not mirrored. * not mirrored.
*/ */
MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE); MCU_rows = srcinfo->output_width /
(dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -536,8 +541,10 @@ do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
JCOEFPTR src_ptr, dst_ptr; JCOEFPTR src_ptr, dst_ptr;
jpeg_component_info *compptr; jpeg_component_info *compptr;
MCU_cols = srcinfo->image_width / (dstinfo->max_h_samp_factor * DCTSIZE); MCU_cols = srcinfo->output_width /
MCU_rows = srcinfo->image_height / (dstinfo->max_v_samp_factor * DCTSIZE); (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
MCU_rows = srcinfo->output_height /
(dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -645,8 +652,10 @@ do_transverse (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
JCOEFPTR src_ptr, dst_ptr; JCOEFPTR src_ptr, dst_ptr;
jpeg_component_info *compptr; jpeg_component_info *compptr;
MCU_cols = srcinfo->image_height / (dstinfo->max_h_samp_factor * DCTSIZE); MCU_cols = srcinfo->output_height /
MCU_rows = srcinfo->image_width / (dstinfo->max_v_samp_factor * DCTSIZE); (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
MCU_rows = srcinfo->output_width /
(dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -762,7 +771,7 @@ jt_read_integer (const char ** strptr, JDIMENSION * result)
* The routine returns TRUE if the spec string is valid, FALSE if not. * The routine returns TRUE if the spec string is valid, FALSE if not.
* *
* The crop spec string should have the format * The crop spec string should have the format
* <width>x<height>{+-}<xoffset>{+-}<yoffset> * <width>[f]x<height>[f]{+-}<xoffset>{+-}<yoffset>
* where width, height, xoffset, and yoffset are unsigned integers. * where width, height, xoffset, and yoffset are unsigned integers.
* Each of the elements can be omitted to indicate a default value. * 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 * (A weakness of this style is that it is not possible to omit xoffset
@@ -784,6 +793,10 @@ jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec)
/* fetch width */ /* fetch width */
if (! jt_read_integer(&spec, &info->crop_width)) if (! jt_read_integer(&spec, &info->crop_width))
return FALSE; return FALSE;
if (*spec == 'f' || *spec == 'F') {
spec++;
info->crop_width_set = JCROP_FORCE;
} else
info->crop_width_set = JCROP_POS; info->crop_width_set = JCROP_POS;
} }
if (*spec == 'x' || *spec == 'X') { if (*spec == 'x' || *spec == 'X') {
@@ -791,6 +804,10 @@ jtransform_parse_crop_spec (jpeg_transform_info *info, const char *spec)
spec++; spec++;
if (! jt_read_integer(&spec, &info->crop_height)) if (! jt_read_integer(&spec, &info->crop_height))
return FALSE; return FALSE;
if (*spec == 'f' || *spec == 'F') {
spec++;
info->crop_height_set = JCROP_FORCE;
} else
info->crop_height_set = JCROP_POS; info->crop_height_set = JCROP_POS;
} }
if (*spec == '+' || *spec == '-') { if (*spec == '+' || *spec == '-') {
@@ -822,10 +839,10 @@ trim_right_edge (jpeg_transform_info *info, JDIMENSION full_width)
{ {
JDIMENSION MCU_cols; JDIMENSION MCU_cols;
MCU_cols = info->output_width / (info->max_h_samp_factor * DCTSIZE); MCU_cols = info->output_width / info->iMCU_sample_width;
if (MCU_cols > 0 && info->x_crop_offset + MCU_cols == if (MCU_cols > 0 && info->x_crop_offset + MCU_cols ==
full_width / (info->max_h_samp_factor * DCTSIZE)) full_width / info->iMCU_sample_width)
info->output_width = MCU_cols * (info->max_h_samp_factor * DCTSIZE); info->output_width = MCU_cols * info->iMCU_sample_width;
} }
LOCAL(void) LOCAL(void)
@@ -833,10 +850,10 @@ trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height)
{ {
JDIMENSION MCU_rows; JDIMENSION MCU_rows;
MCU_rows = info->output_height / (info->max_v_samp_factor * DCTSIZE); MCU_rows = info->output_height / info->iMCU_sample_height;
if (MCU_rows > 0 && info->y_crop_offset + MCU_rows == if (MCU_rows > 0 && info->y_crop_offset + MCU_rows ==
full_height / (info->max_v_samp_factor * DCTSIZE)) full_height / info->iMCU_sample_height)
info->output_height = MCU_rows * (info->max_v_samp_factor * DCTSIZE); info->output_height = MCU_rows * info->iMCU_sample_height;
} }
@@ -852,59 +869,89 @@ trim_bottom_edge (jpeg_transform_info *info, JDIMENSION full_height)
* Hence, this routine must be called after jpeg_read_header (which reads * Hence, this routine must be called after jpeg_read_header (which reads
* the image dimensions) and before jpeg_read_coefficients (which realizes * the image dimensions) and before jpeg_read_coefficients (which realizes
* the source's virtual arrays). * the source's virtual arrays).
*
* This function returns FALSE right away if -perfect is given
* and transformation is not perfect. Otherwise returns TRUE.
*/ */
GLOBAL(void) GLOBAL(boolean)
jtransform_request_workspace (j_decompress_ptr srcinfo, jtransform_request_workspace (j_decompress_ptr srcinfo,
jpeg_transform_info *info) jpeg_transform_info *info)
{ {
jvirt_barray_ptr *coef_arrays = NULL; jvirt_barray_ptr *coef_arrays;
boolean need_workspace, transpose_it; boolean need_workspace, transpose_it;
jpeg_component_info *compptr; jpeg_component_info *compptr;
JDIMENSION xoffset, yoffset, width_in_iMCUs, height_in_iMCUs; JDIMENSION xoffset, yoffset;
JDIMENSION width_in_iMCUs, height_in_iMCUs;
JDIMENSION width_in_blocks, height_in_blocks; JDIMENSION width_in_blocks, height_in_blocks;
int ci, h_samp_factor, v_samp_factor; int ci, h_samp_factor, v_samp_factor;
/* Determine number of components in output image */ /* Determine number of components in output image */
if (info->force_grayscale && if (info->force_grayscale &&
srcinfo->jpeg_color_space == JCS_YCbCr && srcinfo->jpeg_color_space == JCS_YCbCr &&
srcinfo->num_components == 3) { srcinfo->num_components == 3)
/* We'll only process the first component */ /* We'll only process the first component */
info->num_components = 1; info->num_components = 1;
} else { else
/* Process all the components */ /* Process all the components */
info->num_components = srcinfo->num_components; info->num_components = srcinfo->num_components;
/* Compute output image dimensions and related values. */
jpeg_core_output_dimensions(srcinfo);
/* Return right away if -perfect is given and transformation is not perfect.
*/
if (info->perfect) {
if (info->num_components == 1) {
if (!jtransform_perfect_transform(srcinfo->output_width,
srcinfo->output_height,
srcinfo->min_DCT_h_scaled_size,
srcinfo->min_DCT_v_scaled_size,
info->transform))
return FALSE;
} else {
if (!jtransform_perfect_transform(srcinfo->output_width,
srcinfo->output_height,
srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size,
srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size,
info->transform))
return FALSE;
} }
}
/* If there is only one output component, force the iMCU size to be 1; /* 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 * 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 * when reducing color to grayscale, and also provides a handy way of
* cleaning up "funny" grayscale images whose sampling factors are not 1x1.) * cleaning up "funny" grayscale images whose sampling factors are not 1x1.)
*/ */
switch (info->transform) { switch (info->transform) {
case JXFORM_TRANSPOSE: case JXFORM_TRANSPOSE:
case JXFORM_TRANSVERSE: case JXFORM_TRANSVERSE:
case JXFORM_ROT_90: case JXFORM_ROT_90:
case JXFORM_ROT_270: case JXFORM_ROT_270:
info->output_width = srcinfo->image_height; info->output_width = srcinfo->output_height;
info->output_height = srcinfo->image_width; info->output_height = srcinfo->output_width;
if (info->num_components == 1) { if (info->num_components == 1) {
info->max_h_samp_factor = 1; info->iMCU_sample_width = srcinfo->min_DCT_v_scaled_size;
info->max_v_samp_factor = 1; info->iMCU_sample_height = srcinfo->min_DCT_h_scaled_size;
} else { } else {
info->max_h_samp_factor = srcinfo->max_v_samp_factor; info->iMCU_sample_width =
info->max_v_samp_factor = srcinfo->max_h_samp_factor; srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size;
info->iMCU_sample_height =
srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size;
} }
break; break;
default: default:
info->output_width = srcinfo->image_width; info->output_width = srcinfo->output_width;
info->output_height = srcinfo->image_height; info->output_height = srcinfo->output_height;
if (info->num_components == 1) { if (info->num_components == 1) {
info->max_h_samp_factor = 1; info->iMCU_sample_width = srcinfo->min_DCT_h_scaled_size;
info->max_v_samp_factor = 1; info->iMCU_sample_height = srcinfo->min_DCT_v_scaled_size;
} else { } else {
info->max_h_samp_factor = srcinfo->max_h_samp_factor; info->iMCU_sample_width =
info->max_v_samp_factor = srcinfo->max_v_samp_factor; srcinfo->max_h_samp_factor * srcinfo->min_DCT_h_scaled_size;
info->iMCU_sample_height =
srcinfo->max_v_samp_factor * srcinfo->min_DCT_v_scaled_size;
} }
break; break;
} }
@@ -941,13 +988,19 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
else else
yoffset = info->crop_yoffset; yoffset = info->crop_yoffset;
/* Now adjust so that upper left corner falls at an iMCU boundary */ /* Now adjust so that upper left corner falls at an iMCU boundary */
if (info->crop_width_set == JCROP_FORCE)
info->output_width = info->crop_width;
else
info->output_width = info->output_width =
info->crop_width + (xoffset % (info->max_h_samp_factor * DCTSIZE)); info->crop_width + (xoffset % info->iMCU_sample_width);
if (info->crop_height_set == JCROP_FORCE)
info->output_height = info->crop_height;
else
info->output_height = info->output_height =
info->crop_height + (yoffset % (info->max_v_samp_factor * DCTSIZE)); info->crop_height + (yoffset % info->iMCU_sample_height);
/* Save x/y offsets measured in iMCUs */ /* Save x/y offsets measured in iMCUs */
info->x_crop_offset = xoffset / (info->max_h_samp_factor * DCTSIZE); info->x_crop_offset = xoffset / info->iMCU_sample_width;
info->y_crop_offset = yoffset / (info->max_v_samp_factor * DCTSIZE); info->y_crop_offset = yoffset / info->iMCU_sample_height;
} else { } else {
info->x_crop_offset = 0; info->x_crop_offset = 0;
info->y_crop_offset = 0; info->y_crop_offset = 0;
@@ -966,14 +1019,14 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
break; break;
case JXFORM_FLIP_H: case JXFORM_FLIP_H:
if (info->trim) if (info->trim)
trim_right_edge(info, srcinfo->image_width); trim_right_edge(info, srcinfo->output_width);
if (info->y_crop_offset != 0) if (info->y_crop_offset != 0)
need_workspace = TRUE; need_workspace = TRUE;
/* do_flip_h_no_crop doesn't need a workspace array */ /* do_flip_h_no_crop doesn't need a workspace array */
break; break;
case JXFORM_FLIP_V: case JXFORM_FLIP_V:
if (info->trim) if (info->trim)
trim_bottom_edge(info, srcinfo->image_height); trim_bottom_edge(info, srcinfo->output_height);
/* Need workspace arrays having same dimensions as source image. */ /* Need workspace arrays having same dimensions as source image. */
need_workspace = TRUE; need_workspace = TRUE;
break; break;
@@ -985,8 +1038,8 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
break; break;
case JXFORM_TRANSVERSE: case JXFORM_TRANSVERSE:
if (info->trim) { if (info->trim) {
trim_right_edge(info, srcinfo->image_height); trim_right_edge(info, srcinfo->output_height);
trim_bottom_edge(info, srcinfo->image_width); trim_bottom_edge(info, srcinfo->output_width);
} }
/* Need workspace arrays having transposed dimensions. */ /* Need workspace arrays having transposed dimensions. */
need_workspace = TRUE; need_workspace = TRUE;
@@ -994,22 +1047,22 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
break; break;
case JXFORM_ROT_90: case JXFORM_ROT_90:
if (info->trim) if (info->trim)
trim_right_edge(info, srcinfo->image_height); trim_right_edge(info, srcinfo->output_height);
/* Need workspace arrays having transposed dimensions. */ /* Need workspace arrays having transposed dimensions. */
need_workspace = TRUE; need_workspace = TRUE;
transpose_it = TRUE; transpose_it = TRUE;
break; break;
case JXFORM_ROT_180: case JXFORM_ROT_180:
if (info->trim) { if (info->trim) {
trim_right_edge(info, srcinfo->image_width); trim_right_edge(info, srcinfo->output_width);
trim_bottom_edge(info, srcinfo->image_height); trim_bottom_edge(info, srcinfo->output_height);
} }
/* Need workspace arrays having same dimensions as source image. */ /* Need workspace arrays having same dimensions as source image. */
need_workspace = TRUE; need_workspace = TRUE;
break; break;
case JXFORM_ROT_270: case JXFORM_ROT_270:
if (info->trim) if (info->trim)
trim_bottom_edge(info, srcinfo->image_width); trim_bottom_edge(info, srcinfo->output_width);
/* Need workspace arrays having transposed dimensions. */ /* Need workspace arrays having transposed dimensions. */
need_workspace = TRUE; need_workspace = TRUE;
transpose_it = TRUE; transpose_it = TRUE;
@@ -1026,10 +1079,10 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
SIZEOF(jvirt_barray_ptr) * info->num_components); SIZEOF(jvirt_barray_ptr) * info->num_components);
width_in_iMCUs = (JDIMENSION) width_in_iMCUs = (JDIMENSION)
jdiv_round_up((long) info->output_width, jdiv_round_up((long) info->output_width,
(long) (info->max_h_samp_factor * DCTSIZE)); (long) info->iMCU_sample_width);
height_in_iMCUs = (JDIMENSION) height_in_iMCUs = (JDIMENSION)
jdiv_round_up((long) info->output_height, jdiv_round_up((long) info->output_height,
(long) (info->max_v_samp_factor * DCTSIZE)); (long) info->iMCU_sample_height);
for (ci = 0; ci < info->num_components; ci++) { for (ci = 0; ci < info->num_components; ci++) {
compptr = srcinfo->comp_info + ci; compptr = srcinfo->comp_info + ci;
if (info->num_components == 1) { if (info->num_components == 1) {
@@ -1048,9 +1101,11 @@ jtransform_request_workspace (j_decompress_ptr srcinfo,
((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE, ((j_common_ptr) srcinfo, JPOOL_IMAGE, FALSE,
width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor); width_in_blocks, height_in_blocks, (JDIMENSION) v_samp_factor);
} }
}
info->workspace_coef_arrays = coef_arrays; info->workspace_coef_arrays = coef_arrays;
} else
info->workspace_coef_arrays = NULL;
return TRUE;
} }
@@ -1062,8 +1117,17 @@ transpose_critical_parameters (j_compress_ptr dstinfo)
int tblno, i, j, ci, itemp; int tblno, i, j, ci, itemp;
jpeg_component_info *compptr; jpeg_component_info *compptr;
JQUANT_TBL *qtblptr; JQUANT_TBL *qtblptr;
JDIMENSION jtemp;
UINT16 qtemp; UINT16 qtemp;
/* Transpose image dimensions */
jtemp = dstinfo->image_width;
dstinfo->image_width = dstinfo->image_height;
dstinfo->image_height = jtemp;
itemp = dstinfo->min_DCT_h_scaled_size;
dstinfo->min_DCT_h_scaled_size = dstinfo->min_DCT_v_scaled_size;
dstinfo->min_DCT_v_scaled_size = itemp;
/* Transpose sampling factors */ /* Transpose sampling factors */
for (ci = 0; ci < dstinfo->num_components; ci++) { for (ci = 0; ci < dstinfo->num_components; ci++) {
compptr = dstinfo->comp_info + ci; compptr = dstinfo->comp_info + ci;
@@ -1296,10 +1360,10 @@ jtransform_adjust_parameters (j_decompress_ptr srcinfo,
} }
/* Correct the destination's image dimensions as necessary /* Correct the destination's image dimensions as necessary
* for crop and rotate/flip operations. * for rotate/flip, resize, and crop operations.
*/ */
dstinfo->image_width = info->output_width; dstinfo->jpeg_width = info->output_width;
dstinfo->image_height = info->output_height; dstinfo->jpeg_height = info->output_height;
/* Transpose destination image parameters */ /* Transpose destination image parameters */
switch (info->transform) { switch (info->transform) {
@@ -1326,12 +1390,12 @@ jtransform_adjust_parameters (j_decompress_ptr srcinfo,
/* Suppress output of JFIF marker */ /* Suppress output of JFIF marker */
dstinfo->write_JFIF_header = FALSE; dstinfo->write_JFIF_header = FALSE;
/* Adjust Exif image parameters */ /* Adjust Exif image parameters */
if (dstinfo->image_width != srcinfo->image_width || if (dstinfo->jpeg_width != srcinfo->image_width ||
dstinfo->image_height != srcinfo->image_height) dstinfo->jpeg_height != srcinfo->image_height)
/* Align data segment to start of TIFF structure for parsing */ /* Align data segment to start of TIFF structure for parsing */
adjust_exif_parameters(srcinfo->marker_list->data + 6, adjust_exif_parameters(srcinfo->marker_list->data + 6,
srcinfo->marker_list->data_length - 6, srcinfo->marker_list->data_length - 6,
dstinfo->image_width, dstinfo->image_height); dstinfo->jpeg_width, dstinfo->jpeg_height);
} }
/* Return the appropriate output data set */ /* Return the appropriate output data set */
@@ -1415,8 +1479,8 @@ jtransform_execute_transform (j_decompress_ptr srcinfo,
* (after reading source header): * (after reading source header):
* image_width = cinfo.image_width * image_width = cinfo.image_width
* image_height = cinfo.image_height * image_height = cinfo.image_height
* MCU_width = cinfo.max_h_samp_factor * DCTSIZE * MCU_width = cinfo.max_h_samp_factor * cinfo.block_size
* MCU_height = cinfo.max_v_samp_factor * DCTSIZE * MCU_height = cinfo.max_v_samp_factor * cinfo.block_size
* Result: * Result:
* TRUE = perfect transformation possible * TRUE = perfect transformation possible
* FALSE = perfect transformation not possible * FALSE = perfect transformation not possible

View File

@@ -1,7 +1,7 @@
/* /*
* transupp.h * transupp.h
* *
* Copyright (C) 1997-2001, Thomas G. Lane. * Copyright (C) 1997-2011, Thomas G. Lane, Guido Vollbeding.
* This file is part of the Independent JPEG Group's software. * This file is part of the Independent JPEG Group's software.
* For conditions of distribution and use, see the accompanying README file. * For conditions of distribution and use, see the accompanying README file.
* *
@@ -57,10 +57,16 @@
* corner up and/or left to make it so, simultaneously increasing the region * corner up and/or left to make it so, simultaneously increasing the region
* dimensions to keep the lower right crop corner unchanged. (Thus, the * dimensions to keep the lower right crop corner unchanged. (Thus, the
* output image covers at least the requested region, but may cover more.) * output image covers at least the requested region, but may cover more.)
* The adjustment of the region dimensions may be optionally disabled.
* *
* If both crop and a rotate/flip transform are requested, the crop is applied * We also provide a lossless-resize option, which is kind of a lossless-crop
* last --- that is, the crop region is specified in terms of the destination * operation in the DCT coefficient block domain - it discards higher-order
* image. * coefficients and losslessly preserves lower-order coefficients of a
* sub-block.
*
* Rotate/flip transform, resize, and crop can be requested together in a
* single invocation. The crop is applied last --- that is, the crop region
* is specified in terms of the destination image after transform/resize.
* *
* We also offer a "force to grayscale" option, which simply discards the * 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 * chrominance channels of a YCbCr image. This is lossless in the sense that
@@ -101,13 +107,15 @@ typedef enum {
/* /*
* Codes for crop parameters, which can individually be unspecified, * Codes for crop parameters, which can individually be unspecified,
* positive, or negative. (Negative width or height makes no sense, though.) * positive or negative for xoffset or yoffset,
* positive or forced for width or height.
*/ */
typedef enum { typedef enum {
JCROP_UNSET, JCROP_UNSET,
JCROP_POS, JCROP_POS,
JCROP_NEG JCROP_NEG,
JCROP_FORCE
} JCROP_CODE; } JCROP_CODE;
/* /*
@@ -128,9 +136,9 @@ typedef struct {
* These can be filled in by jtransform_parse_crop_spec(). * These can be filled in by jtransform_parse_crop_spec().
*/ */
JDIMENSION crop_width; /* Width of selected region */ JDIMENSION crop_width; /* Width of selected region */
JCROP_CODE crop_width_set; JCROP_CODE crop_width_set; /* (forced disables adjustment) */
JDIMENSION crop_height; /* Height of selected region */ JDIMENSION crop_height; /* Height of selected region */
JCROP_CODE crop_height_set; JCROP_CODE crop_height_set; /* (forced disables adjustment) */
JDIMENSION crop_xoffset; /* X offset of selected region */ JDIMENSION crop_xoffset; /* X offset of selected region */
JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */ JCROP_CODE crop_xoffset_set; /* (negative measures from right edge) */
JDIMENSION crop_yoffset; /* Y offset of selected region */ JDIMENSION crop_yoffset; /* Y offset of selected region */
@@ -143,8 +151,8 @@ typedef struct {
JDIMENSION output_height; JDIMENSION output_height;
JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */ JDIMENSION x_crop_offset; /* destination crop offsets measured in iMCUs */
JDIMENSION y_crop_offset; JDIMENSION y_crop_offset;
int max_h_samp_factor; /* destination iMCU size */ int iMCU_sample_width; /* destination iMCU size */
int max_v_samp_factor; int iMCU_sample_height;
} jpeg_transform_info; } jpeg_transform_info;
@@ -154,7 +162,7 @@ typedef struct {
EXTERN(boolean) jtransform_parse_crop_spec EXTERN(boolean) jtransform_parse_crop_spec
JPP((jpeg_transform_info *info, const char *spec)); JPP((jpeg_transform_info *info, const char *spec));
/* Request any required workspace */ /* Request any required workspace */
EXTERN(void) jtransform_request_workspace EXTERN(boolean) jtransform_request_workspace
JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info)); JPP((j_decompress_ptr srcinfo, jpeg_transform_info *info));
/* Adjust output image parameters */ /* Adjust output image parameters */
EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters EXTERN(jvirt_barray_ptr *) jtransform_adjust_parameters

View File

@@ -77,6 +77,12 @@ The basic command line switches for cjpeg are:
saying -grayscale, you'll get a smaller JPEG file that saying -grayscale, you'll get a smaller JPEG file that
takes less time to process. takes less time to process.
-rgb Create RGB JPEG file.
Using this switch suppresses the conversion from RGB
colorspace input to the default YCbCr JPEG colorspace.
Use this switch in combination with the -block N
switch (see below) for lossless JPEG coding.
-optimize Perform optimization of entropy encoding parameters. -optimize Perform optimization of entropy encoding parameters.
Without this, default encoding parameters are used. Without this, default encoding parameters are used.
-optimize usually makes the JPEG file a little smaller, -optimize usually makes the JPEG file a little smaller,
@@ -87,8 +93,9 @@ The basic command line switches for cjpeg are:
-progressive Create progressive JPEG file (see below). -progressive Create progressive JPEG file (see below).
-scale M/N Scale the output image by a factor M/N. Currently -scale M/N Scale the output image by a factor M/N. Currently
supported scale factors are 8/N with all N from 1 to supported scale factors are M/N with all N from 1 to
16. 16, where M is the destination DCT size, which is 8 by
default (see -block N switch below).
-targa Input file is Targa format. Targa files that contain -targa Input file is Targa format. Targa files that contain
an "identification" field will not be automatically an "identification" field will not be automatically
@@ -137,7 +144,7 @@ behaviour in case that only one parameter is given, which is then used for
both luminance and chrominance (slots 0 and 1). More or custom quantization both luminance and chrominance (slots 0 and 1). More or custom quantization
tables can be set with -qtables and assigned to components with -qslots tables can be set with -qtables and assigned to components with -qslots
parameter (see the "wizard" switches below). parameter (see the "wizard" switches below).
CAUTION: You must explicitely add -sample 1x1 for efficient separate color CAUTION: You must explicitly add -sample 1x1 for efficient separate color
quality selection, since the default value used by library is 2x2! quality selection, since the default value used by library is 2x2!
The -progressive switch creates a "progressive JPEG" file. In this type of The -progressive switch creates a "progressive JPEG" file. In this type of
@@ -150,6 +157,24 @@ file size is about the same --- often a little smaller.
Switches for advanced users: Switches for advanced users:
-arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG
is not yet widely implemented, so many decoders will
be unable to view an arithmetic coded JPEG file at
all.
-block N Set DCT block size. All N from 1 to 16 are possible.
Default is 8 (baseline format).
Larger values produce higher compression,
smaller values produce higher quality
(exact DCT stage possible with 1 or 2; with the
default quality of 75 and default Luminance qtable
the DCT+Quantization stage is lossless for N=1).
CAUTION: An implementation of the JPEG SmartScale
extension is required for this feature. SmartScale
enabled JPEG is not yet widely implemented, so many
decoders will be unable to view a SmartScale extended
JPEG file at all.
-dct int Use integer DCT method (default). -dct int Use integer DCT method (default).
-dct fast Use fast integer DCT (less accurate). -dct fast Use fast integer DCT (less accurate).
-dct float Use floating-point DCT method. -dct float Use floating-point DCT method.
@@ -196,11 +221,6 @@ factor will visibly blur the image, however.
Switches for wizards: Switches for wizards:
-arithmetic Use arithmetic coding. CAUTION: arithmetic coded JPEG
is not yet widely implemented, so many decoders will
be unable to view an arithmetic coded JPEG file at
all.
-baseline Force baseline-compatible quantization tables to be -baseline Force baseline-compatible quantization tables to be
generated. This clamps quantization values to 8 bits generated. This clamps quantization values to 8 bits
even at low quality settings. (This switch is poorly even at low quality settings. (This switch is poorly
@@ -245,14 +265,15 @@ The basic command line switches for djpeg are:
djpeg runs noticeably faster in this mode. djpeg runs noticeably faster in this mode.
-scale M/N Scale the output image by a factor M/N. Currently -scale M/N Scale the output image by a factor M/N. Currently
supported scale factors are M/8 with all M from 1 to supported scale factors are M/N with all M from 1 to
16. If the /N part is omitted, then M specifies the 16, where N is the source DCT size, which is 8 for
DCT scaled size to be applied on the given input, baseline JPEG. If the /N part is omitted, then M
which is currently equivalent to M/8 scaling, since specifies the DCT scaled size to be applied on the
the source DCT size is currently always 8. given input. For baseline JPEG this is equivalent to
Scaling is handy if the image is larger than your M/8 scaling, since the source DCT size for baseline
screen; also, djpeg runs much faster when scaling JPEG is 8. Scaling is handy if the image is larger
down the output. than your screen; also, djpeg runs much faster when
scaling down the output.
-bmp Select BMP output format (Windows flavor). 8-bit -bmp Select BMP output format (Windows flavor). 8-bit
colormapped format is emitted if -colors or -grayscale colormapped format is emitted if -colors or -grayscale
@@ -444,9 +465,9 @@ To specify the coded JPEG representation used in the output file,
jpegtran accepts a subset of the switches recognized by cjpeg: jpegtran accepts a subset of the switches recognized by cjpeg:
-optimize Perform optimization of entropy encoding parameters. -optimize Perform optimization of entropy encoding parameters.
-progressive Create progressive JPEG file. -progressive Create progressive JPEG file.
-arithmetic Use arithmetic coding.
-restart N Emit a JPEG restart marker every N MCU rows, or every -restart N Emit a JPEG restart marker every N MCU rows, or every
N MCU blocks if "B" is attached to the number. N MCU blocks if "B" is attached to the number.
-arithmetic Use arithmetic coding.
-scans file Use the scan script given in the specified text file. -scans file Use the scan script given in the specified text file.
See the previous discussion of cjpeg for more details about these switches. See the previous discussion of cjpeg for more details about these switches.
If you specify none of these switches, you get a plain baseline-JPEG output If you specify none of these switches, you get a plain baseline-JPEG output
@@ -507,7 +528,8 @@ The image can be losslessly cropped by giving the switch:
-crop WxH+X+Y Crop to a rectangular subarea of width W, height H -crop WxH+X+Y Crop to a rectangular subarea of width W, height H
starting at point X,Y. starting at point X,Y.
Another not-strictly-lossless transformation switch is: Other not-strictly-lossless transformation switches are:
-grayscale Force grayscale output. -grayscale Force grayscale output.
This option discards the chrominance channels if the input image is YCbCr This option discards the chrominance channels if the input image is YCbCr
(ie, a standard color JPEG), resulting in a grayscale JPEG file. The (ie, a standard color JPEG), resulting in a grayscale JPEG file. The
@@ -518,6 +540,16 @@ encoded as a color JPEG. (In such a case, the space savings from getting rid
of the near-empty chroma channels won't be large; but the decoding time for of the near-empty chroma channels won't be large; but the decoding time for
a grayscale JPEG is substantially less than that for a color JPEG.) a grayscale JPEG is substantially less than that for a color JPEG.)
-scale M/N Scale the output image by a factor M/N.
Currently supported scale factors are M/N with all M from 1 to 16, where N is
the source DCT size, which is 8 for baseline JPEG. If the /N part is omitted,
then M specifies the DCT scaled size to be applied on the given input. For
baseline JPEG this is equivalent to M/8 scaling, since the source DCT size
for baseline JPEG is 8. CAUTION: An implementation of the JPEG SmartScale
extension is required for this feature. SmartScale enabled JPEG is not yet
widely implemented, so many decoders will be unable to view a SmartScale
extended JPEG file at all.
jpegtran also recognizes these switches that control what to do with "extra" jpegtran also recognizes these switches that control what to do with "extra"
markers, such as comment blocks: markers, such as comment blocks:
-copy none Copy no extra markers from source file. This setting -copy none Copy no extra markers from source file. This setting