forked from Mirrorlandia_minetest/irrlicht
Remove bundled libraries
This commit is contained in:
parent
665e4309c4
commit
67f1402410
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- name: Install deps
|
- name: Install deps
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get install g++ gcc libxxf86vm-dev libgl1-mesa-dev -qyy
|
sudo apt-get install g++ gcc libxxf86vm-dev libgl1-mesa-dev libbz2-dev libpng-dev libjpeg-dev zlib1g-dev -qyy
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
|
@ -376,16 +376,6 @@ the engine will no longer read .jpeg images. */
|
|||||||
#undef _IRR_COMPILE_WITH_LIBJPEG_
|
#undef _IRR_COMPILE_WITH_LIBJPEG_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! Define _IRR_USE_NON_SYSTEM_JPEG_LIB_ to let irrlicht use the jpeglib which comes with irrlicht.
|
|
||||||
/** If this is commented out, Irrlicht will try to compile using the jpeg lib installed in the system.
|
|
||||||
This is only used when _IRR_COMPILE_WITH_LIBJPEG_ is defined.
|
|
||||||
NOTE: You will also have to modify the Makefile or project files when changing this default.
|
|
||||||
*/
|
|
||||||
#define _IRR_USE_NON_SYSTEM_JPEG_LIB_
|
|
||||||
#ifdef NO_IRR_USE_NON_SYSTEM_JPEG_LIB_
|
|
||||||
#undef _IRR_USE_NON_SYSTEM_JPEG_LIB_
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! Define _IRR_COMPILE_WITH_LIBPNG_ to enable compiling the engine using libpng.
|
//! Define _IRR_COMPILE_WITH_LIBPNG_ to enable compiling the engine using libpng.
|
||||||
/** This enables the engine to read png images. If you comment this out,
|
/** This enables the engine to read png images. If you comment this out,
|
||||||
the engine will no longer read .png images. */
|
the engine will no longer read .png images. */
|
||||||
@ -394,16 +384,6 @@ the engine will no longer read .png images. */
|
|||||||
#undef _IRR_COMPILE_WITH_LIBPNG_
|
#undef _IRR_COMPILE_WITH_LIBPNG_
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//! Define _IRR_USE_NON_SYSTEM_LIBPNG_ to let irrlicht use the libpng which comes with irrlicht.
|
|
||||||
/** If this is commented out, Irrlicht will try to compile using the libpng installed in the system.
|
|
||||||
This is only used when _IRR_COMPILE_WITH_LIBPNG_ is defined.
|
|
||||||
NOTE: You will also have to modify the Makefile or project files when changing this default.
|
|
||||||
*/
|
|
||||||
#define _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#ifdef NO_IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#undef _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//! Define _IRR_D3D_NO_SHADER_DEBUGGING to disable shader debugging in D3D9
|
//! Define _IRR_D3D_NO_SHADER_DEBUGGING to disable shader debugging in D3D9
|
||||||
/** If _IRR_D3D_NO_SHADER_DEBUGGING is undefined in IrrCompileConfig.h,
|
/** If _IRR_D3D_NO_SHADER_DEBUGGING is undefined in IrrCompileConfig.h,
|
||||||
it is possible to debug all D3D9 shaders in VisualStudio. All shaders
|
it is possible to debug all D3D9 shaders in VisualStudio. All shaders
|
||||||
@ -791,16 +771,6 @@ ones. */
|
|||||||
#ifdef NO_IRR_COMPILE_WITH_ZLIB_
|
#ifdef NO_IRR_COMPILE_WITH_ZLIB_
|
||||||
#undef _IRR_COMPILE_WITH_ZLIB_
|
#undef _IRR_COMPILE_WITH_ZLIB_
|
||||||
#endif
|
#endif
|
||||||
//! Define _IRR_USE_NON_SYSTEM_ZLIB_ to let irrlicht use the zlib which comes with irrlicht.
|
|
||||||
/** If this is commented out, Irrlicht will try to compile using the zlib
|
|
||||||
installed on the system. This is only used when _IRR_COMPILE_WITH_ZLIB_ is
|
|
||||||
defined.
|
|
||||||
NOTE: You will also have to modify the Makefile or project files when changing this default.
|
|
||||||
*/
|
|
||||||
#define _IRR_USE_NON_SYSTEM_ZLIB_
|
|
||||||
#ifdef NO_IRR_USE_NON_SYSTEM_ZLIB_
|
|
||||||
#undef _IRR_USE_NON_SYSTEM_ZLIB_
|
|
||||||
#endif
|
|
||||||
//! Define _IRR_COMPILE_WITH_ZIP_ENCRYPTION_ if you want to read AES-encrypted ZIP archives
|
//! Define _IRR_COMPILE_WITH_ZIP_ENCRYPTION_ if you want to read AES-encrypted ZIP archives
|
||||||
#define _IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
#define _IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
||||||
#ifdef NO_IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
#ifdef NO_IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
||||||
@ -814,16 +784,6 @@ library. */
|
|||||||
#ifdef NO_IRR_COMPILE_WITH_BZIP2_
|
#ifdef NO_IRR_COMPILE_WITH_BZIP2_
|
||||||
#undef _IRR_COMPILE_WITH_BZIP2_
|
#undef _IRR_COMPILE_WITH_BZIP2_
|
||||||
#endif
|
#endif
|
||||||
//! Define _IRR_USE_NON_SYSTEM_BZLIB_ to let irrlicht use the bzlib which comes with irrlicht.
|
|
||||||
/** If this is commented out, Irrlicht will try to compile using the bzlib
|
|
||||||
installed on the system. This is only used when _IRR_COMPILE_WITH_BZLIB_ is
|
|
||||||
defined.
|
|
||||||
NOTE: You will also have to modify the Makefile or project files when changing this default.
|
|
||||||
*/
|
|
||||||
#define _IRR_USE_NON_SYSTEM_BZLIB_
|
|
||||||
#ifdef NO_IRR_USE_NON_SYSTEM_BZLIB_
|
|
||||||
#undef _IRR_USE_NON_SYSTEM_BZLIB_
|
|
||||||
#endif
|
|
||||||
//! Define _IRR_COMPILE_WITH_LZMA_ if you want to use LZMA compressed zip files.
|
//! Define _IRR_COMPILE_WITH_LZMA_ if you want to use LZMA compressed zip files.
|
||||||
/** LZMA is a very efficient compression code, known from 7zip. Irrlicht
|
/** LZMA is a very efficient compression code, known from 7zip. Irrlicht
|
||||||
currently only supports zip archives, though. */
|
currently only supports zip archives, though. */
|
||||||
|
@ -14,11 +14,7 @@
|
|||||||
#include <stdio.h> // required for jpeglib.h
|
#include <stdio.h> // required for jpeglib.h
|
||||||
#ifdef _IRR_COMPILE_WITH_LIBJPEG_
|
#ifdef _IRR_COMPILE_WITH_LIBJPEG_
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_JPEG_LIB_
|
|
||||||
#include <jpeglib.h> // use system lib
|
#include <jpeglib.h> // use system lib
|
||||||
#else
|
|
||||||
#include "jpeglib/jpeglib.h" // use irrlicht jpeglib
|
|
||||||
#endif
|
|
||||||
#include <setjmp.h>
|
#include <setjmp.h>
|
||||||
}
|
}
|
||||||
#endif // _IRR_COMPILE_WITH_LIBJPEG_
|
#endif // _IRR_COMPILE_WITH_LIBJPEG_
|
||||||
|
@ -7,11 +7,7 @@
|
|||||||
#ifdef _IRR_COMPILE_WITH_PNG_LOADER_
|
#ifdef _IRR_COMPILE_WITH_PNG_LOADER_
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_LIBPNG_
|
#ifdef _IRR_COMPILE_WITH_LIBPNG_
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#include <png.h> // use system lib png
|
#include <png.h> // use system lib png
|
||||||
#else // _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#include "libpng/png.h" // use irrlicht included lib png
|
|
||||||
#endif // _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#endif // _IRR_COMPILE_WITH_LIBPNG_
|
#endif // _IRR_COMPILE_WITH_LIBPNG_
|
||||||
|
|
||||||
#include "CImage.h"
|
#include "CImage.h"
|
||||||
|
@ -16,13 +16,8 @@
|
|||||||
#include <stdio.h> // required for jpeglib.h
|
#include <stdio.h> // required for jpeglib.h
|
||||||
extern "C"
|
extern "C"
|
||||||
{
|
{
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_JPEG_LIB_
|
|
||||||
#include <jpeglib.h>
|
#include <jpeglib.h>
|
||||||
#include <jerror.h>
|
#include <jerror.h>
|
||||||
#else
|
|
||||||
#include "jpeglib/jpeglib.h"
|
|
||||||
#include "jpeglib/jerror.h"
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -13,11 +13,7 @@
|
|||||||
#include "os.h" // for logging
|
#include "os.h" // for logging
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_LIBPNG_
|
#ifdef _IRR_COMPILE_WITH_LIBPNG_
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#include <png.h> // use system lib png
|
#include <png.h> // use system lib png
|
||||||
#else // _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#include "libpng/png.h" // use irrlicht included lib png
|
|
||||||
#endif // _IRR_USE_NON_SYSTEM_LIB_PNG_
|
|
||||||
#endif // _IRR_COMPILE_WITH_LIBPNG_
|
#endif // _IRR_COMPILE_WITH_LIBPNG_
|
||||||
|
|
||||||
namespace irr
|
namespace irr
|
||||||
|
@ -20,21 +20,13 @@ extern "C" void bz_internal_error(int errorCode)
|
|||||||
|
|
||||||
#include "IrrCompileConfig.h"
|
#include "IrrCompileConfig.h"
|
||||||
#ifdef _IRR_COMPILE_WITH_ZLIB_
|
#ifdef _IRR_COMPILE_WITH_ZLIB_
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_ZLIB_
|
|
||||||
#include <zlib.h> // use system lib
|
#include <zlib.h> // use system lib
|
||||||
#else
|
|
||||||
#include "zlib/zlib.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
#ifdef _IRR_COMPILE_WITH_ZIP_ENCRYPTION_
|
||||||
#include "aesGladman/fileenc.h"
|
#include "aesGladman/fileenc.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef _IRR_COMPILE_WITH_BZIP2_
|
#ifdef _IRR_COMPILE_WITH_BZIP2_
|
||||||
#ifndef _IRR_USE_NON_SYSTEM_BZLIB_
|
|
||||||
#include <bzlib.h>
|
#include <bzlib.h>
|
||||||
#else
|
|
||||||
#include "bzip2/bzlib.h"
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef _IRR_COMPILE_WITH_LZMA_
|
#ifdef _IRR_COMPILE_WITH_LZMA_
|
||||||
#include "lzma/LzmaDec.h"
|
#include "lzma/LzmaDec.h"
|
||||||
|
@ -57,25 +57,20 @@ IRRSWRENDEROBJ = CSoftwareDriver.o CSoftwareTexture.o CTRFlat.o CTRFlatWire.o CT
|
|||||||
IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CWADReader.o CZipReader.o CPakReader.o CNPKReader.o CTarReader.o CMountPointReader.o irrXML.o CAttributes.o lzma/LzmaDec.o
|
IRRIOOBJ = CFileList.o CFileSystem.o CLimitReadFile.o CMemoryFile.o CReadFile.o CWriteFile.o CXMLReader.o CXMLWriter.o CWADReader.o CZipReader.o CPakReader.o CNPKReader.o CTarReader.o CMountPointReader.o irrXML.o CAttributes.o lzma/LzmaDec.o
|
||||||
IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceConsole.o CIrrDeviceStub.o CIrrDeviceWin32.o CIrrDeviceFB.o CLogger.o COSOperator.o Irrlicht.o os.o leakHunter.o CProfiler.o utf8.o
|
IRROTHEROBJ = CIrrDeviceSDL.o CIrrDeviceLinux.o CIrrDeviceConsole.o CIrrDeviceStub.o CIrrDeviceWin32.o CIrrDeviceFB.o CLogger.o COSOperator.o Irrlicht.o os.o leakHunter.o CProfiler.o utf8.o
|
||||||
IRRGUIOBJ = CGUIButton.o CGUICheckBox.o CGUIComboBox.o CGUIContextMenu.o CGUIEditBox.o CGUIEnvironment.o CGUIFileOpenDialog.o CGUIFont.o CGUIImage.o CGUIInOutFader.o CGUIListBox.o CGUIMenu.o CGUIMeshViewer.o CGUIMessageBox.o CGUIModalScreen.o CGUIScrollBar.o CGUISpinBox.o CGUISkin.o CGUIStaticText.o CGUITabControl.o CGUITable.o CGUIToolBar.o CGUIWindow.o CGUIColorSelectDialog.o CDefaultGUIElementFactory.o CGUISpriteBank.o CGUIImageList.o CGUITreeView.o CGUIProfiler.o
|
IRRGUIOBJ = CGUIButton.o CGUICheckBox.o CGUIComboBox.o CGUIContextMenu.o CGUIEditBox.o CGUIEnvironment.o CGUIFileOpenDialog.o CGUIFont.o CGUIImage.o CGUIInOutFader.o CGUIListBox.o CGUIMenu.o CGUIMeshViewer.o CGUIMessageBox.o CGUIModalScreen.o CGUIScrollBar.o CGUISpinBox.o CGUISkin.o CGUIStaticText.o CGUITabControl.o CGUITable.o CGUIToolBar.o CGUIWindow.o CGUIColorSelectDialog.o CDefaultGUIElementFactory.o CGUISpriteBank.o CGUIImageList.o CGUITreeView.o CGUIProfiler.o
|
||||||
ZLIBOBJ = zlib/adler32.o zlib/compress.o zlib/crc32.o zlib/deflate.o zlib/inffast.o zlib/inflate.o zlib/inftrees.o zlib/trees.o zlib/uncompr.o zlib/zutil.o
|
|
||||||
JPEGLIBOBJ = jpeglib/jcapimin.o jpeglib/jcapistd.o jpeglib/jccoefct.o jpeglib/jccolor.o jpeglib/jcdctmgr.o jpeglib/jchuff.o jpeglib/jcinit.o jpeglib/jcmainct.o jpeglib/jcmarker.o jpeglib/jcmaster.o jpeglib/jcomapi.o jpeglib/jcparam.o jpeglib/jcprepct.o jpeglib/jcsample.o jpeglib/jctrans.o jpeglib/jdapimin.o jpeglib/jdapistd.o jpeglib/jdatadst.o jpeglib/jdatasrc.o jpeglib/jdcoefct.o jpeglib/jdcolor.o jpeglib/jddctmgr.o jpeglib/jdhuff.o jpeglib/jdinput.o jpeglib/jdmainct.o jpeglib/jdmarker.o jpeglib/jdmaster.o jpeglib/jdmerge.o jpeglib/jdpostct.o jpeglib/jdsample.o jpeglib/jdtrans.o jpeglib/jerror.o jpeglib/jfdctflt.o jpeglib/jfdctfst.o jpeglib/jfdctint.o jpeglib/jidctflt.o jpeglib/jidctfst.o jpeglib/jidctint.o jpeglib/jmemmgr.o jpeglib/jmemnobs.o jpeglib/jquant1.o jpeglib/jquant2.o jpeglib/jutils.o jpeglib/jcarith.o jpeglib/jdarith.o jpeglib/jaricom.o
|
|
||||||
LIBPNGOBJ = libpng/png.o libpng/pngerror.o libpng/pngget.o libpng/pngmem.o libpng/pngpread.o libpng/pngread.o libpng/pngrio.o libpng/pngrtran.o libpng/pngrutil.o libpng/pngset.o libpng/pngtrans.o libpng/pngwio.o libpng/pngwrite.o libpng/pngwtran.o libpng/pngwutil.o
|
|
||||||
LIBAESGM = aesGladman/aescrypt.o aesGladman/aeskey.o aesGladman/aestab.o aesGladman/fileenc.o aesGladman/hmac.o aesGladman/prng.o aesGladman/pwd2key.o aesGladman/sha1.o aesGladman/sha2.o
|
LIBAESGM = aesGladman/aescrypt.o aesGladman/aeskey.o aesGladman/aestab.o aesGladman/fileenc.o aesGladman/hmac.o aesGladman/prng.o aesGladman/pwd2key.o aesGladman/sha1.o aesGladman/sha2.o
|
||||||
BZIP2OBJ = bzip2/blocksort.o bzip2/huffman.o bzip2/crctable.o bzip2/randtable.o bzip2/bzcompress.o bzip2/decompress.o bzip2/bzlib.o
|
|
||||||
|
|
||||||
# Next variable is for additional scene nodes etc. of customized Irrlicht versions
|
# Next variable is for additional scene nodes etc. of customized Irrlicht versions
|
||||||
EXTRAOBJ =
|
EXTRAOBJ =
|
||||||
LINKOBJ = $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
|
LINKOBJ = $(IRRMESHOBJ) $(IRROBJ) $(IRRPARTICLEOBJ) $(IRRANIMOBJ) \
|
||||||
$(IRRVIDEOOBJ) $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \
|
$(IRRVIDEOOBJ) $(IRRSWRENDEROBJ) $(IRRIOOBJ) $(IRROTHEROBJ) \
|
||||||
$(IRRGUIOBJ) $(ZLIBOBJ) $(JPEGLIBOBJ) $(LIBPNGOBJ) $(LIBAESGM) \
|
$(IRRGUIOBJ) $(LIBAESGM) $(EXTRAOBJ)
|
||||||
$(BZIP2OBJ) $(EXTRAOBJ)
|
|
||||||
|
|
||||||
emscripten: EMSCRIPTEN=1
|
emscripten: EMSCRIPTEN=1
|
||||||
|
|
||||||
###############
|
###############
|
||||||
#Compiler flags
|
#Compiler flags
|
||||||
|
|
||||||
CXXINCS = -I../../include -Izlib -Ijpeglib -Ilibpng
|
CXXINCS = -I../../include
|
||||||
CPPFLAGS += $(CXXINCS) -DIRRLICHT_EXPORTS=1
|
CPPFLAGS += $(CXXINCS) -DIRRLICHT_EXPORTS=1
|
||||||
CXXFLAGS += -Wall -pipe -fno-exceptions -fno-rtti
|
CXXFLAGS += -Wall -pipe -fno-exceptions -fno-rtti
|
||||||
#CXXFLAGS += -std=gnu++11 -U__STRICT_ANSI__
|
#CXXFLAGS += -std=gnu++11 -U__STRICT_ANSI__
|
||||||
@ -89,18 +84,18 @@ ifdef PROFILE
|
|||||||
endif
|
endif
|
||||||
ifdef EMSCRIPTEN
|
ifdef EMSCRIPTEN
|
||||||
CXXFLAGS += -std=gnu++11 -U__STRICT_ANSI__
|
CXXFLAGS += -std=gnu++11 -U__STRICT_ANSI__
|
||||||
ifndef NDEBUG
|
ifdef NDEBUG
|
||||||
CFLAGS := -DPNG_THREAD_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_NO_MNG_FEATURES -DPNG_ARM_NEON_OPT=0
|
CFLAGS := -O3
|
||||||
else
|
|
||||||
CFLAGS := -O3 -DPNG_THREAD_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_NO_MNG_FEATURES -DPNG_ARM_NEON_OPT=0
|
|
||||||
endif
|
endif
|
||||||
ifdef WASM
|
ifdef WASM
|
||||||
CXXFLAGS += -s WASM=1
|
CXXFLAGS += -s WASM=1
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
CFLAGS := -O3 -DPNG_THREAD_UNSAFE_OK -DPNG_NO_MMX_CODE -DPNG_NO_MNG_FEATURES -DPNG_ARM_NEON_OPT=0
|
CFLAGS := -O3
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
sharedlib sharedlib_osx sharedlib_win32: LDFLAGS += -lz -ljpeg -lpng -lbz2
|
||||||
|
|
||||||
sharedlib sharedlib_osx: CXXFLAGS += -fPIC
|
sharedlib sharedlib_osx: CXXFLAGS += -fPIC
|
||||||
sharedlib sharedlib_osx: CFLAGS += -fPIC
|
sharedlib sharedlib_osx: CFLAGS += -fPIC
|
||||||
|
|
||||||
|
@ -1,327 +0,0 @@
|
|||||||
------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
0.9.0
|
|
||||||
~~~~~
|
|
||||||
First version.
|
|
||||||
|
|
||||||
|
|
||||||
0.9.0a
|
|
||||||
~~~~~~
|
|
||||||
Removed 'ranlib' from Makefile, since most modern Unix-es
|
|
||||||
don't need it, or even know about it.
|
|
||||||
|
|
||||||
|
|
||||||
0.9.0b
|
|
||||||
~~~~~~
|
|
||||||
Fixed a problem with error reporting in bzip2.c. This does not effect
|
|
||||||
the library in any way. Problem is: versions 0.9.0 and 0.9.0a (of the
|
|
||||||
program proper) compress and decompress correctly, but give misleading
|
|
||||||
error messages (internal panics) when an I/O error occurs, instead of
|
|
||||||
reporting the problem correctly. This shouldn't give any data loss
|
|
||||||
(as far as I can see), but is confusing.
|
|
||||||
|
|
||||||
Made the inline declarations disappear for non-GCC compilers.
|
|
||||||
|
|
||||||
|
|
||||||
0.9.0c
|
|
||||||
~~~~~~
|
|
||||||
Fixed some problems in the library pertaining to some boundary cases.
|
|
||||||
This makes the library behave more correctly in those situations. The
|
|
||||||
fixes apply only to features (calls and parameters) not used by
|
|
||||||
bzip2.c, so the non-fixedness of them in previous versions has no
|
|
||||||
effect on reliability of bzip2.c.
|
|
||||||
|
|
||||||
In bzlib.c:
|
|
||||||
* made zero-length BZ_FLUSH work correctly in bzCompress().
|
|
||||||
* fixed bzWrite/bzRead to ignore zero-length requests.
|
|
||||||
* fixed bzread to correctly handle read requests after EOF.
|
|
||||||
* wrong parameter order in call to bzDecompressInit in
|
|
||||||
bzBuffToBuffDecompress. Fixed.
|
|
||||||
|
|
||||||
In compress.c:
|
|
||||||
* changed setting of nGroups in sendMTFValues() so as to
|
|
||||||
do a bit better on small files. This _does_ effect
|
|
||||||
bzip2.c.
|
|
||||||
|
|
||||||
|
|
||||||
0.9.5a
|
|
||||||
~~~~~~
|
|
||||||
Major change: add a fallback sorting algorithm (blocksort.c)
|
|
||||||
to give reasonable behaviour even for very repetitive inputs.
|
|
||||||
Nuked --repetitive-best and --repetitive-fast since they are
|
|
||||||
no longer useful.
|
|
||||||
|
|
||||||
Minor changes: mostly a whole bunch of small changes/
|
|
||||||
bugfixes in the driver (bzip2.c). Changes pertaining to the
|
|
||||||
user interface are:
|
|
||||||
|
|
||||||
allow decompression of symlink'd files to stdout
|
|
||||||
decompress/test files even without .bz2 extension
|
|
||||||
give more accurate error messages for I/O errors
|
|
||||||
when compressing/decompressing to stdout, don't catch control-C
|
|
||||||
read flags from BZIP2 and BZIP environment variables
|
|
||||||
decline to break hard links to a file unless forced with -f
|
|
||||||
allow -c flag even with no filenames
|
|
||||||
preserve file ownerships as far as possible
|
|
||||||
make -s -1 give the expected block size (100k)
|
|
||||||
add a flag -q --quiet to suppress nonessential warnings
|
|
||||||
stop decoding flags after --, so files beginning in - can be handled
|
|
||||||
resolved inconsistent naming: bzcat or bz2cat ?
|
|
||||||
bzip2 --help now returns 0
|
|
||||||
|
|
||||||
Programming-level changes are:
|
|
||||||
|
|
||||||
fixed syntax error in GET_LL4 for Borland C++ 5.02
|
|
||||||
let bzBuffToBuffDecompress return BZ_DATA_ERROR{_MAGIC}
|
|
||||||
fix overshoot of mode-string end in bzopen_or_bzdopen
|
|
||||||
wrapped bzlib.h in #ifdef __cplusplus ... extern "C" { ... }
|
|
||||||
close file handles under all error conditions
|
|
||||||
added minor mods so it compiles with DJGPP out of the box
|
|
||||||
fixed Makefile so it doesn't give problems with BSD make
|
|
||||||
fix uninitialised memory reads in dlltest.c
|
|
||||||
|
|
||||||
0.9.5b
|
|
||||||
~~~~~~
|
|
||||||
Open stdin/stdout in binary mode for DJGPP.
|
|
||||||
|
|
||||||
0.9.5c
|
|
||||||
~~~~~~
|
|
||||||
Changed BZ_N_OVERSHOOT to be ... + 2 instead of ... + 1. The + 1
|
|
||||||
version could cause the sorted order to be wrong in some extremely
|
|
||||||
obscure cases. Also changed setting of quadrant in blocksort.c.
|
|
||||||
|
|
||||||
0.9.5d
|
|
||||||
~~~~~~
|
|
||||||
The only functional change is to make bzlibVersion() in the library
|
|
||||||
return the correct string. This has no effect whatsoever on the
|
|
||||||
functioning of the bzip2 program or library. Added a couple of casts
|
|
||||||
so the library compiles without warnings at level 3 in MS Visual
|
|
||||||
Studio 6.0. Included a Y2K statement in the file Y2K_INFO. All other
|
|
||||||
changes are minor documentation changes.
|
|
||||||
|
|
||||||
1.0
|
|
||||||
~~~
|
|
||||||
Several minor bugfixes and enhancements:
|
|
||||||
|
|
||||||
* Large file support. The library uses 64-bit counters to
|
|
||||||
count the volume of data passing through it. bzip2.c
|
|
||||||
is now compiled with -D_FILE_OFFSET_BITS=64 to get large
|
|
||||||
file support from the C library. -v correctly prints out
|
|
||||||
file sizes greater than 4 gigabytes. All these changes have
|
|
||||||
been made without assuming a 64-bit platform or a C compiler
|
|
||||||
which supports 64-bit ints, so, except for the C library
|
|
||||||
aspect, they are fully portable.
|
|
||||||
|
|
||||||
* Decompression robustness. The library/program should be
|
|
||||||
robust to any corruption of compressed data, detecting and
|
|
||||||
handling _all_ corruption, instead of merely relying on
|
|
||||||
the CRCs. What this means is that the program should
|
|
||||||
never crash, given corrupted data, and the library should
|
|
||||||
always return BZ_DATA_ERROR.
|
|
||||||
|
|
||||||
* Fixed an obscure race-condition bug only ever observed on
|
|
||||||
Solaris, in which, if you were very unlucky and issued
|
|
||||||
control-C at exactly the wrong time, both input and output
|
|
||||||
files would be deleted.
|
|
||||||
|
|
||||||
* Don't run out of file handles on test/decompression when
|
|
||||||
large numbers of files have invalid magic numbers.
|
|
||||||
|
|
||||||
* Avoid library namespace pollution. Prefix all exported
|
|
||||||
symbols with BZ2_.
|
|
||||||
|
|
||||||
* Minor sorting enhancements from my DCC2000 paper.
|
|
||||||
|
|
||||||
* Advance the version number to 1.0, so as to counteract the
|
|
||||||
(false-in-this-case) impression some people have that programs
|
|
||||||
with version numbers less than 1.0 are in some way, experimental,
|
|
||||||
pre-release versions.
|
|
||||||
|
|
||||||
* Create an initial Makefile-libbz2_so to build a shared library.
|
|
||||||
Yes, I know I should really use libtool et al ...
|
|
||||||
|
|
||||||
* Make the program exit with 2 instead of 0 when decompression
|
|
||||||
fails due to a bad magic number (ie, an invalid bzip2 header).
|
|
||||||
Also exit with 1 (as the manual claims :-) whenever a diagnostic
|
|
||||||
message would have been printed AND the corresponding operation
|
|
||||||
is aborted, for example
|
|
||||||
bzip2: Output file xx already exists.
|
|
||||||
When a diagnostic message is printed but the operation is not
|
|
||||||
aborted, for example
|
|
||||||
bzip2: Can't guess original name for wurble -- using wurble.out
|
|
||||||
then the exit value 0 is returned, unless some other problem is
|
|
||||||
also detected.
|
|
||||||
|
|
||||||
I think it corresponds more closely to what the manual claims now.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.1
|
|
||||||
~~~~~
|
|
||||||
* Modified dlltest.c so it uses the new BZ2_ naming scheme.
|
|
||||||
* Modified makefile-msc to fix minor build probs on Win2k.
|
|
||||||
* Updated README.COMPILATION.PROBLEMS.
|
|
||||||
|
|
||||||
There are no functionality changes or bug fixes relative to version
|
|
||||||
1.0.0. This is just a documentation update + a fix for minor Win32
|
|
||||||
build problems. For almost everyone, upgrading from 1.0.0 to 1.0.1 is
|
|
||||||
utterly pointless. Don't bother.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.2
|
|
||||||
~~~~~
|
|
||||||
A bug fix release, addressing various minor issues which have appeared
|
|
||||||
in the 18 or so months since 1.0.1 was released. Most of the fixes
|
|
||||||
are to do with file-handling or documentation bugs. To the best of my
|
|
||||||
knowledge, there have been no data-loss-causing bugs reported in the
|
|
||||||
compression/decompression engine of 1.0.0 or 1.0.1.
|
|
||||||
|
|
||||||
Note that this release does not improve the rather crude build system
|
|
||||||
for Unix platforms. The general plan here is to autoconfiscate/
|
|
||||||
libtoolise 1.0.2 soon after release, and release the result as 1.1.0
|
|
||||||
or perhaps 1.2.0. That, however, is still just a plan at this point.
|
|
||||||
|
|
||||||
Here are the changes in 1.0.2. Bug-reporters and/or patch-senders in
|
|
||||||
parentheses.
|
|
||||||
|
|
||||||
* Fix an infinite segfault loop in 1.0.1 when a directory is
|
|
||||||
encountered in -f (force) mode.
|
|
||||||
(Trond Eivind Glomsrod, Nicholas Nethercote, Volker Schmidt)
|
|
||||||
|
|
||||||
* Avoid double fclose() of output file on certain I/O error paths.
|
|
||||||
(Solar Designer)
|
|
||||||
|
|
||||||
* Don't fail with internal error 1007 when fed a long stream (> 48MB)
|
|
||||||
of byte 251. Also print useful message suggesting that 1007s may be
|
|
||||||
caused by bad memory.
|
|
||||||
(noticed by Juan Pedro Vallejo, fixed by me)
|
|
||||||
|
|
||||||
* Fix uninitialised variable silly bug in demo prog dlltest.c.
|
|
||||||
(Jorj Bauer)
|
|
||||||
|
|
||||||
* Remove 512-MB limitation on recovered file size for bzip2recover
|
|
||||||
on selected platforms which support 64-bit ints. At the moment
|
|
||||||
all GCC supported platforms, and Win32.
|
|
||||||
(me, Alson van der Meulen)
|
|
||||||
|
|
||||||
* Hard-code header byte values, to give correct operation on platforms
|
|
||||||
using EBCDIC as their native character set (IBM's OS/390).
|
|
||||||
(Leland Lucius)
|
|
||||||
|
|
||||||
* Copy file access times correctly.
|
|
||||||
(Marty Leisner)
|
|
||||||
|
|
||||||
* Add distclean and check targets to Makefile.
|
|
||||||
(Michael Carmack)
|
|
||||||
|
|
||||||
* Parameterise use of ar and ranlib in Makefile. Also add $(LDFLAGS).
|
|
||||||
(Rich Ireland, Bo Thorsen)
|
|
||||||
|
|
||||||
* Pass -p (create parent dirs as needed) to mkdir during make install.
|
|
||||||
(Jeremy Fusco)
|
|
||||||
|
|
||||||
* Dereference symlinks when copying file permissions in -f mode.
|
|
||||||
(Volker Schmidt)
|
|
||||||
|
|
||||||
* Majorly simplify implementation of uInt64_qrm10.
|
|
||||||
(Bo Lindbergh)
|
|
||||||
|
|
||||||
* Check the input file still exists before deleting the output one,
|
|
||||||
when aborting in cleanUpAndFail().
|
|
||||||
(Joerg Prante, Robert Linden, Matthias Krings)
|
|
||||||
|
|
||||||
Also a bunch of patches courtesy of Philippe Troin, the Debian maintainer
|
|
||||||
of bzip2:
|
|
||||||
|
|
||||||
* Wrapper scripts (with manpages): bzdiff, bzgrep, bzmore.
|
|
||||||
|
|
||||||
* Spelling changes and minor enhancements in bzip2.1.
|
|
||||||
|
|
||||||
* Avoid race condition between creating the output file and setting its
|
|
||||||
interim permissions safely, by using fopen_output_safely().
|
|
||||||
No changes to bzip2recover since there is no issue with file
|
|
||||||
permissions there.
|
|
||||||
|
|
||||||
* do not print senseless report with -v when compressing an empty
|
|
||||||
file.
|
|
||||||
|
|
||||||
* bzcat -f works on non-bzip2 files.
|
|
||||||
|
|
||||||
* do not try to escape shell meta-characters on unix (the shell takes
|
|
||||||
care of these).
|
|
||||||
|
|
||||||
* added --fast and --best aliases for -1 -9 for gzip compatibility.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.3 (15 Feb 05)
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
Fixes some minor bugs since the last version, 1.0.2.
|
|
||||||
|
|
||||||
* Further robustification against corrupted compressed data.
|
|
||||||
There are currently no known bitstreams which can cause the
|
|
||||||
decompressor to crash, loop or access memory which does not
|
|
||||||
belong to it. If you are using bzip2 or the library to
|
|
||||||
decompress bitstreams from untrusted sources, an upgrade
|
|
||||||
to 1.0.3 is recommended. This fixes CAN-2005-1260.
|
|
||||||
|
|
||||||
* The documentation has been converted to XML, from which html
|
|
||||||
and pdf can be derived.
|
|
||||||
|
|
||||||
* Various minor bugs in the documentation have been fixed.
|
|
||||||
|
|
||||||
* Fixes for various compilation warnings with newer versions of
|
|
||||||
gcc, and on 64-bit platforms.
|
|
||||||
|
|
||||||
* The BZ_NO_STDIO cpp symbol was not properly observed in 1.0.2.
|
|
||||||
This has been fixed.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.4 (20 Dec 06)
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
Fixes some minor bugs since the last version, 1.0.3.
|
|
||||||
|
|
||||||
* Fix file permissions race problem (CAN-2005-0953).
|
|
||||||
|
|
||||||
* Avoid possible segfault in BZ2_bzclose. From Coverity's NetBSD
|
|
||||||
scan.
|
|
||||||
|
|
||||||
* 'const'/prototype cleanups in the C code.
|
|
||||||
|
|
||||||
* Change default install location to /usr/local, and handle multiple
|
|
||||||
'make install's without error.
|
|
||||||
|
|
||||||
* Sanitise file names more carefully in bzgrep. Fixes CAN-2005-0758
|
|
||||||
to the extent that applies to bzgrep.
|
|
||||||
|
|
||||||
* Use 'mktemp' rather than 'tempfile' in bzdiff.
|
|
||||||
|
|
||||||
* Tighten up a couple of assertions in blocksort.c following automated
|
|
||||||
analysis.
|
|
||||||
|
|
||||||
* Fix minor doc/comment bugs.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.5 (10 Dec 07)
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
Security fix only. Fixes CERT-FI 20469 as it applies to bzip2.
|
|
||||||
|
|
||||||
|
|
||||||
1.0.6 (6 Sept 10)
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
* Security fix for CVE-2010-0405. This was reported by Mikolaj
|
|
||||||
Izdebski.
|
|
||||||
|
|
||||||
* Make the documentation build on Ubuntu 10.04
|
|
@ -1,42 +0,0 @@
|
|||||||
|
|
||||||
--------------------------------------------------------------------------
|
|
||||||
|
|
||||||
This program, "bzip2", the associated library "libbzip2", and all
|
|
||||||
documentation, are copyright (C) 1996-2010 Julian R Seward. All
|
|
||||||
rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
2. The origin of this software must not be misrepresented; you must
|
|
||||||
not claim that you wrote the original software. If you use this
|
|
||||||
software in a product, an acknowledgment in the product
|
|
||||||
documentation would be appreciated but is not required.
|
|
||||||
|
|
||||||
3. Altered source versions must be plainly marked as such, and must
|
|
||||||
not be misrepresented as being the original software.
|
|
||||||
|
|
||||||
4. The name of the author may not be used to endorse or promote
|
|
||||||
products derived from this software without specific prior written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
|
|
||||||
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
|
||||||
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
|
||||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
Julian Seward, jseward@bzip.org
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------
|
|
@ -1,217 +0,0 @@
|
|||||||
# ------------------------------------------------------------------
|
|
||||||
# This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
# lossless, block-sorting data compression.
|
|
||||||
#
|
|
||||||
# bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
#
|
|
||||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
# README file.
|
|
||||||
#
|
|
||||||
# This program is released under the terms of the license contained
|
|
||||||
# in the file LICENSE.
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
|
|
||||||
SHELL=/bin/sh
|
|
||||||
|
|
||||||
# To assist in cross-compiling
|
|
||||||
CC=gcc
|
|
||||||
AR=ar
|
|
||||||
RANLIB=ranlib
|
|
||||||
LDFLAGS=
|
|
||||||
|
|
||||||
BIGFILES=-D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS=-Wall -Winline -O2 -g $(BIGFILES)
|
|
||||||
|
|
||||||
# Where you want it installed when you do 'make install'
|
|
||||||
PREFIX=/usr/local
|
|
||||||
|
|
||||||
|
|
||||||
OBJS= blocksort.o \
|
|
||||||
huffman.o \
|
|
||||||
crctable.o \
|
|
||||||
randtable.o \
|
|
||||||
compress.o \
|
|
||||||
decompress.o \
|
|
||||||
bzlib.o
|
|
||||||
|
|
||||||
all: libbz2.a bzip2 bzip2recover test
|
|
||||||
|
|
||||||
bzip2: libbz2.a bzip2.o
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2 bzip2.o -L. -lbz2
|
|
||||||
|
|
||||||
bzip2recover: bzip2recover.o
|
|
||||||
$(CC) $(CFLAGS) $(LDFLAGS) -o bzip2recover bzip2recover.o
|
|
||||||
|
|
||||||
libbz2.a: $(OBJS)
|
|
||||||
rm -f libbz2.a
|
|
||||||
$(AR) cq libbz2.a $(OBJS)
|
|
||||||
@if ( test -f $(RANLIB) -o -f /usr/bin/ranlib -o \
|
|
||||||
-f /bin/ranlib -o -f /usr/ccs/bin/ranlib ) ; then \
|
|
||||||
echo $(RANLIB) libbz2.a ; \
|
|
||||||
$(RANLIB) libbz2.a ; \
|
|
||||||
fi
|
|
||||||
|
|
||||||
check: test
|
|
||||||
test: bzip2
|
|
||||||
@cat words1
|
|
||||||
./bzip2 -1 < sample1.ref > sample1.rb2
|
|
||||||
./bzip2 -2 < sample2.ref > sample2.rb2
|
|
||||||
./bzip2 -3 < sample3.ref > sample3.rb2
|
|
||||||
./bzip2 -d < sample1.bz2 > sample1.tst
|
|
||||||
./bzip2 -d < sample2.bz2 > sample2.tst
|
|
||||||
./bzip2 -ds < sample3.bz2 > sample3.tst
|
|
||||||
cmp sample1.bz2 sample1.rb2
|
|
||||||
cmp sample2.bz2 sample2.rb2
|
|
||||||
cmp sample3.bz2 sample3.rb2
|
|
||||||
cmp sample1.tst sample1.ref
|
|
||||||
cmp sample2.tst sample2.ref
|
|
||||||
cmp sample3.tst sample3.ref
|
|
||||||
@cat words3
|
|
||||||
|
|
||||||
install: bzip2 bzip2recover
|
|
||||||
if ( test ! -d $(PREFIX)/bin ) ; then mkdir -p $(PREFIX)/bin ; fi
|
|
||||||
if ( test ! -d $(PREFIX)/lib ) ; then mkdir -p $(PREFIX)/lib ; fi
|
|
||||||
if ( test ! -d $(PREFIX)/man ) ; then mkdir -p $(PREFIX)/man ; fi
|
|
||||||
if ( test ! -d $(PREFIX)/man/man1 ) ; then mkdir -p $(PREFIX)/man/man1 ; fi
|
|
||||||
if ( test ! -d $(PREFIX)/include ) ; then mkdir -p $(PREFIX)/include ; fi
|
|
||||||
cp -f bzip2 $(PREFIX)/bin/bzip2
|
|
||||||
cp -f bzip2 $(PREFIX)/bin/bunzip2
|
|
||||||
cp -f bzip2 $(PREFIX)/bin/bzcat
|
|
||||||
cp -f bzip2recover $(PREFIX)/bin/bzip2recover
|
|
||||||
chmod a+x $(PREFIX)/bin/bzip2
|
|
||||||
chmod a+x $(PREFIX)/bin/bunzip2
|
|
||||||
chmod a+x $(PREFIX)/bin/bzcat
|
|
||||||
chmod a+x $(PREFIX)/bin/bzip2recover
|
|
||||||
cp -f bzip2.1 $(PREFIX)/man/man1
|
|
||||||
chmod a+r $(PREFIX)/man/man1/bzip2.1
|
|
||||||
cp -f bzlib.h $(PREFIX)/include
|
|
||||||
chmod a+r $(PREFIX)/include/bzlib.h
|
|
||||||
cp -f libbz2.a $(PREFIX)/lib
|
|
||||||
chmod a+r $(PREFIX)/lib/libbz2.a
|
|
||||||
cp -f bzgrep $(PREFIX)/bin/bzgrep
|
|
||||||
ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzegrep
|
|
||||||
ln -s -f $(PREFIX)/bin/bzgrep $(PREFIX)/bin/bzfgrep
|
|
||||||
chmod a+x $(PREFIX)/bin/bzgrep
|
|
||||||
cp -f bzmore $(PREFIX)/bin/bzmore
|
|
||||||
ln -s -f $(PREFIX)/bin/bzmore $(PREFIX)/bin/bzless
|
|
||||||
chmod a+x $(PREFIX)/bin/bzmore
|
|
||||||
cp -f bzdiff $(PREFIX)/bin/bzdiff
|
|
||||||
ln -s -f $(PREFIX)/bin/bzdiff $(PREFIX)/bin/bzcmp
|
|
||||||
chmod a+x $(PREFIX)/bin/bzdiff
|
|
||||||
cp -f bzgrep.1 bzmore.1 bzdiff.1 $(PREFIX)/man/man1
|
|
||||||
chmod a+r $(PREFIX)/man/man1/bzgrep.1
|
|
||||||
chmod a+r $(PREFIX)/man/man1/bzmore.1
|
|
||||||
chmod a+r $(PREFIX)/man/man1/bzdiff.1
|
|
||||||
echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzegrep.1
|
|
||||||
echo ".so man1/bzgrep.1" > $(PREFIX)/man/man1/bzfgrep.1
|
|
||||||
echo ".so man1/bzmore.1" > $(PREFIX)/man/man1/bzless.1
|
|
||||||
echo ".so man1/bzdiff.1" > $(PREFIX)/man/man1/bzcmp.1
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o libbz2.a bzip2 bzip2recover \
|
|
||||||
sample1.rb2 sample2.rb2 sample3.rb2 \
|
|
||||||
sample1.tst sample2.tst sample3.tst
|
|
||||||
|
|
||||||
blocksort.o: blocksort.c
|
|
||||||
@cat words0
|
|
||||||
$(CC) $(CFLAGS) -c blocksort.c
|
|
||||||
huffman.o: huffman.c
|
|
||||||
$(CC) $(CFLAGS) -c huffman.c
|
|
||||||
crctable.o: crctable.c
|
|
||||||
$(CC) $(CFLAGS) -c crctable.c
|
|
||||||
randtable.o: randtable.c
|
|
||||||
$(CC) $(CFLAGS) -c randtable.c
|
|
||||||
compress.o: compress.c
|
|
||||||
$(CC) $(CFLAGS) -c compress.c
|
|
||||||
decompress.o: decompress.c
|
|
||||||
$(CC) $(CFLAGS) -c decompress.c
|
|
||||||
bzlib.o: bzlib.c
|
|
||||||
$(CC) $(CFLAGS) -c bzlib.c
|
|
||||||
bzip2.o: bzip2.c
|
|
||||||
$(CC) $(CFLAGS) -c bzip2.c
|
|
||||||
bzip2recover.o: bzip2recover.c
|
|
||||||
$(CC) $(CFLAGS) -c bzip2recover.c
|
|
||||||
|
|
||||||
|
|
||||||
distclean: clean
|
|
||||||
rm -f manual.ps manual.html manual.pdf
|
|
||||||
|
|
||||||
DISTNAME=bzip2-1.0.6
|
|
||||||
dist: check manual
|
|
||||||
rm -f $(DISTNAME)
|
|
||||||
ln -s -f . $(DISTNAME)
|
|
||||||
tar cvf $(DISTNAME).tar \
|
|
||||||
$(DISTNAME)/blocksort.c \
|
|
||||||
$(DISTNAME)/huffman.c \
|
|
||||||
$(DISTNAME)/crctable.c \
|
|
||||||
$(DISTNAME)/randtable.c \
|
|
||||||
$(DISTNAME)/compress.c \
|
|
||||||
$(DISTNAME)/decompress.c \
|
|
||||||
$(DISTNAME)/bzlib.c \
|
|
||||||
$(DISTNAME)/bzip2.c \
|
|
||||||
$(DISTNAME)/bzip2recover.c \
|
|
||||||
$(DISTNAME)/bzlib.h \
|
|
||||||
$(DISTNAME)/bzlib_private.h \
|
|
||||||
$(DISTNAME)/Makefile \
|
|
||||||
$(DISTNAME)/LICENSE \
|
|
||||||
$(DISTNAME)/bzip2.1 \
|
|
||||||
$(DISTNAME)/bzip2.1.preformatted \
|
|
||||||
$(DISTNAME)/bzip2.txt \
|
|
||||||
$(DISTNAME)/words0 \
|
|
||||||
$(DISTNAME)/words1 \
|
|
||||||
$(DISTNAME)/words2 \
|
|
||||||
$(DISTNAME)/words3 \
|
|
||||||
$(DISTNAME)/sample1.ref \
|
|
||||||
$(DISTNAME)/sample2.ref \
|
|
||||||
$(DISTNAME)/sample3.ref \
|
|
||||||
$(DISTNAME)/sample1.bz2 \
|
|
||||||
$(DISTNAME)/sample2.bz2 \
|
|
||||||
$(DISTNAME)/sample3.bz2 \
|
|
||||||
$(DISTNAME)/dlltest.c \
|
|
||||||
$(DISTNAME)/manual.html \
|
|
||||||
$(DISTNAME)/manual.pdf \
|
|
||||||
$(DISTNAME)/manual.ps \
|
|
||||||
$(DISTNAME)/README \
|
|
||||||
$(DISTNAME)/README.COMPILATION.PROBLEMS \
|
|
||||||
$(DISTNAME)/README.XML.STUFF \
|
|
||||||
$(DISTNAME)/CHANGES \
|
|
||||||
$(DISTNAME)/libbz2.def \
|
|
||||||
$(DISTNAME)/libbz2.dsp \
|
|
||||||
$(DISTNAME)/dlltest.dsp \
|
|
||||||
$(DISTNAME)/makefile.msc \
|
|
||||||
$(DISTNAME)/unzcrash.c \
|
|
||||||
$(DISTNAME)/spewG.c \
|
|
||||||
$(DISTNAME)/mk251.c \
|
|
||||||
$(DISTNAME)/bzdiff \
|
|
||||||
$(DISTNAME)/bzdiff.1 \
|
|
||||||
$(DISTNAME)/bzmore \
|
|
||||||
$(DISTNAME)/bzmore.1 \
|
|
||||||
$(DISTNAME)/bzgrep \
|
|
||||||
$(DISTNAME)/bzgrep.1 \
|
|
||||||
$(DISTNAME)/Makefile-libbz2_so \
|
|
||||||
$(DISTNAME)/bz-common.xsl \
|
|
||||||
$(DISTNAME)/bz-fo.xsl \
|
|
||||||
$(DISTNAME)/bz-html.xsl \
|
|
||||||
$(DISTNAME)/bzip.css \
|
|
||||||
$(DISTNAME)/entities.xml \
|
|
||||||
$(DISTNAME)/manual.xml \
|
|
||||||
$(DISTNAME)/format.pl \
|
|
||||||
$(DISTNAME)/xmlproc.sh
|
|
||||||
gzip -v $(DISTNAME).tar
|
|
||||||
|
|
||||||
# For rebuilding the manual from sources on my SuSE 9.1 box
|
|
||||||
|
|
||||||
MANUAL_SRCS= bz-common.xsl bz-fo.xsl bz-html.xsl bzip.css \
|
|
||||||
entities.xml manual.xml
|
|
||||||
|
|
||||||
manual: manual.html manual.ps manual.pdf
|
|
||||||
|
|
||||||
manual.ps: $(MANUAL_SRCS)
|
|
||||||
./xmlproc.sh -ps manual.xml
|
|
||||||
|
|
||||||
manual.pdf: $(MANUAL_SRCS)
|
|
||||||
./xmlproc.sh -pdf manual.xml
|
|
||||||
|
|
||||||
manual.html: $(MANUAL_SRCS)
|
|
||||||
./xmlproc.sh -html manual.xml
|
|
@ -1,59 +0,0 @@
|
|||||||
|
|
||||||
# This Makefile builds a shared version of the library,
|
|
||||||
# libbz2.so.1.0.6, with soname libbz2.so.1.0,
|
|
||||||
# at least on x86-Linux (RedHat 7.2),
|
|
||||||
# with gcc-2.96 20000731 (Red Hat Linux 7.1 2.96-98).
|
|
||||||
# Please see the README file for some important info
|
|
||||||
# about building the library like this.
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
# This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
# lossless, block-sorting data compression.
|
|
||||||
#
|
|
||||||
# bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
#
|
|
||||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
# README file.
|
|
||||||
#
|
|
||||||
# This program is released under the terms of the license contained
|
|
||||||
# in the file LICENSE.
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
SHELL=/bin/sh
|
|
||||||
CC=gcc
|
|
||||||
BIGFILES=-D_FILE_OFFSET_BITS=64
|
|
||||||
CFLAGS=-fpic -fPIC -Wall -Winline -O2 -g $(BIGFILES)
|
|
||||||
|
|
||||||
OBJS= blocksort.o \
|
|
||||||
huffman.o \
|
|
||||||
crctable.o \
|
|
||||||
randtable.o \
|
|
||||||
compress.o \
|
|
||||||
decompress.o \
|
|
||||||
bzlib.o
|
|
||||||
|
|
||||||
all: $(OBJS)
|
|
||||||
$(CC) -shared -Wl,-soname -Wl,libbz2.so.1.0 -o libbz2.so.1.0.6 $(OBJS)
|
|
||||||
$(CC) $(CFLAGS) -o bzip2-shared bzip2.c libbz2.so.1.0.6
|
|
||||||
rm -f libbz2.so.1.0
|
|
||||||
ln -s libbz2.so.1.0.6 libbz2.so.1.0
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f $(OBJS) bzip2.o libbz2.so.1.0.6 libbz2.so.1.0 bzip2-shared
|
|
||||||
|
|
||||||
blocksort.o: blocksort.c
|
|
||||||
$(CC) $(CFLAGS) -c blocksort.c
|
|
||||||
huffman.o: huffman.c
|
|
||||||
$(CC) $(CFLAGS) -c huffman.c
|
|
||||||
crctable.o: crctable.c
|
|
||||||
$(CC) $(CFLAGS) -c crctable.c
|
|
||||||
randtable.o: randtable.c
|
|
||||||
$(CC) $(CFLAGS) -c randtable.c
|
|
||||||
compress.o: compress.c
|
|
||||||
$(CC) $(CFLAGS) -c compress.c
|
|
||||||
decompress.o: decompress.c
|
|
||||||
$(CC) $(CFLAGS) -c decompress.c
|
|
||||||
bzlib.o: bzlib.c
|
|
||||||
$(CC) $(CFLAGS) -c bzlib.c
|
|
@ -1,215 +0,0 @@
|
|||||||
|
|
||||||
This is the README for bzip2/libzip2.
|
|
||||||
This version is fully compatible with the previous public releases.
|
|
||||||
|
|
||||||
------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in this file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------
|
|
||||||
|
|
||||||
Complete documentation is available in Postscript form (manual.ps),
|
|
||||||
PDF (manual.pdf) or html (manual.html). A plain-text version of the
|
|
||||||
manual page is available as bzip2.txt.
|
|
||||||
|
|
||||||
|
|
||||||
HOW TO BUILD -- UNIX
|
|
||||||
|
|
||||||
Type 'make'. This builds the library libbz2.a and then the programs
|
|
||||||
bzip2 and bzip2recover. Six self-tests are run. If the self-tests
|
|
||||||
complete ok, carry on to installation:
|
|
||||||
|
|
||||||
To install in /usr/local/bin, /usr/local/lib, /usr/local/man and
|
|
||||||
/usr/local/include, type
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
|
|
||||||
|
|
||||||
make install PREFIX=/xxx/yyy
|
|
||||||
|
|
||||||
If you are (justifiably) paranoid and want to see what 'make install'
|
|
||||||
is going to do, you can first do
|
|
||||||
|
|
||||||
make -n install or
|
|
||||||
make -n install PREFIX=/xxx/yyy respectively.
|
|
||||||
|
|
||||||
The -n instructs make to show the commands it would execute, but not
|
|
||||||
actually execute them.
|
|
||||||
|
|
||||||
|
|
||||||
HOW TO BUILD -- UNIX, shared library libbz2.so.
|
|
||||||
|
|
||||||
Do 'make -f Makefile-libbz2_so'. This Makefile seems to work for
|
|
||||||
Linux-ELF (RedHat 7.2 on an x86 box), with gcc. I make no claims
|
|
||||||
that it works for any other platform, though I suspect it probably
|
|
||||||
will work for most platforms employing both ELF and gcc.
|
|
||||||
|
|
||||||
bzip2-shared, a client of the shared library, is also built, but not
|
|
||||||
self-tested. So I suggest you also build using the normal Makefile,
|
|
||||||
since that conducts a self-test. A second reason to prefer the
|
|
||||||
version statically linked to the library is that, on x86 platforms,
|
|
||||||
building shared objects makes a valuable register (%ebx) unavailable
|
|
||||||
to gcc, resulting in a slowdown of 10%-20%, at least for bzip2.
|
|
||||||
|
|
||||||
Important note for people upgrading .so's from 0.9.0/0.9.5 to version
|
|
||||||
1.0.X. All the functions in the library have been renamed, from (eg)
|
|
||||||
bzCompress to BZ2_bzCompress, to avoid namespace pollution.
|
|
||||||
Unfortunately this means that the libbz2.so created by
|
|
||||||
Makefile-libbz2_so will not work with any program which used an older
|
|
||||||
version of the library. I do encourage library clients to make the
|
|
||||||
effort to upgrade to use version 1.0, since it is both faster and more
|
|
||||||
robust than previous versions.
|
|
||||||
|
|
||||||
|
|
||||||
HOW TO BUILD -- Windows 95, NT, DOS, Mac, etc.
|
|
||||||
|
|
||||||
It's difficult for me to support compilation on all these platforms.
|
|
||||||
My approach is to collect binaries for these platforms, and put them
|
|
||||||
on the master web site (http://www.bzip.org). Look there. However
|
|
||||||
(FWIW), bzip2-1.0.X is very standard ANSI C and should compile
|
|
||||||
unmodified with MS Visual C. If you have difficulties building, you
|
|
||||||
might want to read README.COMPILATION.PROBLEMS.
|
|
||||||
|
|
||||||
At least using MS Visual C++ 6, you can build from the unmodified
|
|
||||||
sources by issuing, in a command shell:
|
|
||||||
|
|
||||||
nmake -f makefile.msc
|
|
||||||
|
|
||||||
(you may need to first run the MSVC-provided script VCVARS32.BAT
|
|
||||||
so as to set up paths to the MSVC tools correctly).
|
|
||||||
|
|
||||||
|
|
||||||
VALIDATION
|
|
||||||
|
|
||||||
Correct operation, in the sense that a compressed file can always be
|
|
||||||
decompressed to reproduce the original, is obviously of paramount
|
|
||||||
importance. To validate bzip2, I used a modified version of Mark
|
|
||||||
Nelson's churn program. Churn is an automated test driver which
|
|
||||||
recursively traverses a directory structure, using bzip2 to compress
|
|
||||||
and then decompress each file it encounters, and checking that the
|
|
||||||
decompressed data is the same as the original.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Please read and be aware of the following:
|
|
||||||
|
|
||||||
WARNING:
|
|
||||||
|
|
||||||
This program and library (attempts to) compress data by
|
|
||||||
performing several non-trivial transformations on it.
|
|
||||||
Unless you are 100% familiar with *all* the algorithms
|
|
||||||
contained herein, and with the consequences of modifying them,
|
|
||||||
you should NOT meddle with the compression or decompression
|
|
||||||
machinery. Incorrect changes can and very likely *will*
|
|
||||||
lead to disastrous loss of data.
|
|
||||||
|
|
||||||
|
|
||||||
DISCLAIMER:
|
|
||||||
|
|
||||||
I TAKE NO RESPONSIBILITY FOR ANY LOSS OF DATA ARISING FROM THE
|
|
||||||
USE OF THIS PROGRAM/LIBRARY, HOWSOEVER CAUSED.
|
|
||||||
|
|
||||||
Every compression of a file implies an assumption that the
|
|
||||||
compressed file can be decompressed to reproduce the original.
|
|
||||||
Great efforts in design, coding and testing have been made to
|
|
||||||
ensure that this program works correctly. However, the complexity
|
|
||||||
of the algorithms, and, in particular, the presence of various
|
|
||||||
special cases in the code which occur with very low but non-zero
|
|
||||||
probability make it impossible to rule out the possibility of bugs
|
|
||||||
remaining in the program. DO NOT COMPRESS ANY DATA WITH THIS
|
|
||||||
PROGRAM UNLESS YOU ARE PREPARED TO ACCEPT THE POSSIBILITY, HOWEVER
|
|
||||||
SMALL, THAT THE DATA WILL NOT BE RECOVERABLE.
|
|
||||||
|
|
||||||
That is not to say this program is inherently unreliable.
|
|
||||||
Indeed, I very much hope the opposite is true. bzip2/libbzip2
|
|
||||||
has been carefully constructed and extensively tested.
|
|
||||||
|
|
||||||
|
|
||||||
PATENTS:
|
|
||||||
|
|
||||||
To the best of my knowledge, bzip2/libbzip2 does not use any
|
|
||||||
patented algorithms. However, I do not have the resources
|
|
||||||
to carry out a patent search. Therefore I cannot give any
|
|
||||||
guarantee of the above statement.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
WHAT'S NEW IN 0.9.0 (as compared to 0.1pl2) ?
|
|
||||||
|
|
||||||
* Approx 10% faster compression, 30% faster decompression
|
|
||||||
* -t (test mode) is a lot quicker
|
|
||||||
* Can decompress concatenated compressed files
|
|
||||||
* Programming interface, so programs can directly read/write .bz2 files
|
|
||||||
* Less restrictive (BSD-style) licensing
|
|
||||||
* Flag handling more compatible with GNU gzip
|
|
||||||
* Much more documentation, i.e., a proper user manual
|
|
||||||
* Hopefully, improved portability (at least of the library)
|
|
||||||
|
|
||||||
WHAT'S NEW IN 0.9.5 ?
|
|
||||||
|
|
||||||
* Compression speed is much less sensitive to the input
|
|
||||||
data than in previous versions. Specifically, the very
|
|
||||||
slow performance caused by repetitive data is fixed.
|
|
||||||
* Many small improvements in file and flag handling.
|
|
||||||
* A Y2K statement.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.0 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.2 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.3 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.4 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.5 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
WHAT'S NEW IN 1.0.6 ?
|
|
||||||
|
|
||||||
See the CHANGES file.
|
|
||||||
|
|
||||||
|
|
||||||
I hope you find bzip2 useful. Feel free to contact me at
|
|
||||||
jseward@bzip.org
|
|
||||||
if you have any suggestions or queries. Many people mailed me with
|
|
||||||
comments, suggestions and patches after the releases of bzip-0.15,
|
|
||||||
bzip-0.21, and bzip2 versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
|
|
||||||
1.0.2 and 1.0.3, and the changes in bzip2 are largely a result of this
|
|
||||||
feedback. I thank you for your comments.
|
|
||||||
|
|
||||||
bzip2's "home" is http://www.bzip.org/
|
|
||||||
|
|
||||||
Julian Seward
|
|
||||||
jseward@bzip.org
|
|
||||||
Cambridge, UK.
|
|
||||||
|
|
||||||
18 July 1996 (version 0.15)
|
|
||||||
25 August 1996 (version 0.21)
|
|
||||||
7 August 1997 (bzip2, version 0.1)
|
|
||||||
29 August 1997 (bzip2, version 0.1pl2)
|
|
||||||
23 August 1998 (bzip2, version 0.9.0)
|
|
||||||
8 June 1999 (bzip2, version 0.9.5)
|
|
||||||
4 Sept 1999 (bzip2, version 0.9.5d)
|
|
||||||
5 May 2000 (bzip2, version 1.0pre8)
|
|
||||||
30 December 2001 (bzip2, version 1.0.2pre1)
|
|
||||||
15 February 2005 (bzip2, version 1.0.3)
|
|
||||||
20 December 2006 (bzip2, version 1.0.4)
|
|
||||||
10 December 2007 (bzip2, version 1.0.5)
|
|
||||||
6 Sept 2010 (bzip2, version 1.0.6)
|
|
@ -1,58 +0,0 @@
|
|||||||
------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------
|
|
||||||
|
|
||||||
bzip2-1.0.6 should compile without problems on the vast majority of
|
|
||||||
platforms. Using the supplied Makefile, I've built and tested it
|
|
||||||
myself for x86-linux and amd64-linux. With makefile.msc, Visual C++
|
|
||||||
6.0 and nmake, you can build a native Win32 version too. Large file
|
|
||||||
support seems to work correctly on at least on amd64-linux.
|
|
||||||
|
|
||||||
When I say "large file" I mean a file of size 2,147,483,648 (2^31)
|
|
||||||
bytes or above. Many older OSs can't handle files above this size,
|
|
||||||
but many newer ones can. Large files are pretty huge -- most files
|
|
||||||
you'll encounter are not Large Files.
|
|
||||||
|
|
||||||
Early versions of bzip2 (0.1, 0.9.0, 0.9.5) compiled on a wide variety
|
|
||||||
of platforms without difficulty, and I hope this version will continue
|
|
||||||
in that tradition. However, in order to support large files, I've had
|
|
||||||
to include the define -D_FILE_OFFSET_BITS=64 in the Makefile. This
|
|
||||||
can cause problems.
|
|
||||||
|
|
||||||
The technique of adding -D_FILE_OFFSET_BITS=64 to get large file
|
|
||||||
support is, as far as I know, the Recommended Way to get correct large
|
|
||||||
file support. For more details, see the Large File Support
|
|
||||||
Specification, published by the Large File Summit, at
|
|
||||||
|
|
||||||
http://ftp.sas.com/standards/large.file
|
|
||||||
|
|
||||||
As a general comment, if you get compilation errors which you think
|
|
||||||
are related to large file support, try removing the above define from
|
|
||||||
the Makefile, ie, delete the line
|
|
||||||
|
|
||||||
BIGFILES=-D_FILE_OFFSET_BITS=64
|
|
||||||
|
|
||||||
from the Makefile, and do 'make clean ; make'. This will give you a
|
|
||||||
version of bzip2 without large file support, which, for most
|
|
||||||
applications, is probably not a problem.
|
|
||||||
|
|
||||||
Alternatively, try some of the platform-specific hints listed below.
|
|
||||||
|
|
||||||
You can use the spewG.c program to generate huge files to test bzip2's
|
|
||||||
large file support, if you are feeling paranoid. Be aware though that
|
|
||||||
any compilation problems which affect bzip2 will also affect spewG.c,
|
|
||||||
alas.
|
|
||||||
|
|
||||||
AIX: I have reports that for large file support, you need to specify
|
|
||||||
-D_LARGE_FILES rather than -D_FILE_OFFSET_BITS=64. I have not tested
|
|
||||||
this myself.
|
|
@ -1,45 +0,0 @@
|
|||||||
----------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
----------------------------------------------------------------
|
|
||||||
|
|
||||||
The script xmlproc.sh takes an xml file as input,
|
|
||||||
and processes it to create .pdf, .html or .ps output.
|
|
||||||
It uses format.pl, a perl script to format <pre> blocks nicely,
|
|
||||||
and add CDATA tags so writers do not have to use eg. <
|
|
||||||
|
|
||||||
The file "entities.xml" must be edited to reflect current
|
|
||||||
version, year, etc.
|
|
||||||
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
./xmlproc.sh -v manual.xml
|
|
||||||
Validates an xml file to ensure no dtd-compliance errors
|
|
||||||
|
|
||||||
./xmlproc.sh -html manual.xml
|
|
||||||
Output: manual.html
|
|
||||||
|
|
||||||
./xmlproc.sh -pdf manual.xml
|
|
||||||
Output: manual.pdf
|
|
||||||
|
|
||||||
./xmlproc.sh -ps manual.xml
|
|
||||||
Output: manual.ps
|
|
||||||
|
|
||||||
|
|
||||||
Notum bene:
|
|
||||||
- pdfxmltex barfs if given a filename with an underscore in it
|
|
||||||
|
|
||||||
- xmltex won't work yet - there's a bug in passivetex
|
|
||||||
which we are all waiting for Sebastian to fix.
|
|
||||||
So we are going the xml -> pdf -> ps route for the time being,
|
|
||||||
using pdfxmltex.
|
|
File diff suppressed because it is too large
Load Diff
@ -1,39 +0,0 @@
|
|||||||
<?xml version="1.0"?> <!-- -*- sgml -*- -->
|
|
||||||
<xsl:stylesheet
|
|
||||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
|
||||||
|
|
||||||
<!-- we like '1.2 Title' -->
|
|
||||||
<xsl:param name="section.autolabel" select="'1'"/>
|
|
||||||
<xsl:param name="section.label.includes.component.label" select="'1'"/>
|
|
||||||
|
|
||||||
<!-- Do not put 'Chapter' at the start of eg 'Chapter 1. Doing This' -->
|
|
||||||
<xsl:param name="local.l10n.xml" select="document('')"/>
|
|
||||||
<l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
|
|
||||||
<l:l10n language="en">
|
|
||||||
<l:context name="title-numbered">
|
|
||||||
<l:template name="chapter" text="%n. %t"/>
|
|
||||||
</l:context>
|
|
||||||
</l:l10n>
|
|
||||||
</l:i18n>
|
|
||||||
|
|
||||||
<!-- don't generate sub-tocs for qanda sets -->
|
|
||||||
<xsl:param name="generate.toc">
|
|
||||||
set toc,title
|
|
||||||
book toc,title,figure,table,example,equation
|
|
||||||
chapter toc,title
|
|
||||||
section toc
|
|
||||||
sect1 toc
|
|
||||||
sect2 toc
|
|
||||||
sect3 toc
|
|
||||||
sect4 nop
|
|
||||||
sect5 nop
|
|
||||||
qandaset toc
|
|
||||||
qandadiv nop
|
|
||||||
appendix toc,title
|
|
||||||
article/appendix nop
|
|
||||||
article toc,title
|
|
||||||
preface toc,title
|
|
||||||
reference toc,title
|
|
||||||
</xsl:param>
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
@ -1,276 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?> <!-- -*- sgml -*- -->
|
|
||||||
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
|
||||||
xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0">
|
|
||||||
|
|
||||||
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/fo/docbook.xsl"/>
|
|
||||||
<xsl:import href="bz-common.xsl"/>
|
|
||||||
|
|
||||||
<!-- set indent = yes while debugging, then change to NO -->
|
|
||||||
<xsl:output method="xml" indent="yes"/>
|
|
||||||
|
|
||||||
<!-- ensure only passivetex extensions are on -->
|
|
||||||
<xsl:param name="stylesheet.result.type" select="'fo'"/>
|
|
||||||
<!-- fo extensions: PDF bookmarks and index terms -->
|
|
||||||
<xsl:param name="use.extensions" select="'1'"/>
|
|
||||||
<xsl:param name="xep.extensions" select="0"/>
|
|
||||||
<xsl:param name="fop.extensions" select="0"/>
|
|
||||||
<xsl:param name="saxon.extensions" select="0"/>
|
|
||||||
<xsl:param name="passivetex.extensions" select="1"/>
|
|
||||||
<xsl:param name="tablecolumns.extension" select="'1'"/>
|
|
||||||
|
|
||||||
<!-- ensure we are using single sided -->
|
|
||||||
<xsl:param name="double.sided" select="'0'"/>
|
|
||||||
|
|
||||||
<!-- insert cross references to page numbers -->
|
|
||||||
<xsl:param name="insert.xref.page.number" select="1"/>
|
|
||||||
|
|
||||||
<!-- <?custom-pagebreak?> inserts a page break at this point -->
|
|
||||||
<xsl:template match="processing-instruction('custom-pagebreak')">
|
|
||||||
<fo:block break-before='page'/>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!-- show links in color -->
|
|
||||||
<xsl:attribute-set name="xref.properties">
|
|
||||||
<xsl:attribute name="color">blue</xsl:attribute>
|
|
||||||
</xsl:attribute-set>
|
|
||||||
|
|
||||||
<!-- make pre listings indented a bit + a bg colour -->
|
|
||||||
<xsl:template match="programlisting | screen">
|
|
||||||
<fo:block start-indent="0.25in" wrap-option="no-wrap"
|
|
||||||
white-space-collapse="false" text-align="start"
|
|
||||||
font-family="monospace" background-color="#f2f2f9"
|
|
||||||
linefeed-treatment="preserve"
|
|
||||||
xsl:use-attribute-sets="normal.para.spacing">
|
|
||||||
<xsl:apply-templates/>
|
|
||||||
</fo:block>
|
|
||||||
</xsl:template>
|
|
||||||
<!-- make verbatim output prettier -->
|
|
||||||
<xsl:template match="literallayout">
|
|
||||||
<fo:block start-indent="0.25in" wrap-option="no-wrap"
|
|
||||||
white-space-collapse="false" text-align="start"
|
|
||||||
font-family="monospace" background-color="#edf7f4"
|
|
||||||
linefeed-treatment="preserve"
|
|
||||||
space-before="0em" space-after="0em">
|
|
||||||
<xsl:apply-templates/>
|
|
||||||
</fo:block>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!-- workaround bug in passivetex fo output for itemizedlist -->
|
|
||||||
<xsl:template match="itemizedlist/listitem">
|
|
||||||
<xsl:variable name="id">
|
|
||||||
<xsl:call-template name="object.id"/></xsl:variable>
|
|
||||||
<xsl:variable name="itemsymbol">
|
|
||||||
<xsl:call-template name="list.itemsymbol">
|
|
||||||
<xsl:with-param name="node" select="parent::itemizedlist"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</xsl:variable>
|
|
||||||
<xsl:variable name="item.contents">
|
|
||||||
<fo:list-item-label end-indent="label-end()">
|
|
||||||
<fo:block>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$itemsymbol='disc'">•</xsl:when>
|
|
||||||
<xsl:when test="$itemsymbol='bullet'">•</xsl:when>
|
|
||||||
<xsl:otherwise>•</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</fo:block>
|
|
||||||
</fo:list-item-label>
|
|
||||||
<fo:list-item-body start-indent="body-start()">
|
|
||||||
<xsl:apply-templates/> <!-- removed extra block wrapper -->
|
|
||||||
</fo:list-item-body>
|
|
||||||
</xsl:variable>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="parent::*/@spacing = 'compact'">
|
|
||||||
<fo:list-item id="{$id}"
|
|
||||||
xsl:use-attribute-sets="compact.list.item.spacing">
|
|
||||||
<xsl:copy-of select="$item.contents"/>
|
|
||||||
</fo:list-item>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
|
|
||||||
<xsl:copy-of select="$item.contents"/>
|
|
||||||
</fo:list-item>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!-- workaround bug in passivetex fo output for orderedlist -->
|
|
||||||
<xsl:template match="orderedlist/listitem">
|
|
||||||
<xsl:variable name="id">
|
|
||||||
<xsl:call-template name="object.id"/></xsl:variable>
|
|
||||||
<xsl:variable name="item.contents">
|
|
||||||
<fo:list-item-label end-indent="label-end()">
|
|
||||||
<fo:block>
|
|
||||||
<xsl:apply-templates select="." mode="item-number"/>
|
|
||||||
</fo:block>
|
|
||||||
</fo:list-item-label>
|
|
||||||
<fo:list-item-body start-indent="body-start()">
|
|
||||||
<xsl:apply-templates/> <!-- removed extra block wrapper -->
|
|
||||||
</fo:list-item-body>
|
|
||||||
</xsl:variable>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="parent::*/@spacing = 'compact'">
|
|
||||||
<fo:list-item id="{$id}"
|
|
||||||
xsl:use-attribute-sets="compact.list.item.spacing">
|
|
||||||
<xsl:copy-of select="$item.contents"/>
|
|
||||||
</fo:list-item>
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<fo:list-item id="{$id}" xsl:use-attribute-sets="list.item.spacing">
|
|
||||||
<xsl:copy-of select="$item.contents"/>
|
|
||||||
</fo:list-item>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
<!-- workaround bug in passivetex fo output for variablelist -->
|
|
||||||
<xsl:param name="variablelist.as.blocks" select="1"/>
|
|
||||||
<xsl:template match="varlistentry" mode="vl.as.blocks">
|
|
||||||
<xsl:variable name="id">
|
|
||||||
<xsl:call-template name="object.id"/></xsl:variable>
|
|
||||||
<fo:block id="{$id}" xsl:use-attribute-sets="list.item.spacing"
|
|
||||||
keep-together.within-column="always"
|
|
||||||
keep-with-next.within-column="always">
|
|
||||||
<xsl:apply-templates select="term"/>
|
|
||||||
</fo:block>
|
|
||||||
<fo:block start-indent="0.5in" end-indent="0in"
|
|
||||||
space-after.minimum="0.2em"
|
|
||||||
space-after.optimum="0.4em"
|
|
||||||
space-after.maximum="0.6em">
|
|
||||||
<fo:block>
|
|
||||||
<xsl:apply-templates select="listitem"/>
|
|
||||||
</fo:block>
|
|
||||||
</fo:block>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- workaround bug in footers: force right-align w/two 80|30 cols -->
|
|
||||||
<xsl:template name="footer.table">
|
|
||||||
<xsl:param name="pageclass" select="''"/>
|
|
||||||
<xsl:param name="sequence" select="''"/>
|
|
||||||
<xsl:param name="gentext-key" select="''"/>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$pageclass = 'index'">
|
|
||||||
<xsl:attribute name="margin-left">0pt</xsl:attribute>
|
|
||||||
</xsl:when>
|
|
||||||
</xsl:choose>
|
|
||||||
<xsl:variable name="candidate">
|
|
||||||
<fo:table table-layout="fixed" width="100%">
|
|
||||||
<fo:table-column column-number="1" column-width="80%"/>
|
|
||||||
<fo:table-column column-number="2" column-width="20%"/>
|
|
||||||
<fo:table-body>
|
|
||||||
<fo:table-row height="14pt">
|
|
||||||
<fo:table-cell text-align="left" display-align="after">
|
|
||||||
<xsl:attribute name="relative-align">baseline</xsl:attribute>
|
|
||||||
<fo:block>
|
|
||||||
<fo:block> </fo:block><!-- empty cell -->
|
|
||||||
</fo:block>
|
|
||||||
</fo:table-cell>
|
|
||||||
<fo:table-cell text-align="center" display-align="after">
|
|
||||||
<xsl:attribute name="relative-align">baseline</xsl:attribute>
|
|
||||||
<fo:block>
|
|
||||||
<xsl:call-template name="footer.content">
|
|
||||||
<xsl:with-param name="pageclass" select="$pageclass"/>
|
|
||||||
<xsl:with-param name="sequence" select="$sequence"/>
|
|
||||||
<xsl:with-param name="position" select="'center'"/>
|
|
||||||
<xsl:with-param name="gentext-key" select="$gentext-key"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</fo:block>
|
|
||||||
</fo:table-cell>
|
|
||||||
</fo:table-row>
|
|
||||||
</fo:table-body>
|
|
||||||
</fo:table>
|
|
||||||
</xsl:variable>
|
|
||||||
<!-- Really output a footer? -->
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$pageclass='titlepage' and $gentext-key='book'
|
|
||||||
and $sequence='first'">
|
|
||||||
<!-- no, book titlepages have no footers at all -->
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:when test="$sequence = 'blank' and $footers.on.blank.pages = 0">
|
|
||||||
<!-- no output -->
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<xsl:copy-of select="$candidate"/>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- fix bug in headers: force right-align w/two 40|60 cols -->
|
|
||||||
<xsl:template name="header.table">
|
|
||||||
<xsl:param name="pageclass" select="''"/>
|
|
||||||
<xsl:param name="sequence" select="''"/>
|
|
||||||
<xsl:param name="gentext-key" select="''"/>
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$pageclass = 'index'">
|
|
||||||
<xsl:attribute name="margin-left">0pt</xsl:attribute>
|
|
||||||
</xsl:when>
|
|
||||||
</xsl:choose>
|
|
||||||
<xsl:variable name="candidate">
|
|
||||||
<fo:table table-layout="fixed" width="100%">
|
|
||||||
<xsl:call-template name="head.sep.rule">
|
|
||||||
<xsl:with-param name="pageclass" select="$pageclass"/>
|
|
||||||
<xsl:with-param name="sequence" select="$sequence"/>
|
|
||||||
<xsl:with-param name="gentext-key" select="$gentext-key"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
<fo:table-column column-number="1" column-width="40%"/>
|
|
||||||
<fo:table-column column-number="2" column-width="60%"/>
|
|
||||||
<fo:table-body>
|
|
||||||
<fo:table-row height="14pt">
|
|
||||||
<fo:table-cell text-align="left" display-align="before">
|
|
||||||
<xsl:attribute name="relative-align">baseline</xsl:attribute>
|
|
||||||
<fo:block>
|
|
||||||
<fo:block> </fo:block><!-- empty cell -->
|
|
||||||
</fo:block>
|
|
||||||
</fo:table-cell>
|
|
||||||
<fo:table-cell text-align="center" display-align="before">
|
|
||||||
<xsl:attribute name="relative-align">baseline</xsl:attribute>
|
|
||||||
<fo:block>
|
|
||||||
<xsl:call-template name="header.content">
|
|
||||||
<xsl:with-param name="pageclass" select="$pageclass"/>
|
|
||||||
<xsl:with-param name="sequence" select="$sequence"/>
|
|
||||||
<xsl:with-param name="position" select="'center'"/>
|
|
||||||
<xsl:with-param name="gentext-key" select="$gentext-key"/>
|
|
||||||
</xsl:call-template>
|
|
||||||
</fo:block>
|
|
||||||
</fo:table-cell>
|
|
||||||
</fo:table-row>
|
|
||||||
</fo:table-body>
|
|
||||||
</fo:table>
|
|
||||||
</xsl:variable>
|
|
||||||
<!-- Really output a header? -->
|
|
||||||
<xsl:choose>
|
|
||||||
<xsl:when test="$pageclass = 'titlepage' and $gentext-key = 'book'
|
|
||||||
and $sequence='first'">
|
|
||||||
<!-- no, book titlepages have no headers at all -->
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:when test="$sequence = 'blank' and $headers.on.blank.pages = 0">
|
|
||||||
<!-- no output -->
|
|
||||||
</xsl:when>
|
|
||||||
<xsl:otherwise>
|
|
||||||
<xsl:copy-of select="$candidate"/>
|
|
||||||
</xsl:otherwise>
|
|
||||||
</xsl:choose>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Bug-fix for Suse 10 PassiveTex version -->
|
|
||||||
<!-- Precompute attribute values 'cos PassiveTex is too stupid: -->
|
|
||||||
<xsl:attribute-set name="component.title.properties">
|
|
||||||
<xsl:attribute name="keep-with-next.within-column">always</xsl:attribute>
|
|
||||||
<xsl:attribute name="space-before.optimum">
|
|
||||||
<xsl:value-of select="concat($body.font.master, 'pt')"/>
|
|
||||||
</xsl:attribute>
|
|
||||||
<xsl:attribute name="space-before.minimum">
|
|
||||||
<xsl:value-of select="$body.font.master * 0.8"/>
|
|
||||||
<xsl:text>pt</xsl:text>
|
|
||||||
</xsl:attribute>
|
|
||||||
<xsl:attribute name="space-before.maximum">
|
|
||||||
<xsl:value-of select="$body.font.master * 1.2"/>
|
|
||||||
<xsl:text>pt</xsl:text>
|
|
||||||
</xsl:attribute>
|
|
||||||
<xsl:attribute name="hyphenate">false</xsl:attribute>
|
|
||||||
</xsl:attribute-set>
|
|
||||||
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
@ -1,20 +0,0 @@
|
|||||||
<?xml version="1.0"?> <!-- -*- sgml -*- -->
|
|
||||||
<!DOCTYPE xsl:stylesheet [ <!ENTITY bz-css SYSTEM "./bzip.css"> ]>
|
|
||||||
|
|
||||||
<xsl:stylesheet
|
|
||||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
|
|
||||||
|
|
||||||
<xsl:import href="http://docbook.sourceforge.net/release/xsl/current/html/docbook.xsl"/>
|
|
||||||
<xsl:import href="bz-common.xsl"/>
|
|
||||||
|
|
||||||
<!-- use 8859-1 encoding -->
|
|
||||||
<xsl:output method="html" encoding="ISO-8859-1" indent="yes"/>
|
|
||||||
|
|
||||||
<!-- we include the css directly when generating one large file -->
|
|
||||||
<xsl:template name="user.head.content">
|
|
||||||
<style type="text/css" media="screen">
|
|
||||||
<xsl:text>&bz-css;</xsl:text>
|
|
||||||
</style>
|
|
||||||
</xsl:template>
|
|
||||||
|
|
||||||
</xsl:stylesheet>
|
|
@ -1,672 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Compression machinery (not incl block sorting) ---*/
|
|
||||||
/*--- compress.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
/* CHANGES
|
|
||||||
0.9.0 -- original version.
|
|
||||||
0.9.0a/b -- no changes in this file.
|
|
||||||
0.9.0c -- changed setting of nGroups in sendMTFValues()
|
|
||||||
so as to do a bit better on small files
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "bzlib_private.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- Bit stream I/O ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
void BZ2_bsInitWrite ( EState* s )
|
|
||||||
{
|
|
||||||
s->bsLive = 0;
|
|
||||||
s->bsBuff = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void bsFinishWrite ( EState* s )
|
|
||||||
{
|
|
||||||
while (s->bsLive > 0) {
|
|
||||||
s->zbits[s->numZ] = (UChar)(s->bsBuff >> 24);
|
|
||||||
s->numZ++;
|
|
||||||
s->bsBuff <<= 8;
|
|
||||||
s->bsLive -= 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
#define bsNEEDW(nz) \
|
|
||||||
{ \
|
|
||||||
while (s->bsLive >= 8) { \
|
|
||||||
s->zbits[s->numZ] \
|
|
||||||
= (UChar)(s->bsBuff >> 24); \
|
|
||||||
s->numZ++; \
|
|
||||||
s->bsBuff <<= 8; \
|
|
||||||
s->bsLive -= 8; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
__inline__
|
|
||||||
void bsW ( EState* s, Int32 n, UInt32 v )
|
|
||||||
{
|
|
||||||
bsNEEDW ( n );
|
|
||||||
s->bsBuff |= (v << (32 - s->bsLive - n));
|
|
||||||
s->bsLive += n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void bsPutUInt32 ( EState* s, UInt32 u )
|
|
||||||
{
|
|
||||||
bsW ( s, 8, (u >> 24) & 0xffL );
|
|
||||||
bsW ( s, 8, (u >> 16) & 0xffL );
|
|
||||||
bsW ( s, 8, (u >> 8) & 0xffL );
|
|
||||||
bsW ( s, 8, u & 0xffL );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void bsPutUChar ( EState* s, UChar c )
|
|
||||||
{
|
|
||||||
bsW( s, 8, (UInt32)c );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- The back end proper ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void makeMaps_e ( EState* s )
|
|
||||||
{
|
|
||||||
Int32 i;
|
|
||||||
s->nInUse = 0;
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
if (s->inUse[i]) {
|
|
||||||
s->unseqToSeq[i] = s->nInUse;
|
|
||||||
s->nInUse++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void generateMTFValues ( EState* s )
|
|
||||||
{
|
|
||||||
UChar yy[256];
|
|
||||||
Int32 i, j;
|
|
||||||
Int32 zPend;
|
|
||||||
Int32 wr;
|
|
||||||
Int32 EOB;
|
|
||||||
|
|
||||||
/*
|
|
||||||
After sorting (eg, here),
|
|
||||||
s->arr1 [ 0 .. s->nblock-1 ] holds sorted order,
|
|
||||||
and
|
|
||||||
((UChar*)s->arr2) [ 0 .. s->nblock-1 ]
|
|
||||||
holds the original block data.
|
|
||||||
|
|
||||||
The first thing to do is generate the MTF values,
|
|
||||||
and put them in
|
|
||||||
((UInt16*)s->arr1) [ 0 .. s->nblock-1 ].
|
|
||||||
Because there are strictly fewer or equal MTF values
|
|
||||||
than block values, ptr values in this area are overwritten
|
|
||||||
with MTF values only when they are no longer needed.
|
|
||||||
|
|
||||||
The final compressed bitstream is generated into the
|
|
||||||
area starting at
|
|
||||||
(UChar*) (&((UChar*)s->arr2)[s->nblock])
|
|
||||||
|
|
||||||
These storage aliases are set up in bzCompressInit(),
|
|
||||||
except for the last one, which is arranged in
|
|
||||||
compressBlock().
|
|
||||||
*/
|
|
||||||
UInt32* ptr = s->ptr;
|
|
||||||
UChar* block = s->block;
|
|
||||||
UInt16* mtfv = s->mtfv;
|
|
||||||
|
|
||||||
makeMaps_e ( s );
|
|
||||||
EOB = s->nInUse+1;
|
|
||||||
|
|
||||||
for (i = 0; i <= EOB; i++) s->mtfFreq[i] = 0;
|
|
||||||
|
|
||||||
wr = 0;
|
|
||||||
zPend = 0;
|
|
||||||
for (i = 0; i < s->nInUse; i++) yy[i] = (UChar) i;
|
|
||||||
|
|
||||||
for (i = 0; i < s->nblock; i++) {
|
|
||||||
UChar ll_i;
|
|
||||||
AssertD ( wr <= i, "generateMTFValues(1)" );
|
|
||||||
j = ptr[i]-1; if (j < 0) j += s->nblock;
|
|
||||||
ll_i = s->unseqToSeq[block[j]];
|
|
||||||
AssertD ( ll_i < s->nInUse, "generateMTFValues(2a)" );
|
|
||||||
|
|
||||||
if (yy[0] == ll_i) {
|
|
||||||
zPend++;
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (zPend > 0) {
|
|
||||||
zPend--;
|
|
||||||
while (True) {
|
|
||||||
if (zPend & 1) {
|
|
||||||
mtfv[wr] = BZ_RUNB; wr++;
|
|
||||||
s->mtfFreq[BZ_RUNB]++;
|
|
||||||
} else {
|
|
||||||
mtfv[wr] = BZ_RUNA; wr++;
|
|
||||||
s->mtfFreq[BZ_RUNA]++;
|
|
||||||
}
|
|
||||||
if (zPend < 2) break;
|
|
||||||
zPend = (zPend - 2) / 2;
|
|
||||||
};
|
|
||||||
zPend = 0;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
register UChar rtmp;
|
|
||||||
register UChar* ryy_j;
|
|
||||||
register UChar rll_i;
|
|
||||||
rtmp = yy[1];
|
|
||||||
yy[1] = yy[0];
|
|
||||||
ryy_j = &(yy[1]);
|
|
||||||
rll_i = ll_i;
|
|
||||||
while ( rll_i != rtmp ) {
|
|
||||||
register UChar rtmp2;
|
|
||||||
ryy_j++;
|
|
||||||
rtmp2 = rtmp;
|
|
||||||
rtmp = *ryy_j;
|
|
||||||
*ryy_j = rtmp2;
|
|
||||||
};
|
|
||||||
yy[0] = rtmp;
|
|
||||||
j = ryy_j - &(yy[0]);
|
|
||||||
mtfv[wr] = j+1; wr++; s->mtfFreq[j+1]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (zPend > 0) {
|
|
||||||
zPend--;
|
|
||||||
while (True) {
|
|
||||||
if (zPend & 1) {
|
|
||||||
mtfv[wr] = BZ_RUNB; wr++;
|
|
||||||
s->mtfFreq[BZ_RUNB]++;
|
|
||||||
} else {
|
|
||||||
mtfv[wr] = BZ_RUNA; wr++;
|
|
||||||
s->mtfFreq[BZ_RUNA]++;
|
|
||||||
}
|
|
||||||
if (zPend < 2) break;
|
|
||||||
zPend = (zPend - 2) / 2;
|
|
||||||
};
|
|
||||||
zPend = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
mtfv[wr] = EOB; wr++; s->mtfFreq[EOB]++;
|
|
||||||
|
|
||||||
s->nMTF = wr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
#define BZ_LESSER_ICOST 0
|
|
||||||
#define BZ_GREATER_ICOST 15
|
|
||||||
|
|
||||||
static
|
|
||||||
void sendMTFValues ( EState* s )
|
|
||||||
{
|
|
||||||
Int32 v, t, i, j, gs, ge, totc, bt, bc, iter;
|
|
||||||
Int32 nSelectors, alphaSize, minLen, maxLen, selCtr;
|
|
||||||
Int32 nGroups, nBytes;
|
|
||||||
|
|
||||||
/*--
|
|
||||||
UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
is a global since the decoder also needs it.
|
|
||||||
|
|
||||||
Int32 code[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 rfreq[BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
are also globals only used in this proc.
|
|
||||||
Made global to keep stack frame size small.
|
|
||||||
--*/
|
|
||||||
|
|
||||||
|
|
||||||
UInt16 cost[BZ_N_GROUPS];
|
|
||||||
Int32 fave[BZ_N_GROUPS];
|
|
||||||
|
|
||||||
UInt16* mtfv = s->mtfv;
|
|
||||||
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf3( " %d in block, %d after MTF & 1-2 coding, "
|
|
||||||
"%d+2 syms in use\n",
|
|
||||||
s->nblock, s->nMTF, s->nInUse );
|
|
||||||
|
|
||||||
alphaSize = s->nInUse+2;
|
|
||||||
for (t = 0; t < BZ_N_GROUPS; t++)
|
|
||||||
for (v = 0; v < alphaSize; v++)
|
|
||||||
s->len[t][v] = BZ_GREATER_ICOST;
|
|
||||||
|
|
||||||
/*--- Decide how many coding tables to use ---*/
|
|
||||||
AssertH ( s->nMTF > 0, 3001 );
|
|
||||||
if (s->nMTF < 200) nGroups = 2; else
|
|
||||||
if (s->nMTF < 600) nGroups = 3; else
|
|
||||||
if (s->nMTF < 1200) nGroups = 4; else
|
|
||||||
if (s->nMTF < 2400) nGroups = 5; else
|
|
||||||
nGroups = 6;
|
|
||||||
|
|
||||||
/*--- Generate an initial set of coding tables ---*/
|
|
||||||
{
|
|
||||||
Int32 nPart, remF, tFreq, aFreq;
|
|
||||||
|
|
||||||
nPart = nGroups;
|
|
||||||
remF = s->nMTF;
|
|
||||||
gs = 0;
|
|
||||||
while (nPart > 0) {
|
|
||||||
tFreq = remF / nPart;
|
|
||||||
ge = gs-1;
|
|
||||||
aFreq = 0;
|
|
||||||
while (aFreq < tFreq && ge < alphaSize-1) {
|
|
||||||
ge++;
|
|
||||||
aFreq += s->mtfFreq[ge];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ge > gs
|
|
||||||
&& nPart != nGroups && nPart != 1
|
|
||||||
&& ((nGroups-nPart) % 2 == 1)) {
|
|
||||||
aFreq -= s->mtfFreq[ge];
|
|
||||||
ge--;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf5( " initial group %d, [%d .. %d], "
|
|
||||||
"has %d syms (%4.1f%%)\n",
|
|
||||||
nPart, gs, ge, aFreq,
|
|
||||||
(100.0 * (float)aFreq) / (float)(s->nMTF) );
|
|
||||||
|
|
||||||
for (v = 0; v < alphaSize; v++)
|
|
||||||
if (v >= gs && v <= ge)
|
|
||||||
s->len[nPart-1][v] = BZ_LESSER_ICOST; else
|
|
||||||
s->len[nPart-1][v] = BZ_GREATER_ICOST;
|
|
||||||
|
|
||||||
nPart--;
|
|
||||||
gs = ge+1;
|
|
||||||
remF -= aFreq;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*---
|
|
||||||
Iterate up to BZ_N_ITERS times to improve the tables.
|
|
||||||
---*/
|
|
||||||
for (iter = 0; iter < BZ_N_ITERS; iter++) {
|
|
||||||
|
|
||||||
for (t = 0; t < nGroups; t++) fave[t] = 0;
|
|
||||||
|
|
||||||
for (t = 0; t < nGroups; t++)
|
|
||||||
for (v = 0; v < alphaSize; v++)
|
|
||||||
s->rfreq[t][v] = 0;
|
|
||||||
|
|
||||||
/*---
|
|
||||||
Set up an auxiliary length table which is used to fast-track
|
|
||||||
the common case (nGroups == 6).
|
|
||||||
---*/
|
|
||||||
if (nGroups == 6) {
|
|
||||||
for (v = 0; v < alphaSize; v++) {
|
|
||||||
s->len_pack[v][0] = (s->len[1][v] << 16) | s->len[0][v];
|
|
||||||
s->len_pack[v][1] = (s->len[3][v] << 16) | s->len[2][v];
|
|
||||||
s->len_pack[v][2] = (s->len[5][v] << 16) | s->len[4][v];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nSelectors = 0;
|
|
||||||
totc = 0;
|
|
||||||
gs = 0;
|
|
||||||
while (True) {
|
|
||||||
|
|
||||||
/*--- Set group start & end marks. --*/
|
|
||||||
if (gs >= s->nMTF) break;
|
|
||||||
ge = gs + BZ_G_SIZE - 1;
|
|
||||||
if (ge >= s->nMTF) ge = s->nMTF-1;
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Calculate the cost of this group as coded
|
|
||||||
by each of the coding tables.
|
|
||||||
--*/
|
|
||||||
for (t = 0; t < nGroups; t++) cost[t] = 0;
|
|
||||||
|
|
||||||
if (nGroups == 6 && 50 == ge-gs+1) {
|
|
||||||
/*--- fast track the common case ---*/
|
|
||||||
register UInt32 cost01, cost23, cost45;
|
|
||||||
register UInt16 icv;
|
|
||||||
cost01 = cost23 = cost45 = 0;
|
|
||||||
|
|
||||||
# define BZ_ITER(nn) \
|
|
||||||
icv = mtfv[gs+(nn)]; \
|
|
||||||
cost01 += s->len_pack[icv][0]; \
|
|
||||||
cost23 += s->len_pack[icv][1]; \
|
|
||||||
cost45 += s->len_pack[icv][2]; \
|
|
||||||
|
|
||||||
BZ_ITER(0); BZ_ITER(1); BZ_ITER(2); BZ_ITER(3); BZ_ITER(4);
|
|
||||||
BZ_ITER(5); BZ_ITER(6); BZ_ITER(7); BZ_ITER(8); BZ_ITER(9);
|
|
||||||
BZ_ITER(10); BZ_ITER(11); BZ_ITER(12); BZ_ITER(13); BZ_ITER(14);
|
|
||||||
BZ_ITER(15); BZ_ITER(16); BZ_ITER(17); BZ_ITER(18); BZ_ITER(19);
|
|
||||||
BZ_ITER(20); BZ_ITER(21); BZ_ITER(22); BZ_ITER(23); BZ_ITER(24);
|
|
||||||
BZ_ITER(25); BZ_ITER(26); BZ_ITER(27); BZ_ITER(28); BZ_ITER(29);
|
|
||||||
BZ_ITER(30); BZ_ITER(31); BZ_ITER(32); BZ_ITER(33); BZ_ITER(34);
|
|
||||||
BZ_ITER(35); BZ_ITER(36); BZ_ITER(37); BZ_ITER(38); BZ_ITER(39);
|
|
||||||
BZ_ITER(40); BZ_ITER(41); BZ_ITER(42); BZ_ITER(43); BZ_ITER(44);
|
|
||||||
BZ_ITER(45); BZ_ITER(46); BZ_ITER(47); BZ_ITER(48); BZ_ITER(49);
|
|
||||||
|
|
||||||
# undef BZ_ITER
|
|
||||||
|
|
||||||
cost[0] = cost01 & 0xffff; cost[1] = cost01 >> 16;
|
|
||||||
cost[2] = cost23 & 0xffff; cost[3] = cost23 >> 16;
|
|
||||||
cost[4] = cost45 & 0xffff; cost[5] = cost45 >> 16;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*--- slow version which correctly handles all situations ---*/
|
|
||||||
for (i = gs; i <= ge; i++) {
|
|
||||||
UInt16 icv = mtfv[i];
|
|
||||||
for (t = 0; t < nGroups; t++) cost[t] += s->len[t][icv];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Find the coding table which is best for this group,
|
|
||||||
and record its identity in the selector table.
|
|
||||||
--*/
|
|
||||||
bc = 999999999; bt = -1;
|
|
||||||
for (t = 0; t < nGroups; t++)
|
|
||||||
if (cost[t] < bc) { bc = cost[t]; bt = t; };
|
|
||||||
totc += bc;
|
|
||||||
fave[bt]++;
|
|
||||||
s->selector[nSelectors] = bt;
|
|
||||||
nSelectors++;
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Increment the symbol frequencies for the selected table.
|
|
||||||
--*/
|
|
||||||
if (nGroups == 6 && 50 == ge-gs+1) {
|
|
||||||
/*--- fast track the common case ---*/
|
|
||||||
|
|
||||||
# define BZ_ITUR(nn) s->rfreq[bt][ mtfv[gs+(nn)] ]++
|
|
||||||
|
|
||||||
BZ_ITUR(0); BZ_ITUR(1); BZ_ITUR(2); BZ_ITUR(3); BZ_ITUR(4);
|
|
||||||
BZ_ITUR(5); BZ_ITUR(6); BZ_ITUR(7); BZ_ITUR(8); BZ_ITUR(9);
|
|
||||||
BZ_ITUR(10); BZ_ITUR(11); BZ_ITUR(12); BZ_ITUR(13); BZ_ITUR(14);
|
|
||||||
BZ_ITUR(15); BZ_ITUR(16); BZ_ITUR(17); BZ_ITUR(18); BZ_ITUR(19);
|
|
||||||
BZ_ITUR(20); BZ_ITUR(21); BZ_ITUR(22); BZ_ITUR(23); BZ_ITUR(24);
|
|
||||||
BZ_ITUR(25); BZ_ITUR(26); BZ_ITUR(27); BZ_ITUR(28); BZ_ITUR(29);
|
|
||||||
BZ_ITUR(30); BZ_ITUR(31); BZ_ITUR(32); BZ_ITUR(33); BZ_ITUR(34);
|
|
||||||
BZ_ITUR(35); BZ_ITUR(36); BZ_ITUR(37); BZ_ITUR(38); BZ_ITUR(39);
|
|
||||||
BZ_ITUR(40); BZ_ITUR(41); BZ_ITUR(42); BZ_ITUR(43); BZ_ITUR(44);
|
|
||||||
BZ_ITUR(45); BZ_ITUR(46); BZ_ITUR(47); BZ_ITUR(48); BZ_ITUR(49);
|
|
||||||
|
|
||||||
# undef BZ_ITUR
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*--- slow version which correctly handles all situations ---*/
|
|
||||||
for (i = gs; i <= ge; i++)
|
|
||||||
s->rfreq[bt][ mtfv[i] ]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
gs = ge+1;
|
|
||||||
}
|
|
||||||
if (s->verbosity >= 3) {
|
|
||||||
VPrintf2 ( " pass %d: size is %d, grp uses are ",
|
|
||||||
iter+1, totc/8 );
|
|
||||||
for (t = 0; t < nGroups; t++)
|
|
||||||
VPrintf1 ( "%d ", fave[t] );
|
|
||||||
VPrintf0 ( "\n" );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Recompute the tables based on the accumulated frequencies.
|
|
||||||
--*/
|
|
||||||
/* maxLen was changed from 20 to 17 in bzip2-1.0.3. See
|
|
||||||
comment in huffman.c for details. */
|
|
||||||
for (t = 0; t < nGroups; t++)
|
|
||||||
BZ2_hbMakeCodeLengths ( &(s->len[t][0]), &(s->rfreq[t][0]),
|
|
||||||
alphaSize, 17 /*20*/ );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
AssertH( nGroups < 8, 3002 );
|
|
||||||
AssertH( nSelectors < 32768 &&
|
|
||||||
nSelectors <= (2 + (900000 / BZ_G_SIZE)),
|
|
||||||
3003 );
|
|
||||||
|
|
||||||
|
|
||||||
/*--- Compute MTF values for the selectors. ---*/
|
|
||||||
{
|
|
||||||
UChar pos[BZ_N_GROUPS], ll_i, tmp2, tmp;
|
|
||||||
for (i = 0; i < nGroups; i++) pos[i] = i;
|
|
||||||
for (i = 0; i < nSelectors; i++) {
|
|
||||||
ll_i = s->selector[i];
|
|
||||||
j = 0;
|
|
||||||
tmp = pos[j];
|
|
||||||
while ( ll_i != tmp ) {
|
|
||||||
j++;
|
|
||||||
tmp2 = tmp;
|
|
||||||
tmp = pos[j];
|
|
||||||
pos[j] = tmp2;
|
|
||||||
};
|
|
||||||
pos[0] = tmp;
|
|
||||||
s->selectorMtf[i] = j;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/*--- Assign actual codes for the tables. --*/
|
|
||||||
for (t = 0; t < nGroups; t++) {
|
|
||||||
minLen = 32;
|
|
||||||
maxLen = 0;
|
|
||||||
for (i = 0; i < alphaSize; i++) {
|
|
||||||
if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
|
|
||||||
if (s->len[t][i] < minLen) minLen = s->len[t][i];
|
|
||||||
}
|
|
||||||
AssertH ( !(maxLen > 17 /*20*/ ), 3004 );
|
|
||||||
AssertH ( !(minLen < 1), 3005 );
|
|
||||||
BZ2_hbAssignCodes ( &(s->code[t][0]), &(s->len[t][0]),
|
|
||||||
minLen, maxLen, alphaSize );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Transmit the mapping table. ---*/
|
|
||||||
{
|
|
||||||
Bool inUse16[16];
|
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
inUse16[i] = False;
|
|
||||||
for (j = 0; j < 16; j++)
|
|
||||||
if (s->inUse[i * 16 + j]) inUse16[i] = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
nBytes = s->numZ;
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (inUse16[i]) bsW(s,1,1); else bsW(s,1,0);
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (inUse16[i])
|
|
||||||
for (j = 0; j < 16; j++) {
|
|
||||||
if (s->inUse[i * 16 + j]) bsW(s,1,1); else bsW(s,1,0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf1( " bytes: mapping %d, ", s->numZ-nBytes );
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Now the selectors. ---*/
|
|
||||||
nBytes = s->numZ;
|
|
||||||
bsW ( s, 3, nGroups );
|
|
||||||
bsW ( s, 15, nSelectors );
|
|
||||||
for (i = 0; i < nSelectors; i++) {
|
|
||||||
for (j = 0; j < s->selectorMtf[i]; j++) bsW(s,1,1);
|
|
||||||
bsW(s,1,0);
|
|
||||||
}
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf1( "selectors %d, ", s->numZ-nBytes );
|
|
||||||
|
|
||||||
/*--- Now the coding tables. ---*/
|
|
||||||
nBytes = s->numZ;
|
|
||||||
|
|
||||||
for (t = 0; t < nGroups; t++) {
|
|
||||||
Int32 curr = s->len[t][0];
|
|
||||||
bsW ( s, 5, curr );
|
|
||||||
for (i = 0; i < alphaSize; i++) {
|
|
||||||
while (curr < s->len[t][i]) { bsW(s,2,2); curr++; /* 10 */ };
|
|
||||||
while (curr > s->len[t][i]) { bsW(s,2,3); curr--; /* 11 */ };
|
|
||||||
bsW ( s, 1, 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf1 ( "code lengths %d, ", s->numZ-nBytes );
|
|
||||||
|
|
||||||
/*--- And finally, the block data proper ---*/
|
|
||||||
nBytes = s->numZ;
|
|
||||||
selCtr = 0;
|
|
||||||
gs = 0;
|
|
||||||
while (True) {
|
|
||||||
if (gs >= s->nMTF) break;
|
|
||||||
ge = gs + BZ_G_SIZE - 1;
|
|
||||||
if (ge >= s->nMTF) ge = s->nMTF-1;
|
|
||||||
AssertH ( s->selector[selCtr] < nGroups, 3006 );
|
|
||||||
|
|
||||||
if (nGroups == 6 && 50 == ge-gs+1) {
|
|
||||||
/*--- fast track the common case ---*/
|
|
||||||
UInt16 mtfv_i;
|
|
||||||
UChar* s_len_sel_selCtr
|
|
||||||
= &(s->len[s->selector[selCtr]][0]);
|
|
||||||
Int32* s_code_sel_selCtr
|
|
||||||
= &(s->code[s->selector[selCtr]][0]);
|
|
||||||
|
|
||||||
# define BZ_ITAH(nn) \
|
|
||||||
mtfv_i = mtfv[gs+(nn)]; \
|
|
||||||
bsW ( s, \
|
|
||||||
s_len_sel_selCtr[mtfv_i], \
|
|
||||||
s_code_sel_selCtr[mtfv_i] )
|
|
||||||
|
|
||||||
BZ_ITAH(0); BZ_ITAH(1); BZ_ITAH(2); BZ_ITAH(3); BZ_ITAH(4);
|
|
||||||
BZ_ITAH(5); BZ_ITAH(6); BZ_ITAH(7); BZ_ITAH(8); BZ_ITAH(9);
|
|
||||||
BZ_ITAH(10); BZ_ITAH(11); BZ_ITAH(12); BZ_ITAH(13); BZ_ITAH(14);
|
|
||||||
BZ_ITAH(15); BZ_ITAH(16); BZ_ITAH(17); BZ_ITAH(18); BZ_ITAH(19);
|
|
||||||
BZ_ITAH(20); BZ_ITAH(21); BZ_ITAH(22); BZ_ITAH(23); BZ_ITAH(24);
|
|
||||||
BZ_ITAH(25); BZ_ITAH(26); BZ_ITAH(27); BZ_ITAH(28); BZ_ITAH(29);
|
|
||||||
BZ_ITAH(30); BZ_ITAH(31); BZ_ITAH(32); BZ_ITAH(33); BZ_ITAH(34);
|
|
||||||
BZ_ITAH(35); BZ_ITAH(36); BZ_ITAH(37); BZ_ITAH(38); BZ_ITAH(39);
|
|
||||||
BZ_ITAH(40); BZ_ITAH(41); BZ_ITAH(42); BZ_ITAH(43); BZ_ITAH(44);
|
|
||||||
BZ_ITAH(45); BZ_ITAH(46); BZ_ITAH(47); BZ_ITAH(48); BZ_ITAH(49);
|
|
||||||
|
|
||||||
# undef BZ_ITAH
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/*--- slow version which correctly handles all situations ---*/
|
|
||||||
for (i = gs; i <= ge; i++) {
|
|
||||||
bsW ( s,
|
|
||||||
s->len [s->selector[selCtr]] [mtfv[i]],
|
|
||||||
s->code [s->selector[selCtr]] [mtfv[i]] );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gs = ge+1;
|
|
||||||
selCtr++;
|
|
||||||
}
|
|
||||||
AssertH( selCtr == nSelectors, 3007 );
|
|
||||||
|
|
||||||
if (s->verbosity >= 3)
|
|
||||||
VPrintf1( "codes %d\n", s->numZ-nBytes );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
void BZ2_compressBlock ( EState* s, Bool is_last_block )
|
|
||||||
{
|
|
||||||
if (s->nblock > 0) {
|
|
||||||
|
|
||||||
BZ_FINALISE_CRC ( s->blockCRC );
|
|
||||||
s->combinedCRC = (s->combinedCRC << 1) | (s->combinedCRC >> 31);
|
|
||||||
s->combinedCRC ^= s->blockCRC;
|
|
||||||
if (s->blockNo > 1) s->numZ = 0;
|
|
||||||
|
|
||||||
if (s->verbosity >= 2)
|
|
||||||
VPrintf4( " block %d: crc = 0x%08x, "
|
|
||||||
"combined CRC = 0x%08x, size = %d\n",
|
|
||||||
s->blockNo, s->blockCRC, s->combinedCRC, s->nblock );
|
|
||||||
|
|
||||||
BZ2_blockSort ( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
s->zbits = (UChar*) (&((UChar*)s->arr2)[s->nblock]);
|
|
||||||
|
|
||||||
/*-- If this is the first block, create the stream header. --*/
|
|
||||||
if (s->blockNo == 1) {
|
|
||||||
BZ2_bsInitWrite ( s );
|
|
||||||
bsPutUChar ( s, BZ_HDR_B );
|
|
||||||
bsPutUChar ( s, BZ_HDR_Z );
|
|
||||||
bsPutUChar ( s, BZ_HDR_h );
|
|
||||||
bsPutUChar ( s, (UChar)(BZ_HDR_0 + s->blockSize100k) );
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s->nblock > 0) {
|
|
||||||
|
|
||||||
bsPutUChar ( s, 0x31 ); bsPutUChar ( s, 0x41 );
|
|
||||||
bsPutUChar ( s, 0x59 ); bsPutUChar ( s, 0x26 );
|
|
||||||
bsPutUChar ( s, 0x53 ); bsPutUChar ( s, 0x59 );
|
|
||||||
|
|
||||||
/*-- Now the block's CRC, so it is in a known place. --*/
|
|
||||||
bsPutUInt32 ( s, s->blockCRC );
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Now a single bit indicating (non-)randomisation.
|
|
||||||
As of version 0.9.5, we use a better sorting algorithm
|
|
||||||
which makes randomisation unnecessary. So always set
|
|
||||||
the randomised bit to 'no'. Of course, the decoder
|
|
||||||
still needs to be able to handle randomised blocks
|
|
||||||
so as to maintain backwards compatibility with
|
|
||||||
older versions of bzip2.
|
|
||||||
--*/
|
|
||||||
bsW(s,1,0);
|
|
||||||
|
|
||||||
bsW ( s, 24, s->origPtr );
|
|
||||||
generateMTFValues ( s );
|
|
||||||
sendMTFValues ( s );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-- If this is the last block, add the stream trailer. --*/
|
|
||||||
if (is_last_block) {
|
|
||||||
|
|
||||||
bsPutUChar ( s, 0x17 ); bsPutUChar ( s, 0x72 );
|
|
||||||
bsPutUChar ( s, 0x45 ); bsPutUChar ( s, 0x38 );
|
|
||||||
bsPutUChar ( s, 0x50 ); bsPutUChar ( s, 0x90 );
|
|
||||||
bsPutUInt32 ( s, s->combinedCRC );
|
|
||||||
if (s->verbosity >= 2)
|
|
||||||
VPrintf1( " final combined CRC = 0x%08x\n ", s->combinedCRC );
|
|
||||||
bsFinishWrite ( s );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end compress.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,76 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# sh is buggy on RS/6000 AIX 3.2. Replace above line with #!/bin/ksh
|
|
||||||
|
|
||||||
# Bzcmp/diff wrapped for bzip2,
|
|
||||||
# adapted from zdiff by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
|
|
||||||
|
|
||||||
# Bzcmp and bzdiff are used to invoke the cmp or the diff pro-
|
|
||||||
# gram on compressed files. All options specified are passed
|
|
||||||
# directly to cmp or diff. If only 1 file is specified, then
|
|
||||||
# the files compared are file1 and an uncompressed file1.gz.
|
|
||||||
# If two files are specified, then they are uncompressed (if
|
|
||||||
# necessary) and fed to cmp or diff. The exit status from cmp
|
|
||||||
# or diff is preserved.
|
|
||||||
|
|
||||||
PATH="/usr/bin:/bin:$PATH"; export PATH
|
|
||||||
prog=`echo $0 | sed 's|.*/||'`
|
|
||||||
case "$prog" in
|
|
||||||
*cmp) comp=${CMP-cmp} ;;
|
|
||||||
*) comp=${DIFF-diff} ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
OPTIONS=
|
|
||||||
FILES=
|
|
||||||
for ARG
|
|
||||||
do
|
|
||||||
case "$ARG" in
|
|
||||||
-*) OPTIONS="$OPTIONS $ARG";;
|
|
||||||
*) if test -f "$ARG"; then
|
|
||||||
FILES="$FILES $ARG"
|
|
||||||
else
|
|
||||||
echo "${prog}: $ARG not found or not a regular file"
|
|
||||||
exit 1
|
|
||||||
fi ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
if test -z "$FILES"; then
|
|
||||||
echo "Usage: $prog [${comp}_options] file [file]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
tmp=`mktemp ${TMPDIR:-/tmp}/bzdiff.XXXXXXXXXX` || {
|
|
||||||
echo 'cannot create a temporary file' >&2
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
set $FILES
|
|
||||||
if test $# -eq 1; then
|
|
||||||
FILE=`echo "$1" | sed 's/.bz2$//'`
|
|
||||||
bzip2 -cd "$FILE.bz2" | $comp $OPTIONS - "$FILE"
|
|
||||||
STAT="$?"
|
|
||||||
|
|
||||||
elif test $# -eq 2; then
|
|
||||||
case "$1" in
|
|
||||||
*.bz2)
|
|
||||||
case "$2" in
|
|
||||||
*.bz2)
|
|
||||||
F=`echo "$2" | sed 's|.*/||;s|.bz2$||'`
|
|
||||||
bzip2 -cdfq "$2" > $tmp
|
|
||||||
bzip2 -cdfq "$1" | $comp $OPTIONS - $tmp
|
|
||||||
STAT="$?"
|
|
||||||
/bin/rm -f $tmp;;
|
|
||||||
|
|
||||||
*) bzip2 -cdfq "$1" | $comp $OPTIONS - "$2"
|
|
||||||
STAT="$?";;
|
|
||||||
esac;;
|
|
||||||
*) case "$2" in
|
|
||||||
*.bz2)
|
|
||||||
bzip2 -cdfq "$2" | $comp $OPTIONS "$1" -
|
|
||||||
STAT="$?";;
|
|
||||||
*) $comp $OPTIONS "$1" "$2"
|
|
||||||
STAT="$?";;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
exit "$STAT"
|
|
||||||
else
|
|
||||||
echo "Usage: $prog [${comp}_options] file [file]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
@ -1,47 +0,0 @@
|
|||||||
\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
|
|
||||||
\"for Debian GNU/Linux
|
|
||||||
.TH BZDIFF 1
|
|
||||||
.SH NAME
|
|
||||||
bzcmp, bzdiff \- compare bzip2 compressed files
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B bzcmp
|
|
||||||
[ cmp_options ] file1
|
|
||||||
[ file2 ]
|
|
||||||
.br
|
|
||||||
.B bzdiff
|
|
||||||
[ diff_options ] file1
|
|
||||||
[ file2 ]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.I Bzcmp
|
|
||||||
and
|
|
||||||
.I bzdiff
|
|
||||||
are used to invoke the
|
|
||||||
.I cmp
|
|
||||||
or the
|
|
||||||
.I diff
|
|
||||||
program on bzip2 compressed files. All options specified are passed
|
|
||||||
directly to
|
|
||||||
.I cmp
|
|
||||||
or
|
|
||||||
.IR diff "."
|
|
||||||
If only 1 file is specified, then the files compared are
|
|
||||||
.I file1
|
|
||||||
and an uncompressed
|
|
||||||
.IR file1 ".bz2."
|
|
||||||
If two files are specified, then they are uncompressed if necessary and fed to
|
|
||||||
.I cmp
|
|
||||||
or
|
|
||||||
.IR diff "."
|
|
||||||
The exit status from
|
|
||||||
.I cmp
|
|
||||||
or
|
|
||||||
.I diff
|
|
||||||
is preserved.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
cmp(1), diff(1), bzmore(1), bzless(1), bzgrep(1), bzip2(1)
|
|
||||||
.SH BUGS
|
|
||||||
Messages from the
|
|
||||||
.I cmp
|
|
||||||
or
|
|
||||||
.I diff
|
|
||||||
programs refer to temporary filenames instead of those specified.
|
|
@ -1,75 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Bzgrep wrapped for bzip2,
|
|
||||||
# adapted from zgrep by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
|
|
||||||
## zgrep notice:
|
|
||||||
## zgrep -- a wrapper around a grep program that decompresses files as needed
|
|
||||||
## Adapted from a version sent by Charles Levert <charles@comm.polymtl.ca>
|
|
||||||
|
|
||||||
PATH="/usr/bin:$PATH"; export PATH
|
|
||||||
|
|
||||||
prog=`echo $0 | sed 's|.*/||'`
|
|
||||||
case "$prog" in
|
|
||||||
*egrep) grep=${EGREP-egrep} ;;
|
|
||||||
*fgrep) grep=${FGREP-fgrep} ;;
|
|
||||||
*) grep=${GREP-grep} ;;
|
|
||||||
esac
|
|
||||||
pat=""
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case "$1" in
|
|
||||||
-e | -f) opt="$opt $1"; shift; pat="$1"
|
|
||||||
if test "$grep" = grep; then # grep is buggy with -e on SVR4
|
|
||||||
grep=egrep
|
|
||||||
fi;;
|
|
||||||
-A | -B) opt="$opt $1 $2"; shift;;
|
|
||||||
-*) opt="$opt $1";;
|
|
||||||
*) if test -z "$pat"; then
|
|
||||||
pat="$1"
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
fi;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$pat"; then
|
|
||||||
echo "grep through bzip2 files"
|
|
||||||
echo "usage: $prog [grep_options] pattern [files]"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
list=0
|
|
||||||
silent=0
|
|
||||||
op=`echo "$opt" | sed -e 's/ //g' -e 's/-//g'`
|
|
||||||
case "$op" in
|
|
||||||
*l*) list=1
|
|
||||||
esac
|
|
||||||
case "$op" in
|
|
||||||
*h*) silent=1
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
bzip2 -cdfq | $grep $opt "$pat"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
|
|
||||||
res=0
|
|
||||||
for i do
|
|
||||||
if test -f "$i"; then :; else if test -f "$i.bz2"; then i="$i.bz2"; fi; fi
|
|
||||||
if test $list -eq 1; then
|
|
||||||
bzip2 -cdfq "$i" | $grep $opt "$pat" 2>&1 > /dev/null && echo $i
|
|
||||||
r=$?
|
|
||||||
elif test $# -eq 1 -o $silent -eq 1; then
|
|
||||||
bzip2 -cdfq "$i" | $grep $opt "$pat"
|
|
||||||
r=$?
|
|
||||||
else
|
|
||||||
j=${i//\\/\\\\}
|
|
||||||
j=${j//|/\\|}
|
|
||||||
j=${j//&/\\&}
|
|
||||||
j=`printf "%s" "$j" | tr '\n' ' '`
|
|
||||||
bzip2 -cdfq "$i" | $grep $opt "$pat" | sed "s|^|${j}:|"
|
|
||||||
r=$?
|
|
||||||
fi
|
|
||||||
test "$r" -ne 0 && res="$r"
|
|
||||||
done
|
|
||||||
exit $res
|
|
@ -1,56 +0,0 @@
|
|||||||
\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
|
|
||||||
\"for Debian GNU/Linux
|
|
||||||
.TH BZGREP 1
|
|
||||||
.SH NAME
|
|
||||||
bzgrep, bzfgrep, bzegrep \- search possibly bzip2 compressed files for a regular expression
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B bzgrep
|
|
||||||
[ grep_options ]
|
|
||||||
.BI [\ -e\ ] " pattern"
|
|
||||||
.IR filename ".\|.\|."
|
|
||||||
.br
|
|
||||||
.B bzegrep
|
|
||||||
[ egrep_options ]
|
|
||||||
.BI [\ -e\ ] " pattern"
|
|
||||||
.IR filename ".\|.\|."
|
|
||||||
.br
|
|
||||||
.B bzfgrep
|
|
||||||
[ fgrep_options ]
|
|
||||||
.BI [\ -e\ ] " pattern"
|
|
||||||
.IR filename ".\|.\|."
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.IR Bzgrep
|
|
||||||
is used to invoke the
|
|
||||||
.I grep
|
|
||||||
on bzip2-compressed files. All options specified are passed directly to
|
|
||||||
.I grep.
|
|
||||||
If no file is specified, then the standard input is decompressed
|
|
||||||
if necessary and fed to grep.
|
|
||||||
Otherwise the given files are uncompressed if necessary and fed to
|
|
||||||
.I grep.
|
|
||||||
.PP
|
|
||||||
If
|
|
||||||
.I bzgrep
|
|
||||||
is invoked as
|
|
||||||
.I bzegrep
|
|
||||||
or
|
|
||||||
.I bzfgrep
|
|
||||||
then
|
|
||||||
.I egrep
|
|
||||||
or
|
|
||||||
.I fgrep
|
|
||||||
is used instead of
|
|
||||||
.I grep.
|
|
||||||
If the GREP environment variable is set,
|
|
||||||
.I bzgrep
|
|
||||||
uses it as the
|
|
||||||
.I grep
|
|
||||||
program to be invoked. For example:
|
|
||||||
|
|
||||||
for sh: GREP=fgrep bzgrep string files
|
|
||||||
for csh: (setenv GREP fgrep; bzgrep string files)
|
|
||||||
.SH AUTHOR
|
|
||||||
Charles Levert (charles@comm.polymtl.ca). Adapted to bzip2 by Philippe
|
|
||||||
Troin <phil@fifi.org> for Debian GNU/Linux.
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
grep(1), egrep(1), fgrep(1), bzdiff(1), bzmore(1), bzless(1), bzip2(1)
|
|
@ -1,74 +0,0 @@
|
|||||||
/* Colours:
|
|
||||||
#74240f dark brown h1, h2, h3, h4
|
|
||||||
#336699 medium blue links
|
|
||||||
#339999 turquoise link hover colour
|
|
||||||
#202020 almost black general text
|
|
||||||
#761596 purple md5sum text
|
|
||||||
#626262 dark gray pre border
|
|
||||||
#eeeeee very light gray pre background
|
|
||||||
#f2f2f9 very light blue nav table background
|
|
||||||
#3366cc medium blue nav table border
|
|
||||||
*/
|
|
||||||
|
|
||||||
a, a:link, a:visited, a:active { color: #336699; }
|
|
||||||
a:hover { color: #339999; }
|
|
||||||
|
|
||||||
body { font: 80%/126% sans-serif; }
|
|
||||||
h1, h2, h3, h4 { color: #74240f; }
|
|
||||||
|
|
||||||
dt { color: #336699; font-weight: bold }
|
|
||||||
dd {
|
|
||||||
margin-left: 1.5em;
|
|
||||||
padding-bottom: 0.8em;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- ruler -- */
|
|
||||||
div.hr_blue {
|
|
||||||
height: 3px;
|
|
||||||
background:#ffffff url("/images/hr_blue.png") repeat-x; }
|
|
||||||
div.hr_blue hr { display:none; }
|
|
||||||
|
|
||||||
/* release styles */
|
|
||||||
#release p { margin-top: 0.4em; }
|
|
||||||
#release .md5sum { color: #761596; }
|
|
||||||
|
|
||||||
|
|
||||||
/* ------ styles for docs|manuals|howto ------ */
|
|
||||||
/* -- lists -- */
|
|
||||||
ul {
|
|
||||||
margin: 0px 4px 16px 16px;
|
|
||||||
padding: 0px;
|
|
||||||
list-style: url("/images/li-blue.png");
|
|
||||||
}
|
|
||||||
ul li {
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
ul ul {
|
|
||||||
list-style-type: none;
|
|
||||||
list-style-image: none;
|
|
||||||
margin-left: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* header / footer nav tables */
|
|
||||||
table.nav {
|
|
||||||
border: solid 1px #3366cc;
|
|
||||||
background: #f2f2f9;
|
|
||||||
background-color: #f2f2f9;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
}
|
|
||||||
/* don't have underlined links in chunked nav menus */
|
|
||||||
table.nav a { text-decoration: none; }
|
|
||||||
table.nav a:hover { text-decoration: underline; }
|
|
||||||
table.nav td { font-size: 85%; }
|
|
||||||
|
|
||||||
code, tt, pre { font-size: 120%; }
|
|
||||||
code, tt { color: #761596; }
|
|
||||||
|
|
||||||
div.literallayout, pre.programlisting, pre.screen {
|
|
||||||
color: #000000;
|
|
||||||
padding: 0.5em;
|
|
||||||
background: #eeeeee;
|
|
||||||
border: 1px solid #626262;
|
|
||||||
background-color: #eeeeee;
|
|
||||||
margin: 4px 0px 4px 0px;
|
|
||||||
}
|
|
@ -1,454 +0,0 @@
|
|||||||
.PU
|
|
||||||
.TH bzip2 1
|
|
||||||
.SH NAME
|
|
||||||
bzip2, bunzip2 \- a block-sorting file compressor, v1.0.6
|
|
||||||
.br
|
|
||||||
bzcat \- decompresses files to stdout
|
|
||||||
.br
|
|
||||||
bzip2recover \- recovers data from damaged bzip2 files
|
|
||||||
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.ll +8
|
|
||||||
.B bzip2
|
|
||||||
.RB [ " \-cdfkqstvzVL123456789 " ]
|
|
||||||
[
|
|
||||||
.I "filenames \&..."
|
|
||||||
]
|
|
||||||
.ll -8
|
|
||||||
.br
|
|
||||||
.B bunzip2
|
|
||||||
.RB [ " \-fkvsVL " ]
|
|
||||||
[
|
|
||||||
.I "filenames \&..."
|
|
||||||
]
|
|
||||||
.br
|
|
||||||
.B bzcat
|
|
||||||
.RB [ " \-s " ]
|
|
||||||
[
|
|
||||||
.I "filenames \&..."
|
|
||||||
]
|
|
||||||
.br
|
|
||||||
.B bzip2recover
|
|
||||||
.I "filename"
|
|
||||||
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.I bzip2
|
|
||||||
compresses files using the Burrows-Wheeler block sorting
|
|
||||||
text compression algorithm, and Huffman coding. Compression is
|
|
||||||
generally considerably better than that achieved by more conventional
|
|
||||||
LZ77/LZ78-based compressors, and approaches the performance of the PPM
|
|
||||||
family of statistical compressors.
|
|
||||||
|
|
||||||
The command-line options are deliberately very similar to
|
|
||||||
those of
|
|
||||||
.I GNU gzip,
|
|
||||||
but they are not identical.
|
|
||||||
|
|
||||||
.I bzip2
|
|
||||||
expects a list of file names to accompany the
|
|
||||||
command-line flags. Each file is replaced by a compressed version of
|
|
||||||
itself, with the name "original_name.bz2".
|
|
||||||
Each compressed file
|
|
||||||
has the same modification date, permissions, and, when possible,
|
|
||||||
ownership as the corresponding original, so that these properties can
|
|
||||||
be correctly restored at decompression time. File name handling is
|
|
||||||
naive in the sense that there is no mechanism for preserving original
|
|
||||||
file names, permissions, ownerships or dates in filesystems which lack
|
|
||||||
these concepts, or have serious file name length restrictions, such as
|
|
||||||
MS-DOS.
|
|
||||||
|
|
||||||
.I bzip2
|
|
||||||
and
|
|
||||||
.I bunzip2
|
|
||||||
will by default not overwrite existing
|
|
||||||
files. If you want this to happen, specify the \-f flag.
|
|
||||||
|
|
||||||
If no file names are specified,
|
|
||||||
.I bzip2
|
|
||||||
compresses from standard
|
|
||||||
input to standard output. In this case,
|
|
||||||
.I bzip2
|
|
||||||
will decline to
|
|
||||||
write compressed output to a terminal, as this would be entirely
|
|
||||||
incomprehensible and therefore pointless.
|
|
||||||
|
|
||||||
.I bunzip2
|
|
||||||
(or
|
|
||||||
.I bzip2 \-d)
|
|
||||||
decompresses all
|
|
||||||
specified files. Files which were not created by
|
|
||||||
.I bzip2
|
|
||||||
will be detected and ignored, and a warning issued.
|
|
||||||
.I bzip2
|
|
||||||
attempts to guess the filename for the decompressed file
|
|
||||||
from that of the compressed file as follows:
|
|
||||||
|
|
||||||
filename.bz2 becomes filename
|
|
||||||
filename.bz becomes filename
|
|
||||||
filename.tbz2 becomes filename.tar
|
|
||||||
filename.tbz becomes filename.tar
|
|
||||||
anyothername becomes anyothername.out
|
|
||||||
|
|
||||||
If the file does not end in one of the recognised endings,
|
|
||||||
.I .bz2,
|
|
||||||
.I .bz,
|
|
||||||
.I .tbz2
|
|
||||||
or
|
|
||||||
.I .tbz,
|
|
||||||
.I bzip2
|
|
||||||
complains that it cannot
|
|
||||||
guess the name of the original file, and uses the original name
|
|
||||||
with
|
|
||||||
.I .out
|
|
||||||
appended.
|
|
||||||
|
|
||||||
As with compression, supplying no
|
|
||||||
filenames causes decompression from
|
|
||||||
standard input to standard output.
|
|
||||||
|
|
||||||
.I bunzip2
|
|
||||||
will correctly decompress a file which is the
|
|
||||||
concatenation of two or more compressed files. The result is the
|
|
||||||
concatenation of the corresponding uncompressed files. Integrity
|
|
||||||
testing (\-t)
|
|
||||||
of concatenated
|
|
||||||
compressed files is also supported.
|
|
||||||
|
|
||||||
You can also compress or decompress files to the standard output by
|
|
||||||
giving the \-c flag. Multiple files may be compressed and
|
|
||||||
decompressed like this. The resulting outputs are fed sequentially to
|
|
||||||
stdout. Compression of multiple files
|
|
||||||
in this manner generates a stream
|
|
||||||
containing multiple compressed file representations. Such a stream
|
|
||||||
can be decompressed correctly only by
|
|
||||||
.I bzip2
|
|
||||||
version 0.9.0 or
|
|
||||||
later. Earlier versions of
|
|
||||||
.I bzip2
|
|
||||||
will stop after decompressing
|
|
||||||
the first file in the stream.
|
|
||||||
|
|
||||||
.I bzcat
|
|
||||||
(or
|
|
||||||
.I bzip2 -dc)
|
|
||||||
decompresses all specified files to
|
|
||||||
the standard output.
|
|
||||||
|
|
||||||
.I bzip2
|
|
||||||
will read arguments from the environment variables
|
|
||||||
.I BZIP2
|
|
||||||
and
|
|
||||||
.I BZIP,
|
|
||||||
in that order, and will process them
|
|
||||||
before any arguments read from the command line. This gives a
|
|
||||||
convenient way to supply default arguments.
|
|
||||||
|
|
||||||
Compression is always performed, even if the compressed
|
|
||||||
file is slightly
|
|
||||||
larger than the original. Files of less than about one hundred bytes
|
|
||||||
tend to get larger, since the compression mechanism has a constant
|
|
||||||
overhead in the region of 50 bytes. Random data (including the output
|
|
||||||
of most file compressors) is coded at about 8.05 bits per byte, giving
|
|
||||||
an expansion of around 0.5%.
|
|
||||||
|
|
||||||
As a self-check for your protection,
|
|
||||||
.I
|
|
||||||
bzip2
|
|
||||||
uses 32-bit CRCs to
|
|
||||||
make sure that the decompressed version of a file is identical to the
|
|
||||||
original. This guards against corruption of the compressed data, and
|
|
||||||
against undetected bugs in
|
|
||||||
.I bzip2
|
|
||||||
(hopefully very unlikely). The
|
|
||||||
chances of data corruption going undetected is microscopic, about one
|
|
||||||
chance in four billion for each file processed. Be aware, though, that
|
|
||||||
the check occurs upon decompression, so it can only tell you that
|
|
||||||
something is wrong. It can't help you
|
|
||||||
recover the original uncompressed
|
|
||||||
data. You can use
|
|
||||||
.I bzip2recover
|
|
||||||
to try to recover data from
|
|
||||||
damaged files.
|
|
||||||
|
|
||||||
Return values: 0 for a normal exit, 1 for environmental problems (file
|
|
||||||
not found, invalid flags, I/O errors, &c), 2 to indicate a corrupt
|
|
||||||
compressed file, 3 for an internal consistency error (eg, bug) which
|
|
||||||
caused
|
|
||||||
.I bzip2
|
|
||||||
to panic.
|
|
||||||
|
|
||||||
.SH OPTIONS
|
|
||||||
.TP
|
|
||||||
.B \-c --stdout
|
|
||||||
Compress or decompress to standard output.
|
|
||||||
.TP
|
|
||||||
.B \-d --decompress
|
|
||||||
Force decompression.
|
|
||||||
.I bzip2,
|
|
||||||
.I bunzip2
|
|
||||||
and
|
|
||||||
.I bzcat
|
|
||||||
are
|
|
||||||
really the same program, and the decision about what actions to take is
|
|
||||||
done on the basis of which name is used. This flag overrides that
|
|
||||||
mechanism, and forces
|
|
||||||
.I bzip2
|
|
||||||
to decompress.
|
|
||||||
.TP
|
|
||||||
.B \-z --compress
|
|
||||||
The complement to \-d: forces compression, regardless of the
|
|
||||||
invocation name.
|
|
||||||
.TP
|
|
||||||
.B \-t --test
|
|
||||||
Check integrity of the specified file(s), but don't decompress them.
|
|
||||||
This really performs a trial decompression and throws away the result.
|
|
||||||
.TP
|
|
||||||
.B \-f --force
|
|
||||||
Force overwrite of output files. Normally,
|
|
||||||
.I bzip2
|
|
||||||
will not overwrite
|
|
||||||
existing output files. Also forces
|
|
||||||
.I bzip2
|
|
||||||
to break hard links
|
|
||||||
to files, which it otherwise wouldn't do.
|
|
||||||
|
|
||||||
bzip2 normally declines to decompress files which don't have the
|
|
||||||
correct magic header bytes. If forced (-f), however, it will pass
|
|
||||||
such files through unmodified. This is how GNU gzip behaves.
|
|
||||||
.TP
|
|
||||||
.B \-k --keep
|
|
||||||
Keep (don't delete) input files during compression
|
|
||||||
or decompression.
|
|
||||||
.TP
|
|
||||||
.B \-s --small
|
|
||||||
Reduce memory usage, for compression, decompression and testing. Files
|
|
||||||
are decompressed and tested using a modified algorithm which only
|
|
||||||
requires 2.5 bytes per block byte. This means any file can be
|
|
||||||
decompressed in 2300k of memory, albeit at about half the normal speed.
|
|
||||||
|
|
||||||
During compression, \-s selects a block size of 200k, which limits
|
|
||||||
memory use to around the same figure, at the expense of your compression
|
|
||||||
ratio. In short, if your machine is low on memory (8 megabytes or
|
|
||||||
less), use \-s for everything. See MEMORY MANAGEMENT below.
|
|
||||||
.TP
|
|
||||||
.B \-q --quiet
|
|
||||||
Suppress non-essential warning messages. Messages pertaining to
|
|
||||||
I/O errors and other critical events will not be suppressed.
|
|
||||||
.TP
|
|
||||||
.B \-v --verbose
|
|
||||||
Verbose mode -- show the compression ratio for each file processed.
|
|
||||||
Further \-v's increase the verbosity level, spewing out lots of
|
|
||||||
information which is primarily of interest for diagnostic purposes.
|
|
||||||
.TP
|
|
||||||
.B \-L --license -V --version
|
|
||||||
Display the software version, license terms and conditions.
|
|
||||||
.TP
|
|
||||||
.B \-1 (or \-\-fast) to \-9 (or \-\-best)
|
|
||||||
Set the block size to 100 k, 200 k .. 900 k when compressing. Has no
|
|
||||||
effect when decompressing. See MEMORY MANAGEMENT below.
|
|
||||||
The \-\-fast and \-\-best aliases are primarily for GNU gzip
|
|
||||||
compatibility. In particular, \-\-fast doesn't make things
|
|
||||||
significantly faster.
|
|
||||||
And \-\-best merely selects the default behaviour.
|
|
||||||
.TP
|
|
||||||
.B \--
|
|
||||||
Treats all subsequent arguments as file names, even if they start
|
|
||||||
with a dash. This is so you can handle files with names beginning
|
|
||||||
with a dash, for example: bzip2 \-- \-myfilename.
|
|
||||||
.TP
|
|
||||||
.B \--repetitive-fast --repetitive-best
|
|
||||||
These flags are redundant in versions 0.9.5 and above. They provided
|
|
||||||
some coarse control over the behaviour of the sorting algorithm in
|
|
||||||
earlier versions, which was sometimes useful. 0.9.5 and above have an
|
|
||||||
improved algorithm which renders these flags irrelevant.
|
|
||||||
|
|
||||||
.SH MEMORY MANAGEMENT
|
|
||||||
.I bzip2
|
|
||||||
compresses large files in blocks. The block size affects
|
|
||||||
both the compression ratio achieved, and the amount of memory needed for
|
|
||||||
compression and decompression. The flags \-1 through \-9
|
|
||||||
specify the block size to be 100,000 bytes through 900,000 bytes (the
|
|
||||||
default) respectively. At decompression time, the block size used for
|
|
||||||
compression is read from the header of the compressed file, and
|
|
||||||
.I bunzip2
|
|
||||||
then allocates itself just enough memory to decompress
|
|
||||||
the file. Since block sizes are stored in compressed files, it follows
|
|
||||||
that the flags \-1 to \-9 are irrelevant to and so ignored
|
|
||||||
during decompression.
|
|
||||||
|
|
||||||
Compression and decompression requirements,
|
|
||||||
in bytes, can be estimated as:
|
|
||||||
|
|
||||||
Compression: 400k + ( 8 x block size )
|
|
||||||
|
|
||||||
Decompression: 100k + ( 4 x block size ), or
|
|
||||||
100k + ( 2.5 x block size )
|
|
||||||
|
|
||||||
Larger block sizes give rapidly diminishing marginal returns. Most of
|
|
||||||
the compression comes from the first two or three hundred k of block
|
|
||||||
size, a fact worth bearing in mind when using
|
|
||||||
.I bzip2
|
|
||||||
on small machines.
|
|
||||||
It is also important to appreciate that the decompression memory
|
|
||||||
requirement is set at compression time by the choice of block size.
|
|
||||||
|
|
||||||
For files compressed with the default 900k block size,
|
|
||||||
.I bunzip2
|
|
||||||
will require about 3700 kbytes to decompress. To support decompression
|
|
||||||
of any file on a 4 megabyte machine,
|
|
||||||
.I bunzip2
|
|
||||||
has an option to
|
|
||||||
decompress using approximately half this amount of memory, about 2300
|
|
||||||
kbytes. Decompression speed is also halved, so you should use this
|
|
||||||
option only where necessary. The relevant flag is -s.
|
|
||||||
|
|
||||||
In general, try and use the largest block size memory constraints allow,
|
|
||||||
since that maximises the compression achieved. Compression and
|
|
||||||
decompression speed are virtually unaffected by block size.
|
|
||||||
|
|
||||||
Another significant point applies to files which fit in a single block
|
|
||||||
-- that means most files you'd encounter using a large block size. The
|
|
||||||
amount of real memory touched is proportional to the size of the file,
|
|
||||||
since the file is smaller than a block. For example, compressing a file
|
|
||||||
20,000 bytes long with the flag -9 will cause the compressor to
|
|
||||||
allocate around 7600k of memory, but only touch 400k + 20000 * 8 = 560
|
|
||||||
kbytes of it. Similarly, the decompressor will allocate 3700k but only
|
|
||||||
touch 100k + 20000 * 4 = 180 kbytes.
|
|
||||||
|
|
||||||
Here is a table which summarises the maximum memory usage for different
|
|
||||||
block sizes. Also recorded is the total compressed size for 14 files of
|
|
||||||
the Calgary Text Compression Corpus totalling 3,141,622 bytes. This
|
|
||||||
column gives some feel for how compression varies with block size.
|
|
||||||
These figures tend to understate the advantage of larger block sizes for
|
|
||||||
larger files, since the Corpus is dominated by smaller files.
|
|
||||||
|
|
||||||
Compress Decompress Decompress Corpus
|
|
||||||
Flag usage usage -s usage Size
|
|
||||||
|
|
||||||
-1 1200k 500k 350k 914704
|
|
||||||
-2 2000k 900k 600k 877703
|
|
||||||
-3 2800k 1300k 850k 860338
|
|
||||||
-4 3600k 1700k 1100k 846899
|
|
||||||
-5 4400k 2100k 1350k 845160
|
|
||||||
-6 5200k 2500k 1600k 838626
|
|
||||||
-7 6100k 2900k 1850k 834096
|
|
||||||
-8 6800k 3300k 2100k 828642
|
|
||||||
-9 7600k 3700k 2350k 828642
|
|
||||||
|
|
||||||
.SH RECOVERING DATA FROM DAMAGED FILES
|
|
||||||
.I bzip2
|
|
||||||
compresses files in blocks, usually 900kbytes long. Each
|
|
||||||
block is handled independently. If a media or transmission error causes
|
|
||||||
a multi-block .bz2
|
|
||||||
file to become damaged, it may be possible to
|
|
||||||
recover data from the undamaged blocks in the file.
|
|
||||||
|
|
||||||
The compressed representation of each block is delimited by a 48-bit
|
|
||||||
pattern, which makes it possible to find the block boundaries with
|
|
||||||
reasonable certainty. Each block also carries its own 32-bit CRC, so
|
|
||||||
damaged blocks can be distinguished from undamaged ones.
|
|
||||||
|
|
||||||
.I bzip2recover
|
|
||||||
is a simple program whose purpose is to search for
|
|
||||||
blocks in .bz2 files, and write each block out into its own .bz2
|
|
||||||
file. You can then use
|
|
||||||
.I bzip2
|
|
||||||
\-t
|
|
||||||
to test the
|
|
||||||
integrity of the resulting files, and decompress those which are
|
|
||||||
undamaged.
|
|
||||||
|
|
||||||
.I bzip2recover
|
|
||||||
takes a single argument, the name of the damaged file,
|
|
||||||
and writes a number of files "rec00001file.bz2",
|
|
||||||
"rec00002file.bz2", etc, containing the extracted blocks.
|
|
||||||
The output filenames are designed so that the use of
|
|
||||||
wildcards in subsequent processing -- for example,
|
|
||||||
"bzip2 -dc rec*file.bz2 > recovered_data" -- processes the files in
|
|
||||||
the correct order.
|
|
||||||
|
|
||||||
.I bzip2recover
|
|
||||||
should be of most use dealing with large .bz2
|
|
||||||
files, as these will contain many blocks. It is clearly
|
|
||||||
futile to use it on damaged single-block files, since a
|
|
||||||
damaged block cannot be recovered. If you wish to minimise
|
|
||||||
any potential data loss through media or transmission errors,
|
|
||||||
you might consider compressing with a smaller
|
|
||||||
block size.
|
|
||||||
|
|
||||||
.SH PERFORMANCE NOTES
|
|
||||||
The sorting phase of compression gathers together similar strings in the
|
|
||||||
file. Because of this, files containing very long runs of repeated
|
|
||||||
symbols, like "aabaabaabaab ..." (repeated several hundred times) may
|
|
||||||
compress more slowly than normal. Versions 0.9.5 and above fare much
|
|
||||||
better than previous versions in this respect. The ratio between
|
|
||||||
worst-case and average-case compression time is in the region of 10:1.
|
|
||||||
For previous versions, this figure was more like 100:1. You can use the
|
|
||||||
\-vvvv option to monitor progress in great detail, if you want.
|
|
||||||
|
|
||||||
Decompression speed is unaffected by these phenomena.
|
|
||||||
|
|
||||||
.I bzip2
|
|
||||||
usually allocates several megabytes of memory to operate
|
|
||||||
in, and then charges all over it in a fairly random fashion. This means
|
|
||||||
that performance, both for compressing and decompressing, is largely
|
|
||||||
determined by the speed at which your machine can service cache misses.
|
|
||||||
Because of this, small changes to the code to reduce the miss rate have
|
|
||||||
been observed to give disproportionately large performance improvements.
|
|
||||||
I imagine
|
|
||||||
.I bzip2
|
|
||||||
will perform best on machines with very large caches.
|
|
||||||
|
|
||||||
.SH CAVEATS
|
|
||||||
I/O error messages are not as helpful as they could be.
|
|
||||||
.I bzip2
|
|
||||||
tries hard to detect I/O errors and exit cleanly, but the details of
|
|
||||||
what the problem is sometimes seem rather misleading.
|
|
||||||
|
|
||||||
This manual page pertains to version 1.0.6 of
|
|
||||||
.I bzip2.
|
|
||||||
Compressed data created by this version is entirely forwards and
|
|
||||||
backwards compatible with the previous public releases, versions
|
|
||||||
0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1, 1.0.2 and above, but with the following
|
|
||||||
exception: 0.9.0 and above can correctly decompress multiple
|
|
||||||
concatenated compressed files. 0.1pl2 cannot do this; it will stop
|
|
||||||
after decompressing just the first file in the stream.
|
|
||||||
|
|
||||||
.I bzip2recover
|
|
||||||
versions prior to 1.0.2 used 32-bit integers to represent
|
|
||||||
bit positions in compressed files, so they could not handle compressed
|
|
||||||
files more than 512 megabytes long. Versions 1.0.2 and above use
|
|
||||||
64-bit ints on some platforms which support them (GNU supported
|
|
||||||
targets, and Windows). To establish whether or not bzip2recover was
|
|
||||||
built with such a limitation, run it without arguments. In any event
|
|
||||||
you can build yourself an unlimited version if you can recompile it
|
|
||||||
with MaybeUInt64 set to be an unsigned 64-bit integer.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.SH AUTHOR
|
|
||||||
Julian Seward, jsewardbzip.org.
|
|
||||||
|
|
||||||
http://www.bzip.org
|
|
||||||
|
|
||||||
The ideas embodied in
|
|
||||||
.I bzip2
|
|
||||||
are due to (at least) the following
|
|
||||||
people: Michael Burrows and David Wheeler (for the block sorting
|
|
||||||
transformation), David Wheeler (again, for the Huffman coder), Peter
|
|
||||||
Fenwick (for the structured coding model in the original
|
|
||||||
.I bzip,
|
|
||||||
and many refinements), and Alistair Moffat, Radford Neal and Ian Witten
|
|
||||||
(for the arithmetic coder in the original
|
|
||||||
.I bzip).
|
|
||||||
I am much
|
|
||||||
indebted for their help, support and advice. See the manual in the
|
|
||||||
source distribution for pointers to sources of documentation. Christian
|
|
||||||
von Roques encouraged me to look for faster sorting algorithms, so as to
|
|
||||||
speed up compression. Bela Lubkin encouraged me to improve the
|
|
||||||
worst-case compression performance.
|
|
||||||
Donna Robinson XMLised the documentation.
|
|
||||||
The bz* scripts are derived from those of GNU gzip.
|
|
||||||
Many people sent patches, helped
|
|
||||||
with portability problems, lent machines, gave advice and were generally
|
|
||||||
helpful.
|
|
@ -1,399 +0,0 @@
|
|||||||
bzip2(1) bzip2(1)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
NNAAMMEE
|
|
||||||
bzip2, bunzip2 − a block‐sorting file compressor, v1.0.6
|
|
||||||
bzcat − decompresses files to stdout
|
|
||||||
bzip2recover − recovers data from damaged bzip2 files
|
|
||||||
|
|
||||||
|
|
||||||
SSYYNNOOPPSSIISS
|
|
||||||
bbzziipp22 [ −−ccddffkkqqssttvvzzVVLL112233445566778899 ] [ _f_i_l_e_n_a_m_e_s _._._. ]
|
|
||||||
bbuunnzziipp22 [ −−ffkkvvssVVLL ] [ _f_i_l_e_n_a_m_e_s _._._. ]
|
|
||||||
bbzzccaatt [ −−ss ] [ _f_i_l_e_n_a_m_e_s _._._. ]
|
|
||||||
bbzziipp22rreeccoovveerr _f_i_l_e_n_a_m_e
|
|
||||||
|
|
||||||
|
|
||||||
DDEESSCCRRIIPPTTIIOONN
|
|
||||||
_b_z_i_p_2 compresses files using the Burrows‐Wheeler block
|
|
||||||
sorting text compression algorithm, and Huffman coding.
|
|
||||||
Compression is generally considerably better than that
|
|
||||||
achieved by more conventional LZ77/LZ78‐based compressors,
|
|
||||||
and approaches the performance of the PPM family of sta
|
|
||||||
tistical compressors.
|
|
||||||
|
|
||||||
The command‐line options are deliberately very similar to
|
|
||||||
those of _G_N_U _g_z_i_p_, but they are not identical.
|
|
||||||
|
|
||||||
_b_z_i_p_2 expects a list of file names to accompany the com
|
|
||||||
mand‐line flags. Each file is replaced by a compressed
|
|
||||||
version of itself, with the name "original_name.bz2".
|
|
||||||
Each compressed file has the same modification date, per
|
|
||||||
missions, and, when possible, ownership as the correspond
|
|
||||||
ing original, so that these properties can be correctly
|
|
||||||
restored at decompression time. File name handling is
|
|
||||||
naive in the sense that there is no mechanism for preserv
|
|
||||||
ing original file names, permissions, ownerships or dates
|
|
||||||
in filesystems which lack these concepts, or have serious
|
|
||||||
file name length restrictions, such as MS‐DOS.
|
|
||||||
|
|
||||||
_b_z_i_p_2 and _b_u_n_z_i_p_2 will by default not overwrite existing
|
|
||||||
files. If you want this to happen, specify the −f flag.
|
|
||||||
|
|
||||||
If no file names are specified, _b_z_i_p_2 compresses from
|
|
||||||
standard input to standard output. In this case, _b_z_i_p_2
|
|
||||||
will decline to write compressed output to a terminal, as
|
|
||||||
this would be entirely incomprehensible and therefore
|
|
||||||
pointless.
|
|
||||||
|
|
||||||
_b_u_n_z_i_p_2 (or _b_z_i_p_2 _−_d_) decompresses all specified files.
|
|
||||||
Files which were not created by _b_z_i_p_2 will be detected and
|
|
||||||
ignored, and a warning issued. _b_z_i_p_2 attempts to guess
|
|
||||||
the filename for the decompressed file from that of the
|
|
||||||
compressed file as follows:
|
|
||||||
|
|
||||||
filename.bz2 becomes filename
|
|
||||||
filename.bz becomes filename
|
|
||||||
filename.tbz2 becomes filename.tar
|
|
||||||
filename.tbz becomes filename.tar
|
|
||||||
anyothername becomes anyothername.out
|
|
||||||
|
|
||||||
If the file does not end in one of the recognised endings,
|
|
||||||
_._b_z_2_, _._b_z_, _._t_b_z_2 or _._t_b_z_, _b_z_i_p_2 complains that it cannot
|
|
||||||
guess the name of the original file, and uses the original
|
|
||||||
name with _._o_u_t appended.
|
|
||||||
|
|
||||||
As with compression, supplying no filenames causes decom
|
|
||||||
pression from standard input to standard output.
|
|
||||||
|
|
||||||
_b_u_n_z_i_p_2 will correctly decompress a file which is the con
|
|
||||||
catenation of two or more compressed files. The result is
|
|
||||||
the concatenation of the corresponding uncompressed files.
|
|
||||||
Integrity testing (−t) of concatenated compressed files is
|
|
||||||
also supported.
|
|
||||||
|
|
||||||
You can also compress or decompress files to the standard
|
|
||||||
output by giving the −c flag. Multiple files may be com
|
|
||||||
pressed and decompressed like this. The resulting outputs
|
|
||||||
are fed sequentially to stdout. Compression of multiple
|
|
||||||
files in this manner generates a stream containing multi
|
|
||||||
ple compressed file representations. Such a stream can be
|
|
||||||
decompressed correctly only by _b_z_i_p_2 version 0.9.0 or
|
|
||||||
later. Earlier versions of _b_z_i_p_2 will stop after decom
|
|
||||||
pressing the first file in the stream.
|
|
||||||
|
|
||||||
_b_z_c_a_t (or _b_z_i_p_2 _‐_d_c_) decompresses all specified files to
|
|
||||||
the standard output.
|
|
||||||
|
|
||||||
_b_z_i_p_2 will read arguments from the environment variables
|
|
||||||
_B_Z_I_P_2 and _B_Z_I_P_, in that order, and will process them
|
|
||||||
before any arguments read from the command line. This
|
|
||||||
gives a convenient way to supply default arguments.
|
|
||||||
|
|
||||||
Compression is always performed, even if the compressed
|
|
||||||
file is slightly larger than the original. Files of less
|
|
||||||
than about one hundred bytes tend to get larger, since the
|
|
||||||
compression mechanism has a constant overhead in the
|
|
||||||
region of 50 bytes. Random data (including the output of
|
|
||||||
most file compressors) is coded at about 8.05 bits per
|
|
||||||
byte, giving an expansion of around 0.5%.
|
|
||||||
|
|
||||||
As a self‐check for your protection, _b_z_i_p_2 uses 32‐bit
|
|
||||||
CRCs to make sure that the decompressed version of a file
|
|
||||||
is identical to the original. This guards against corrup
|
|
||||||
tion of the compressed data, and against undetected bugs
|
|
||||||
in _b_z_i_p_2 (hopefully very unlikely). The chances of data
|
|
||||||
corruption going undetected is microscopic, about one
|
|
||||||
chance in four billion for each file processed. Be aware,
|
|
||||||
though, that the check occurs upon decompression, so it
|
|
||||||
can only tell you that something is wrong. It can’t help
|
|
||||||
you recover the original uncompressed data. You can use
|
|
||||||
_b_z_i_p_2_r_e_c_o_v_e_r to try to recover data from damaged files.
|
|
||||||
|
|
||||||
Return values: 0 for a normal exit, 1 for environmental
|
|
||||||
problems (file not found, invalid flags, I/O errors, &c),
|
|
||||||
2 to indicate a corrupt compressed file, 3 for an internal
|
|
||||||
consistency error (eg, bug) which caused _b_z_i_p_2 to panic.
|
|
||||||
|
|
||||||
|
|
||||||
OOPPTTIIOONNSS
|
|
||||||
−−cc ‐‐‐‐ssttddoouutt
|
|
||||||
Compress or decompress to standard output.
|
|
||||||
|
|
||||||
−−dd ‐‐‐‐ddeeccoommpprreessss
|
|
||||||
Force decompression. _b_z_i_p_2_, _b_u_n_z_i_p_2 and _b_z_c_a_t are
|
|
||||||
really the same program, and the decision about
|
|
||||||
what actions to take is done on the basis of which
|
|
||||||
name is used. This flag overrides that mechanism,
|
|
||||||
and forces _b_z_i_p_2 to decompress.
|
|
||||||
|
|
||||||
−−zz ‐‐‐‐ccoommpprreessss
|
|
||||||
The complement to −d: forces compression,
|
|
||||||
regardless of the invocation name.
|
|
||||||
|
|
||||||
−−tt ‐‐‐‐tteesstt
|
|
||||||
Check integrity of the specified file(s), but don’t
|
|
||||||
decompress them. This really performs a trial
|
|
||||||
decompression and throws away the result.
|
|
||||||
|
|
||||||
−−ff ‐‐‐‐ffoorrccee
|
|
||||||
Force overwrite of output files. Normally, _b_z_i_p_2
|
|
||||||
will not overwrite existing output files. Also
|
|
||||||
forces _b_z_i_p_2 to break hard links to files, which it
|
|
||||||
otherwise wouldn’t do.
|
|
||||||
|
|
||||||
bzip2 normally declines to decompress files which
|
|
||||||
don’t have the correct magic header bytes. If
|
|
||||||
forced (‐f), however, it will pass such files
|
|
||||||
through unmodified. This is how GNU gzip behaves.
|
|
||||||
|
|
||||||
−−kk ‐‐‐‐kkeeeepp
|
|
||||||
Keep (don’t delete) input files during compression
|
|
||||||
or decompression.
|
|
||||||
|
|
||||||
−−ss ‐‐‐‐ssmmaallll
|
|
||||||
Reduce memory usage, for compression, decompression
|
|
||||||
and testing. Files are decompressed and tested
|
|
||||||
using a modified algorithm which only requires 2.5
|
|
||||||
bytes per block byte. This means any file can be
|
|
||||||
decompressed in 2300k of memory, albeit at about
|
|
||||||
half the normal speed.
|
|
||||||
|
|
||||||
During compression, −s selects a block size of
|
|
||||||
200k, which limits memory use to around the same
|
|
||||||
figure, at the expense of your compression ratio.
|
|
||||||
In short, if your machine is low on memory (8
|
|
||||||
megabytes or less), use −s for everything. See
|
|
||||||
MEMORY MANAGEMENT below.
|
|
||||||
|
|
||||||
−−qq ‐‐‐‐qquuiieett
|
|
||||||
Suppress non‐essential warning messages. Messages
|
|
||||||
pertaining to I/O errors and other critical events
|
|
||||||
will not be suppressed.
|
|
||||||
|
|
||||||
−−vv ‐‐‐‐vveerrbboossee
|
|
||||||
Verbose mode ‐‐ show the compression ratio for each
|
|
||||||
file processed. Further −v’s increase the ver
|
|
||||||
bosity level, spewing out lots of information which
|
|
||||||
is primarily of interest for diagnostic purposes.
|
|
||||||
|
|
||||||
−−LL ‐‐‐‐lliicceennssee ‐‐VV ‐‐‐‐vveerrssiioonn
|
|
||||||
Display the software version, license terms and
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
−−11 ((oorr −−−−ffaasstt)) ttoo −−99 ((oorr −−−−bbeesstt))
|
|
||||||
Set the block size to 100 k, 200 k .. 900 k when
|
|
||||||
compressing. Has no effect when decompressing.
|
|
||||||
See MEMORY MANAGEMENT below. The −−fast and −−best
|
|
||||||
aliases are primarily for GNU gzip compatibility.
|
|
||||||
In particular, −−fast doesn’t make things signifi
|
|
||||||
cantly faster. And −−best merely selects the
|
|
||||||
default behaviour.
|
|
||||||
|
|
||||||
−−‐‐ Treats all subsequent arguments as file names, even
|
|
||||||
if they start with a dash. This is so you can han
|
|
||||||
dle files with names beginning with a dash, for
|
|
||||||
example: bzip2 −‐ −myfilename.
|
|
||||||
|
|
||||||
−−‐‐rreeppeettiittiivvee‐‐ffaasstt ‐‐‐‐rreeppeettiittiivvee‐‐bbeesstt
|
|
||||||
These flags are redundant in versions 0.9.5 and
|
|
||||||
above. They provided some coarse control over the
|
|
||||||
behaviour of the sorting algorithm in earlier ver
|
|
||||||
sions, which was sometimes useful. 0.9.5 and above
|
|
||||||
have an improved algorithm which renders these
|
|
||||||
flags irrelevant.
|
|
||||||
|
|
||||||
|
|
||||||
MMEEMMOORRYY MMAANNAAGGEEMMEENNTT
|
|
||||||
_b_z_i_p_2 compresses large files in blocks. The block size
|
|
||||||
affects both the compression ratio achieved, and the
|
|
||||||
amount of memory needed for compression and decompression.
|
|
||||||
The flags −1 through −9 specify the block size to be
|
|
||||||
100,000 bytes through 900,000 bytes (the default) respec
|
|
||||||
tively. At decompression time, the block size used for
|
|
||||||
compression is read from the header of the compressed
|
|
||||||
file, and _b_u_n_z_i_p_2 then allocates itself just enough memory
|
|
||||||
to decompress the file. Since block sizes are stored in
|
|
||||||
compressed files, it follows that the flags −1 to −9 are
|
|
||||||
irrelevant to and so ignored during decompression.
|
|
||||||
|
|
||||||
Compression and decompression requirements, in bytes, can
|
|
||||||
be estimated as:
|
|
||||||
|
|
||||||
Compression: 400k + ( 8 x block size )
|
|
||||||
|
|
||||||
Decompression: 100k + ( 4 x block size ), or
|
|
||||||
100k + ( 2.5 x block size )
|
|
||||||
|
|
||||||
Larger block sizes give rapidly diminishing marginal
|
|
||||||
returns. Most of the compression comes from the first two
|
|
||||||
or three hundred k of block size, a fact worth bearing in
|
|
||||||
mind when using _b_z_i_p_2 on small machines. It is also
|
|
||||||
important to appreciate that the decompression memory
|
|
||||||
requirement is set at compression time by the choice of
|
|
||||||
block size.
|
|
||||||
|
|
||||||
For files compressed with the default 900k block size,
|
|
||||||
_b_u_n_z_i_p_2 will require about 3700 kbytes to decompress. To
|
|
||||||
support decompression of any file on a 4 megabyte machine,
|
|
||||||
_b_u_n_z_i_p_2 has an option to decompress using approximately
|
|
||||||
half this amount of memory, about 2300 kbytes. Decompres
|
|
||||||
sion speed is also halved, so you should use this option
|
|
||||||
only where necessary. The relevant flag is ‐s.
|
|
||||||
|
|
||||||
In general, try and use the largest block size memory con
|
|
||||||
straints allow, since that maximises the compression
|
|
||||||
achieved. Compression and decompression speed are virtu
|
|
||||||
ally unaffected by block size.
|
|
||||||
|
|
||||||
Another significant point applies to files which fit in a
|
|
||||||
single block ‐‐ that means most files you’d encounter
|
|
||||||
using a large block size. The amount of real memory
|
|
||||||
touched is proportional to the size of the file, since the
|
|
||||||
file is smaller than a block. For example, compressing a
|
|
||||||
file 20,000 bytes long with the flag ‐9 will cause the
|
|
||||||
compressor to allocate around 7600k of memory, but only
|
|
||||||
touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
|
|
||||||
decompressor will allocate 3700k but only touch 100k +
|
|
||||||
20000 * 4 = 180 kbytes.
|
|
||||||
|
|
||||||
Here is a table which summarises the maximum memory usage
|
|
||||||
for different block sizes. Also recorded is the total
|
|
||||||
compressed size for 14 files of the Calgary Text Compres
|
|
||||||
sion Corpus totalling 3,141,622 bytes. This column gives
|
|
||||||
some feel for how compression varies with block size.
|
|
||||||
These figures tend to understate the advantage of larger
|
|
||||||
block sizes for larger files, since the Corpus is domi
|
|
||||||
nated by smaller files.
|
|
||||||
|
|
||||||
Compress Decompress Decompress Corpus
|
|
||||||
Flag usage usage ‐s usage Size
|
|
||||||
|
|
||||||
‐1 1200k 500k 350k 914704
|
|
||||||
‐2 2000k 900k 600k 877703
|
|
||||||
‐3 2800k 1300k 850k 860338
|
|
||||||
‐4 3600k 1700k 1100k 846899
|
|
||||||
‐5 4400k 2100k 1350k 845160
|
|
||||||
‐6 5200k 2500k 1600k 838626
|
|
||||||
‐7 6100k 2900k 1850k 834096
|
|
||||||
‐8 6800k 3300k 2100k 828642
|
|
||||||
‐9 7600k 3700k 2350k 828642
|
|
||||||
|
|
||||||
|
|
||||||
RREECCOOVVEERRIINNGG DDAATTAA FFRROOMM DDAAMMAAGGEEDD FFIILLEESS
|
|
||||||
_b_z_i_p_2 compresses files in blocks, usually 900kbytes long.
|
|
||||||
Each block is handled independently. If a media or trans
|
|
||||||
mission error causes a multi‐block .bz2 file to become
|
|
||||||
damaged, it may be possible to recover data from the
|
|
||||||
undamaged blocks in the file.
|
|
||||||
|
|
||||||
The compressed representation of each block is delimited
|
|
||||||
by a 48‐bit pattern, which makes it possible to find the
|
|
||||||
block boundaries with reasonable certainty. Each block
|
|
||||||
also carries its own 32‐bit CRC, so damaged blocks can be
|
|
||||||
distinguished from undamaged ones.
|
|
||||||
|
|
||||||
_b_z_i_p_2_r_e_c_o_v_e_r is a simple program whose purpose is to
|
|
||||||
search for blocks in .bz2 files, and write each block out
|
|
||||||
into its own .bz2 file. You can then use _b_z_i_p_2 −t to test
|
|
||||||
the integrity of the resulting files, and decompress those
|
|
||||||
which are undamaged.
|
|
||||||
|
|
||||||
_b_z_i_p_2_r_e_c_o_v_e_r takes a single argument, the name of the dam
|
|
||||||
aged file, and writes a number of files
|
|
||||||
"rec00001file.bz2", "rec00002file.bz2", etc, containing
|
|
||||||
the extracted blocks. The output filenames are
|
|
||||||
designed so that the use of wildcards in subsequent pro
|
|
||||||
cessing ‐‐ for example, "bzip2 ‐dc rec*file.bz2 > recov
|
|
||||||
ered_data" ‐‐ processes the files in the correct order.
|
|
||||||
|
|
||||||
_b_z_i_p_2_r_e_c_o_v_e_r should be of most use dealing with large .bz2
|
|
||||||
files, as these will contain many blocks. It is clearly
|
|
||||||
futile to use it on damaged single‐block files, since a
|
|
||||||
damaged block cannot be recovered. If you wish to min
|
|
||||||
imise any potential data loss through media or transmis
|
|
||||||
sion errors, you might consider compressing with a smaller
|
|
||||||
block size.
|
|
||||||
|
|
||||||
|
|
||||||
PPEERRFFOORRMMAANNCCEE NNOOTTEESS
|
|
||||||
The sorting phase of compression gathers together similar
|
|
||||||
strings in the file. Because of this, files containing
|
|
||||||
very long runs of repeated symbols, like "aabaabaabaab
|
|
||||||
..." (repeated several hundred times) may compress more
|
|
||||||
slowly than normal. Versions 0.9.5 and above fare much
|
|
||||||
better than previous versions in this respect. The ratio
|
|
||||||
between worst‐case and average‐case compression time is in
|
|
||||||
the region of 10:1. For previous versions, this figure
|
|
||||||
was more like 100:1. You can use the −vvvv option to mon
|
|
||||||
itor progress in great detail, if you want.
|
|
||||||
|
|
||||||
Decompression speed is unaffected by these phenomena.
|
|
||||||
|
|
||||||
_b_z_i_p_2 usually allocates several megabytes of memory to
|
|
||||||
operate in, and then charges all over it in a fairly ran
|
|
||||||
dom fashion. This means that performance, both for com
|
|
||||||
pressing and decompressing, is largely determined by the
|
|
||||||
speed at which your machine can service cache misses.
|
|
||||||
Because of this, small changes to the code to reduce the
|
|
||||||
miss rate have been observed to give disproportionately
|
|
||||||
large performance improvements. I imagine _b_z_i_p_2 will per
|
|
||||||
form best on machines with very large caches.
|
|
||||||
|
|
||||||
|
|
||||||
CCAAVVEEAATTSS
|
|
||||||
I/O error messages are not as helpful as they could be.
|
|
||||||
_b_z_i_p_2 tries hard to detect I/O errors and exit cleanly,
|
|
||||||
but the details of what the problem is sometimes seem
|
|
||||||
rather misleading.
|
|
||||||
|
|
||||||
This manual page pertains to version 1.0.6 of _b_z_i_p_2_. Com
|
|
||||||
pressed data created by this version is entirely forwards
|
|
||||||
and backwards compatible with the previous public
|
|
||||||
releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
|
|
||||||
1.0.2 and above, but with the following exception: 0.9.0
|
|
||||||
and above can correctly decompress multiple concatenated
|
|
||||||
compressed files. 0.1pl2 cannot do this; it will stop
|
|
||||||
after decompressing just the first file in the stream.
|
|
||||||
|
|
||||||
_b_z_i_p_2_r_e_c_o_v_e_r versions prior to 1.0.2 used 32‐bit integers
|
|
||||||
to represent bit positions in compressed files, so they
|
|
||||||
could not handle compressed files more than 512 megabytes
|
|
||||||
long. Versions 1.0.2 and above use 64‐bit ints on some
|
|
||||||
platforms which support them (GNU supported targets, and
|
|
||||||
Windows). To establish whether or not bzip2recover was
|
|
||||||
built with such a limitation, run it without arguments.
|
|
||||||
In any event you can build yourself an unlimited version
|
|
||||||
if you can recompile it with MaybeUInt64 set to be an
|
|
||||||
unsigned 64‐bit integer.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
AAUUTTHHOORR
|
|
||||||
Julian Seward, jsewardbzip.org.
|
|
||||||
|
|
||||||
http://www.bzip.org
|
|
||||||
|
|
||||||
The ideas embodied in _b_z_i_p_2 are due to (at least) the fol
|
|
||||||
lowing people: Michael Burrows and David Wheeler (for the
|
|
||||||
block sorting transformation), David Wheeler (again, for
|
|
||||||
the Huffman coder), Peter Fenwick (for the structured cod
|
|
||||||
ing model in the original _b_z_i_p_, and many refinements), and
|
|
||||||
Alistair Moffat, Radford Neal and Ian Witten (for the
|
|
||||||
arithmetic coder in the original _b_z_i_p_)_. I am much
|
|
||||||
indebted for their help, support and advice. See the man
|
|
||||||
ual in the source distribution for pointers to sources of
|
|
||||||
documentation. Christian von Roques encouraged me to look
|
|
||||||
for faster sorting algorithms, so as to speed up compres
|
|
||||||
sion. Bela Lubkin encouraged me to improve the worst‐case
|
|
||||||
compression performance. Donna Robinson XMLised the docu
|
|
||||||
mentation. The bz* scripts are derived from those of GNU
|
|
||||||
gzip. Many people sent patches, helped with portability
|
|
||||||
problems, lent machines, gave advice and were generally
|
|
||||||
helpful.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bzip2(1)
|
|
File diff suppressed because it is too large
Load Diff
@ -1,391 +0,0 @@
|
|||||||
|
|
||||||
NAME
|
|
||||||
bzip2, bunzip2 - a block-sorting file compressor, v1.0.6
|
|
||||||
bzcat - decompresses files to stdout
|
|
||||||
bzip2recover - recovers data from damaged bzip2 files
|
|
||||||
|
|
||||||
|
|
||||||
SYNOPSIS
|
|
||||||
bzip2 [ -cdfkqstvzVL123456789 ] [ filenames ... ]
|
|
||||||
bunzip2 [ -fkvsVL ] [ filenames ... ]
|
|
||||||
bzcat [ -s ] [ filenames ... ]
|
|
||||||
bzip2recover filename
|
|
||||||
|
|
||||||
|
|
||||||
DESCRIPTION
|
|
||||||
bzip2 compresses files using the Burrows-Wheeler block
|
|
||||||
sorting text compression algorithm, and Huffman coding.
|
|
||||||
Compression is generally considerably better than that
|
|
||||||
achieved by more conventional LZ77/LZ78-based compressors,
|
|
||||||
and approaches the performance of the PPM family of sta-
|
|
||||||
tistical compressors.
|
|
||||||
|
|
||||||
The command-line options are deliberately very similar to
|
|
||||||
those of GNU gzip, but they are not identical.
|
|
||||||
|
|
||||||
bzip2 expects a list of file names to accompany the com-
|
|
||||||
mand-line flags. Each file is replaced by a compressed
|
|
||||||
version of itself, with the name "original_name.bz2".
|
|
||||||
Each compressed file has the same modification date, per-
|
|
||||||
missions, and, when possible, ownership as the correspond-
|
|
||||||
ing original, so that these properties can be correctly
|
|
||||||
restored at decompression time. File name handling is
|
|
||||||
naive in the sense that there is no mechanism for preserv-
|
|
||||||
ing original file names, permissions, ownerships or dates
|
|
||||||
in filesystems which lack these concepts, or have serious
|
|
||||||
file name length restrictions, such as MS-DOS.
|
|
||||||
|
|
||||||
bzip2 and bunzip2 will by default not overwrite existing
|
|
||||||
files. If you want this to happen, specify the -f flag.
|
|
||||||
|
|
||||||
If no file names are specified, bzip2 compresses from
|
|
||||||
standard input to standard output. In this case, bzip2
|
|
||||||
will decline to write compressed output to a terminal, as
|
|
||||||
this would be entirely incomprehensible and therefore
|
|
||||||
pointless.
|
|
||||||
|
|
||||||
bunzip2 (or bzip2 -d) decompresses all specified files.
|
|
||||||
Files which were not created by bzip2 will be detected and
|
|
||||||
ignored, and a warning issued. bzip2 attempts to guess
|
|
||||||
the filename for the decompressed file from that of the
|
|
||||||
compressed file as follows:
|
|
||||||
|
|
||||||
filename.bz2 becomes filename
|
|
||||||
filename.bz becomes filename
|
|
||||||
filename.tbz2 becomes filename.tar
|
|
||||||
filename.tbz becomes filename.tar
|
|
||||||
anyothername becomes anyothername.out
|
|
||||||
|
|
||||||
If the file does not end in one of the recognised endings,
|
|
||||||
.bz2, .bz, .tbz2 or .tbz, bzip2 complains that it cannot
|
|
||||||
guess the name of the original file, and uses the original
|
|
||||||
name with .out appended.
|
|
||||||
|
|
||||||
As with compression, supplying no filenames causes decom-
|
|
||||||
pression from standard input to standard output.
|
|
||||||
|
|
||||||
bunzip2 will correctly decompress a file which is the con-
|
|
||||||
catenation of two or more compressed files. The result is
|
|
||||||
the concatenation of the corresponding uncompressed files.
|
|
||||||
Integrity testing (-t) of concatenated compressed files is
|
|
||||||
also supported.
|
|
||||||
|
|
||||||
You can also compress or decompress files to the standard
|
|
||||||
output by giving the -c flag. Multiple files may be com-
|
|
||||||
pressed and decompressed like this. The resulting outputs
|
|
||||||
are fed sequentially to stdout. Compression of multiple
|
|
||||||
files in this manner generates a stream containing multi-
|
|
||||||
ple compressed file representations. Such a stream can be
|
|
||||||
decompressed correctly only by bzip2 version 0.9.0 or
|
|
||||||
later. Earlier versions of bzip2 will stop after decom-
|
|
||||||
pressing the first file in the stream.
|
|
||||||
|
|
||||||
bzcat (or bzip2 -dc) decompresses all specified files to
|
|
||||||
the standard output.
|
|
||||||
|
|
||||||
bzip2 will read arguments from the environment variables
|
|
||||||
BZIP2 and BZIP, in that order, and will process them
|
|
||||||
before any arguments read from the command line. This
|
|
||||||
gives a convenient way to supply default arguments.
|
|
||||||
|
|
||||||
Compression is always performed, even if the compressed
|
|
||||||
file is slightly larger than the original. Files of less
|
|
||||||
than about one hundred bytes tend to get larger, since the
|
|
||||||
compression mechanism has a constant overhead in the
|
|
||||||
region of 50 bytes. Random data (including the output of
|
|
||||||
most file compressors) is coded at about 8.05 bits per
|
|
||||||
byte, giving an expansion of around 0.5%.
|
|
||||||
|
|
||||||
As a self-check for your protection, bzip2 uses 32-bit
|
|
||||||
CRCs to make sure that the decompressed version of a file
|
|
||||||
is identical to the original. This guards against corrup-
|
|
||||||
tion of the compressed data, and against undetected bugs
|
|
||||||
in bzip2 (hopefully very unlikely). The chances of data
|
|
||||||
corruption going undetected is microscopic, about one
|
|
||||||
chance in four billion for each file processed. Be aware,
|
|
||||||
though, that the check occurs upon decompression, so it
|
|
||||||
can only tell you that something is wrong. It can't help
|
|
||||||
you recover the original uncompressed data. You can use
|
|
||||||
bzip2recover to try to recover data from damaged files.
|
|
||||||
|
|
||||||
Return values: 0 for a normal exit, 1 for environmental
|
|
||||||
problems (file not found, invalid flags, I/O errors, &c),
|
|
||||||
2 to indicate a corrupt compressed file, 3 for an internal
|
|
||||||
consistency error (eg, bug) which caused bzip2 to panic.
|
|
||||||
|
|
||||||
|
|
||||||
OPTIONS
|
|
||||||
-c --stdout
|
|
||||||
Compress or decompress to standard output.
|
|
||||||
|
|
||||||
-d --decompress
|
|
||||||
Force decompression. bzip2, bunzip2 and bzcat are
|
|
||||||
really the same program, and the decision about
|
|
||||||
what actions to take is done on the basis of which
|
|
||||||
name is used. This flag overrides that mechanism,
|
|
||||||
and forces bzip2 to decompress.
|
|
||||||
|
|
||||||
-z --compress
|
|
||||||
The complement to -d: forces compression,
|
|
||||||
regardless of the invocation name.
|
|
||||||
|
|
||||||
-t --test
|
|
||||||
Check integrity of the specified file(s), but don't
|
|
||||||
decompress them. This really performs a trial
|
|
||||||
decompression and throws away the result.
|
|
||||||
|
|
||||||
-f --force
|
|
||||||
Force overwrite of output files. Normally, bzip2
|
|
||||||
will not overwrite existing output files. Also
|
|
||||||
forces bzip2 to break hard links to files, which it
|
|
||||||
otherwise wouldn't do.
|
|
||||||
|
|
||||||
bzip2 normally declines to decompress files which
|
|
||||||
don't have the correct magic header bytes. If
|
|
||||||
forced (-f), however, it will pass such files
|
|
||||||
through unmodified. This is how GNU gzip behaves.
|
|
||||||
|
|
||||||
-k --keep
|
|
||||||
Keep (don't delete) input files during compression
|
|
||||||
or decompression.
|
|
||||||
|
|
||||||
-s --small
|
|
||||||
Reduce memory usage, for compression, decompression
|
|
||||||
and testing. Files are decompressed and tested
|
|
||||||
using a modified algorithm which only requires 2.5
|
|
||||||
bytes per block byte. This means any file can be
|
|
||||||
decompressed in 2300k of memory, albeit at about
|
|
||||||
half the normal speed.
|
|
||||||
|
|
||||||
During compression, -s selects a block size of
|
|
||||||
200k, which limits memory use to around the same
|
|
||||||
figure, at the expense of your compression ratio.
|
|
||||||
In short, if your machine is low on memory (8
|
|
||||||
megabytes or less), use -s for everything. See
|
|
||||||
MEMORY MANAGEMENT below.
|
|
||||||
|
|
||||||
-q --quiet
|
|
||||||
Suppress non-essential warning messages. Messages
|
|
||||||
pertaining to I/O errors and other critical events
|
|
||||||
will not be suppressed.
|
|
||||||
|
|
||||||
-v --verbose
|
|
||||||
Verbose mode -- show the compression ratio for each
|
|
||||||
file processed. Further -v's increase the ver-
|
|
||||||
bosity level, spewing out lots of information which
|
|
||||||
is primarily of interest for diagnostic purposes.
|
|
||||||
|
|
||||||
-L --license -V --version
|
|
||||||
Display the software version, license terms and
|
|
||||||
conditions.
|
|
||||||
|
|
||||||
-1 (or --fast) to -9 (or --best)
|
|
||||||
Set the block size to 100 k, 200 k .. 900 k when
|
|
||||||
compressing. Has no effect when decompressing.
|
|
||||||
See MEMORY MANAGEMENT below. The --fast and --best
|
|
||||||
aliases are primarily for GNU gzip compatibility.
|
|
||||||
In particular, --fast doesn't make things signifi-
|
|
||||||
cantly faster. And --best merely selects the
|
|
||||||
default behaviour.
|
|
||||||
|
|
||||||
-- Treats all subsequent arguments as file names, even
|
|
||||||
if they start with a dash. This is so you can han-
|
|
||||||
dle files with names beginning with a dash, for
|
|
||||||
example: bzip2 -- -myfilename.
|
|
||||||
|
|
||||||
--repetitive-fast --repetitive-best
|
|
||||||
These flags are redundant in versions 0.9.5 and
|
|
||||||
above. They provided some coarse control over the
|
|
||||||
behaviour of the sorting algorithm in earlier ver-
|
|
||||||
sions, which was sometimes useful. 0.9.5 and above
|
|
||||||
have an improved algorithm which renders these
|
|
||||||
flags irrelevant.
|
|
||||||
|
|
||||||
|
|
||||||
MEMORY MANAGEMENT
|
|
||||||
bzip2 compresses large files in blocks. The block size
|
|
||||||
affects both the compression ratio achieved, and the
|
|
||||||
amount of memory needed for compression and decompression.
|
|
||||||
The flags -1 through -9 specify the block size to be
|
|
||||||
100,000 bytes through 900,000 bytes (the default) respec-
|
|
||||||
tively. At decompression time, the block size used for
|
|
||||||
compression is read from the header of the compressed
|
|
||||||
file, and bunzip2 then allocates itself just enough memory
|
|
||||||
to decompress the file. Since block sizes are stored in
|
|
||||||
compressed files, it follows that the flags -1 to -9 are
|
|
||||||
irrelevant to and so ignored during decompression.
|
|
||||||
|
|
||||||
Compression and decompression requirements, in bytes, can
|
|
||||||
be estimated as:
|
|
||||||
|
|
||||||
Compression: 400k + ( 8 x block size )
|
|
||||||
|
|
||||||
Decompression: 100k + ( 4 x block size ), or
|
|
||||||
100k + ( 2.5 x block size )
|
|
||||||
|
|
||||||
Larger block sizes give rapidly diminishing marginal
|
|
||||||
returns. Most of the compression comes from the first two
|
|
||||||
or three hundred k of block size, a fact worth bearing in
|
|
||||||
mind when using bzip2 on small machines. It is also
|
|
||||||
important to appreciate that the decompression memory
|
|
||||||
requirement is set at compression time by the choice of
|
|
||||||
block size.
|
|
||||||
|
|
||||||
For files compressed with the default 900k block size,
|
|
||||||
bunzip2 will require about 3700 kbytes to decompress. To
|
|
||||||
support decompression of any file on a 4 megabyte machine,
|
|
||||||
bunzip2 has an option to decompress using approximately
|
|
||||||
half this amount of memory, about 2300 kbytes. Decompres-
|
|
||||||
sion speed is also halved, so you should use this option
|
|
||||||
only where necessary. The relevant flag is -s.
|
|
||||||
|
|
||||||
In general, try and use the largest block size memory con-
|
|
||||||
straints allow, since that maximises the compression
|
|
||||||
achieved. Compression and decompression speed are virtu-
|
|
||||||
ally unaffected by block size.
|
|
||||||
|
|
||||||
Another significant point applies to files which fit in a
|
|
||||||
single block -- that means most files you'd encounter
|
|
||||||
using a large block size. The amount of real memory
|
|
||||||
touched is proportional to the size of the file, since the
|
|
||||||
file is smaller than a block. For example, compressing a
|
|
||||||
file 20,000 bytes long with the flag -9 will cause the
|
|
||||||
compressor to allocate around 7600k of memory, but only
|
|
||||||
touch 400k + 20000 * 8 = 560 kbytes of it. Similarly, the
|
|
||||||
decompressor will allocate 3700k but only touch 100k +
|
|
||||||
20000 * 4 = 180 kbytes.
|
|
||||||
|
|
||||||
Here is a table which summarises the maximum memory usage
|
|
||||||
for different block sizes. Also recorded is the total
|
|
||||||
compressed size for 14 files of the Calgary Text Compres-
|
|
||||||
sion Corpus totalling 3,141,622 bytes. This column gives
|
|
||||||
some feel for how compression varies with block size.
|
|
||||||
These figures tend to understate the advantage of larger
|
|
||||||
block sizes for larger files, since the Corpus is domi-
|
|
||||||
nated by smaller files.
|
|
||||||
|
|
||||||
Compress Decompress Decompress Corpus
|
|
||||||
Flag usage usage -s usage Size
|
|
||||||
|
|
||||||
-1 1200k 500k 350k 914704
|
|
||||||
-2 2000k 900k 600k 877703
|
|
||||||
-3 2800k 1300k 850k 860338
|
|
||||||
-4 3600k 1700k 1100k 846899
|
|
||||||
-5 4400k 2100k 1350k 845160
|
|
||||||
-6 5200k 2500k 1600k 838626
|
|
||||||
-7 6100k 2900k 1850k 834096
|
|
||||||
-8 6800k 3300k 2100k 828642
|
|
||||||
-9 7600k 3700k 2350k 828642
|
|
||||||
|
|
||||||
|
|
||||||
RECOVERING DATA FROM DAMAGED FILES
|
|
||||||
bzip2 compresses files in blocks, usually 900kbytes long.
|
|
||||||
Each block is handled independently. If a media or trans-
|
|
||||||
mission error causes a multi-block .bz2 file to become
|
|
||||||
damaged, it may be possible to recover data from the
|
|
||||||
undamaged blocks in the file.
|
|
||||||
|
|
||||||
The compressed representation of each block is delimited
|
|
||||||
by a 48-bit pattern, which makes it possible to find the
|
|
||||||
block boundaries with reasonable certainty. Each block
|
|
||||||
also carries its own 32-bit CRC, so damaged blocks can be
|
|
||||||
distinguished from undamaged ones.
|
|
||||||
|
|
||||||
bzip2recover is a simple program whose purpose is to
|
|
||||||
search for blocks in .bz2 files, and write each block out
|
|
||||||
into its own .bz2 file. You can then use bzip2 -t to test
|
|
||||||
the integrity of the resulting files, and decompress those
|
|
||||||
which are undamaged.
|
|
||||||
|
|
||||||
bzip2recover takes a single argument, the name of the dam-
|
|
||||||
aged file, and writes a number of files
|
|
||||||
"rec00001file.bz2", "rec00002file.bz2", etc, containing
|
|
||||||
the extracted blocks. The output filenames are
|
|
||||||
designed so that the use of wildcards in subsequent pro-
|
|
||||||
cessing -- for example, "bzip2 -dc rec*file.bz2 > recov-
|
|
||||||
ered_data" -- processes the files in the correct order.
|
|
||||||
|
|
||||||
bzip2recover should be of most use dealing with large .bz2
|
|
||||||
files, as these will contain many blocks. It is clearly
|
|
||||||
futile to use it on damaged single-block files, since a
|
|
||||||
damaged block cannot be recovered. If you wish to min-
|
|
||||||
imise any potential data loss through media or transmis-
|
|
||||||
sion errors, you might consider compressing with a smaller
|
|
||||||
block size.
|
|
||||||
|
|
||||||
|
|
||||||
PERFORMANCE NOTES
|
|
||||||
The sorting phase of compression gathers together similar
|
|
||||||
strings in the file. Because of this, files containing
|
|
||||||
very long runs of repeated symbols, like "aabaabaabaab
|
|
||||||
..." (repeated several hundred times) may compress more
|
|
||||||
slowly than normal. Versions 0.9.5 and above fare much
|
|
||||||
better than previous versions in this respect. The ratio
|
|
||||||
between worst-case and average-case compression time is in
|
|
||||||
the region of 10:1. For previous versions, this figure
|
|
||||||
was more like 100:1. You can use the -vvvv option to mon-
|
|
||||||
itor progress in great detail, if you want.
|
|
||||||
|
|
||||||
Decompression speed is unaffected by these phenomena.
|
|
||||||
|
|
||||||
bzip2 usually allocates several megabytes of memory to
|
|
||||||
operate in, and then charges all over it in a fairly ran-
|
|
||||||
dom fashion. This means that performance, both for com-
|
|
||||||
pressing and decompressing, is largely determined by the
|
|
||||||
speed at which your machine can service cache misses.
|
|
||||||
Because of this, small changes to the code to reduce the
|
|
||||||
miss rate have been observed to give disproportionately
|
|
||||||
large performance improvements. I imagine bzip2 will per-
|
|
||||||
form best on machines with very large caches.
|
|
||||||
|
|
||||||
|
|
||||||
CAVEATS
|
|
||||||
I/O error messages are not as helpful as they could be.
|
|
||||||
bzip2 tries hard to detect I/O errors and exit cleanly,
|
|
||||||
but the details of what the problem is sometimes seem
|
|
||||||
rather misleading.
|
|
||||||
|
|
||||||
This manual page pertains to version 1.0.6 of bzip2. Com-
|
|
||||||
pressed data created by this version is entirely forwards
|
|
||||||
and backwards compatible with the previous public
|
|
||||||
releases, versions 0.1pl2, 0.9.0, 0.9.5, 1.0.0, 1.0.1,
|
|
||||||
1.0.2 and above, but with the following exception: 0.9.0
|
|
||||||
and above can correctly decompress multiple concatenated
|
|
||||||
compressed files. 0.1pl2 cannot do this; it will stop
|
|
||||||
after decompressing just the first file in the stream.
|
|
||||||
|
|
||||||
bzip2recover versions prior to 1.0.2 used 32-bit integers
|
|
||||||
to represent bit positions in compressed files, so they
|
|
||||||
could not handle compressed files more than 512 megabytes
|
|
||||||
long. Versions 1.0.2 and above use 64-bit ints on some
|
|
||||||
platforms which support them (GNU supported targets, and
|
|
||||||
Windows). To establish whether or not bzip2recover was
|
|
||||||
built with such a limitation, run it without arguments.
|
|
||||||
In any event you can build yourself an unlimited version
|
|
||||||
if you can recompile it with MaybeUInt64 set to be an
|
|
||||||
unsigned 64-bit integer.
|
|
||||||
|
|
||||||
|
|
||||||
AUTHOR
|
|
||||||
Julian Seward, jsewardbzip.org.
|
|
||||||
|
|
||||||
http://www.bzip.org
|
|
||||||
|
|
||||||
The ideas embodied in bzip2 are due to (at least) the fol-
|
|
||||||
lowing people: Michael Burrows and David Wheeler (for the
|
|
||||||
block sorting transformation), David Wheeler (again, for
|
|
||||||
the Huffman coder), Peter Fenwick (for the structured cod-
|
|
||||||
ing model in the original bzip, and many refinements), and
|
|
||||||
Alistair Moffat, Radford Neal and Ian Witten (for the
|
|
||||||
arithmetic coder in the original bzip). I am much
|
|
||||||
indebted for their help, support and advice. See the man-
|
|
||||||
ual in the source distribution for pointers to sources of
|
|
||||||
documentation. Christian von Roques encouraged me to look
|
|
||||||
for faster sorting algorithms, so as to speed up compres-
|
|
||||||
sion. Bela Lubkin encouraged me to improve the worst-case
|
|
||||||
compression performance. Donna Robinson XMLised the docu-
|
|
||||||
mentation. The bz* scripts are derived from those of GNU
|
|
||||||
gzip. Many people sent patches, helped with portability
|
|
||||||
problems, lent machines, gave advice and were generally
|
|
||||||
helpful.
|
|
||||||
|
|
@ -1,514 +0,0 @@
|
|||||||
/*-----------------------------------------------------------*/
|
|
||||||
/*--- Block recoverer program for bzip2 ---*/
|
|
||||||
/*--- bzip2recover.c ---*/
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
/* This program is a complete hack and should be rewritten properly.
|
|
||||||
It isn't very complicated. */
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* This program records bit locations in the file to be recovered.
|
|
||||||
That means that if 64-bit ints are not supported, we will not
|
|
||||||
be able to recover .bz2 files over 512MB (2^32 bits) long.
|
|
||||||
On GNU supported platforms, we take advantage of the 64-bit
|
|
||||||
int support to circumvent this problem. Ditto MSVC.
|
|
||||||
|
|
||||||
This change occurred in version 1.0.2; all prior versions have
|
|
||||||
the 512MB limitation.
|
|
||||||
*/
|
|
||||||
#ifdef __GNUC__
|
|
||||||
typedef unsigned long long int MaybeUInt64;
|
|
||||||
# define MaybeUInt64_FMT "%Lu"
|
|
||||||
#else
|
|
||||||
#ifdef _MSC_VER
|
|
||||||
typedef unsigned __int64 MaybeUInt64;
|
|
||||||
# define MaybeUInt64_FMT "%I64u"
|
|
||||||
#else
|
|
||||||
typedef unsigned int MaybeUInt64;
|
|
||||||
# define MaybeUInt64_FMT "%u"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef unsigned int UInt32;
|
|
||||||
typedef int Int32;
|
|
||||||
typedef unsigned char UChar;
|
|
||||||
typedef char Char;
|
|
||||||
typedef unsigned char Bool;
|
|
||||||
#define True ((Bool)1)
|
|
||||||
#define False ((Bool)0)
|
|
||||||
|
|
||||||
|
|
||||||
#define BZ_MAX_FILENAME 2000
|
|
||||||
|
|
||||||
Char inFileName[BZ_MAX_FILENAME];
|
|
||||||
Char outFileName[BZ_MAX_FILENAME];
|
|
||||||
Char progName[BZ_MAX_FILENAME];
|
|
||||||
|
|
||||||
MaybeUInt64 bytesOut = 0;
|
|
||||||
MaybeUInt64 bytesIn = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- Header bytes ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
#define BZ_HDR_B 0x42 /* 'B' */
|
|
||||||
#define BZ_HDR_Z 0x5a /* 'Z' */
|
|
||||||
#define BZ_HDR_h 0x68 /* 'h' */
|
|
||||||
#define BZ_HDR_0 0x30 /* '0' */
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- I/O errors ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void readError ( void )
|
|
||||||
{
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: I/O error reading `%s', possible reason follows.\n",
|
|
||||||
progName, inFileName );
|
|
||||||
perror ( progName );
|
|
||||||
fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
|
|
||||||
progName );
|
|
||||||
exit ( 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void writeError ( void )
|
|
||||||
{
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: I/O error reading `%s', possible reason follows.\n",
|
|
||||||
progName, inFileName );
|
|
||||||
perror ( progName );
|
|
||||||
fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
|
|
||||||
progName );
|
|
||||||
exit ( 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void mallocFail ( Int32 n )
|
|
||||||
{
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: malloc failed on request for %d bytes.\n",
|
|
||||||
progName, n );
|
|
||||||
fprintf ( stderr, "%s: warning: output file(s) may be incomplete.\n",
|
|
||||||
progName );
|
|
||||||
exit ( 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void tooManyBlocks ( Int32 max_handled_blocks )
|
|
||||||
{
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: `%s' appears to contain more than %d blocks\n",
|
|
||||||
progName, inFileName, max_handled_blocks );
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: and cannot be handled. To fix, increase\n",
|
|
||||||
progName );
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: BZ_MAX_HANDLED_BLOCKS in bzip2recover.c, and recompile.\n",
|
|
||||||
progName );
|
|
||||||
exit ( 1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- Bit stream I/O ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
typedef
|
|
||||||
struct {
|
|
||||||
FILE* handle;
|
|
||||||
Int32 buffer;
|
|
||||||
Int32 buffLive;
|
|
||||||
Char mode;
|
|
||||||
}
|
|
||||||
BitStream;
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static BitStream* bsOpenReadStream ( FILE* stream )
|
|
||||||
{
|
|
||||||
BitStream *bs = malloc ( sizeof(BitStream) );
|
|
||||||
if (bs == NULL) mallocFail ( sizeof(BitStream) );
|
|
||||||
bs->handle = stream;
|
|
||||||
bs->buffer = 0;
|
|
||||||
bs->buffLive = 0;
|
|
||||||
bs->mode = 'r';
|
|
||||||
return bs;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static BitStream* bsOpenWriteStream ( FILE* stream )
|
|
||||||
{
|
|
||||||
BitStream *bs = malloc ( sizeof(BitStream) );
|
|
||||||
if (bs == NULL) mallocFail ( sizeof(BitStream) );
|
|
||||||
bs->handle = stream;
|
|
||||||
bs->buffer = 0;
|
|
||||||
bs->buffLive = 0;
|
|
||||||
bs->mode = 'w';
|
|
||||||
return bs;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void bsPutBit ( BitStream* bs, Int32 bit )
|
|
||||||
{
|
|
||||||
if (bs->buffLive == 8) {
|
|
||||||
Int32 retVal = putc ( (UChar) bs->buffer, bs->handle );
|
|
||||||
if (retVal == EOF) writeError();
|
|
||||||
bytesOut++;
|
|
||||||
bs->buffLive = 1;
|
|
||||||
bs->buffer = bit & 0x1;
|
|
||||||
} else {
|
|
||||||
bs->buffer = ( (bs->buffer << 1) | (bit & 0x1) );
|
|
||||||
bs->buffLive++;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
/*--
|
|
||||||
Returns 0 or 1, or 2 to indicate EOF.
|
|
||||||
--*/
|
|
||||||
static Int32 bsGetBit ( BitStream* bs )
|
|
||||||
{
|
|
||||||
if (bs->buffLive > 0) {
|
|
||||||
bs->buffLive --;
|
|
||||||
return ( ((bs->buffer) >> (bs->buffLive)) & 0x1 );
|
|
||||||
} else {
|
|
||||||
Int32 retVal = getc ( bs->handle );
|
|
||||||
if ( retVal == EOF ) {
|
|
||||||
if (errno != 0) readError();
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
bs->buffLive = 7;
|
|
||||||
bs->buffer = retVal;
|
|
||||||
return ( ((bs->buffer) >> 7) & 0x1 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void bsClose ( BitStream* bs )
|
|
||||||
{
|
|
||||||
Int32 retVal;
|
|
||||||
|
|
||||||
if ( bs->mode == 'w' ) {
|
|
||||||
while ( bs->buffLive < 8 ) {
|
|
||||||
bs->buffLive++;
|
|
||||||
bs->buffer <<= 1;
|
|
||||||
};
|
|
||||||
retVal = putc ( (UChar) (bs->buffer), bs->handle );
|
|
||||||
if (retVal == EOF) writeError();
|
|
||||||
bytesOut++;
|
|
||||||
retVal = fflush ( bs->handle );
|
|
||||||
if (retVal == EOF) writeError();
|
|
||||||
}
|
|
||||||
retVal = fclose ( bs->handle );
|
|
||||||
if (retVal == EOF) {
|
|
||||||
if (bs->mode == 'w') writeError(); else readError();
|
|
||||||
}
|
|
||||||
free ( bs );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void bsPutUChar ( BitStream* bs, UChar c )
|
|
||||||
{
|
|
||||||
Int32 i;
|
|
||||||
for (i = 7; i >= 0; i--)
|
|
||||||
bsPutBit ( bs, (((UInt32) c) >> i) & 0x1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static void bsPutUInt32 ( BitStream* bs, UInt32 c )
|
|
||||||
{
|
|
||||||
Int32 i;
|
|
||||||
|
|
||||||
for (i = 31; i >= 0; i--)
|
|
||||||
bsPutBit ( bs, (c >> i) & 0x1 );
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
static Bool endsInBz2 ( Char* name )
|
|
||||||
{
|
|
||||||
Int32 n = strlen ( name );
|
|
||||||
if (n <= 4) return False;
|
|
||||||
return
|
|
||||||
(name[n-4] == '.' &&
|
|
||||||
name[n-3] == 'b' &&
|
|
||||||
name[n-2] == 'z' &&
|
|
||||||
name[n-1] == '2');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
/*--- ---*/
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
|
|
||||||
/* This logic isn't really right when it comes to Cygwin. */
|
|
||||||
#ifdef _WIN32
|
|
||||||
# define BZ_SPLIT_SYM '\\' /* path splitter on Windows platform */
|
|
||||||
#else
|
|
||||||
# define BZ_SPLIT_SYM '/' /* path splitter on Unix platform */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define BLOCK_HEADER_HI 0x00003141UL
|
|
||||||
#define BLOCK_HEADER_LO 0x59265359UL
|
|
||||||
|
|
||||||
#define BLOCK_ENDMARK_HI 0x00001772UL
|
|
||||||
#define BLOCK_ENDMARK_LO 0x45385090UL
|
|
||||||
|
|
||||||
/* Increase if necessary. However, a .bz2 file with > 50000 blocks
|
|
||||||
would have an uncompressed size of at least 40GB, so the chances
|
|
||||||
are low you'll need to up this.
|
|
||||||
*/
|
|
||||||
#define BZ_MAX_HANDLED_BLOCKS 50000
|
|
||||||
|
|
||||||
MaybeUInt64 bStart [BZ_MAX_HANDLED_BLOCKS];
|
|
||||||
MaybeUInt64 bEnd [BZ_MAX_HANDLED_BLOCKS];
|
|
||||||
MaybeUInt64 rbStart[BZ_MAX_HANDLED_BLOCKS];
|
|
||||||
MaybeUInt64 rbEnd [BZ_MAX_HANDLED_BLOCKS];
|
|
||||||
|
|
||||||
Int32 main ( Int32 argc, Char** argv )
|
|
||||||
{
|
|
||||||
FILE* inFile;
|
|
||||||
FILE* outFile;
|
|
||||||
BitStream* bsIn, *bsWr;
|
|
||||||
Int32 b, wrBlock, currBlock, rbCtr;
|
|
||||||
MaybeUInt64 bitsRead;
|
|
||||||
|
|
||||||
UInt32 buffHi, buffLo, blockCRC;
|
|
||||||
Char* p;
|
|
||||||
|
|
||||||
strcpy ( progName, argv[0] );
|
|
||||||
inFileName[0] = outFileName[0] = 0;
|
|
||||||
|
|
||||||
fprintf ( stderr,
|
|
||||||
"bzip2recover 1.0.6: extracts blocks from damaged .bz2 files.\n" );
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
fprintf ( stderr, "%s: usage is `%s damaged_file_name'.\n",
|
|
||||||
progName, progName );
|
|
||||||
switch (sizeof(MaybeUInt64)) {
|
|
||||||
case 8:
|
|
||||||
fprintf(stderr,
|
|
||||||
"\trestrictions on size of recovered file: None\n");
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
fprintf(stderr,
|
|
||||||
"\trestrictions on size of recovered file: 512 MB\n");
|
|
||||||
fprintf(stderr,
|
|
||||||
"\tto circumvent, recompile with MaybeUInt64 as an\n"
|
|
||||||
"\tunsigned 64-bit int.\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr,
|
|
||||||
"\tsizeof(MaybeUInt64) is not 4 or 8 -- "
|
|
||||||
"configuration error.\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strlen(argv[1]) >= BZ_MAX_FILENAME-20) {
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: supplied filename is suspiciously (>= %d chars) long. Bye!\n",
|
|
||||||
progName, (int)strlen(argv[1]) );
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy ( inFileName, argv[1] );
|
|
||||||
|
|
||||||
inFile = fopen ( inFileName, "rb" );
|
|
||||||
if (inFile == NULL) {
|
|
||||||
fprintf ( stderr, "%s: can't read `%s'\n", progName, inFileName );
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
bsIn = bsOpenReadStream ( inFile );
|
|
||||||
fprintf ( stderr, "%s: searching for block boundaries ...\n", progName );
|
|
||||||
|
|
||||||
bitsRead = 0;
|
|
||||||
buffHi = buffLo = 0;
|
|
||||||
currBlock = 0;
|
|
||||||
bStart[currBlock] = 0;
|
|
||||||
|
|
||||||
rbCtr = 0;
|
|
||||||
|
|
||||||
while (True) {
|
|
||||||
b = bsGetBit ( bsIn );
|
|
||||||
bitsRead++;
|
|
||||||
if (b == 2) {
|
|
||||||
if (bitsRead >= bStart[currBlock] &&
|
|
||||||
(bitsRead - bStart[currBlock]) >= 40) {
|
|
||||||
bEnd[currBlock] = bitsRead-1;
|
|
||||||
if (currBlock > 0)
|
|
||||||
fprintf ( stderr, " block %d runs from " MaybeUInt64_FMT
|
|
||||||
" to " MaybeUInt64_FMT " (incomplete)\n",
|
|
||||||
currBlock, bStart[currBlock], bEnd[currBlock] );
|
|
||||||
} else
|
|
||||||
currBlock--;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
buffHi = (buffHi << 1) | (buffLo >> 31);
|
|
||||||
buffLo = (buffLo << 1) | (b & 1);
|
|
||||||
if ( ( (buffHi & 0x0000ffff) == BLOCK_HEADER_HI
|
|
||||||
&& buffLo == BLOCK_HEADER_LO)
|
|
||||||
||
|
|
||||||
( (buffHi & 0x0000ffff) == BLOCK_ENDMARK_HI
|
|
||||||
&& buffLo == BLOCK_ENDMARK_LO)
|
|
||||||
) {
|
|
||||||
if (bitsRead > 49) {
|
|
||||||
bEnd[currBlock] = bitsRead-49;
|
|
||||||
} else {
|
|
||||||
bEnd[currBlock] = 0;
|
|
||||||
}
|
|
||||||
if (currBlock > 0 &&
|
|
||||||
(bEnd[currBlock] - bStart[currBlock]) >= 130) {
|
|
||||||
fprintf ( stderr, " block %d runs from " MaybeUInt64_FMT
|
|
||||||
" to " MaybeUInt64_FMT "\n",
|
|
||||||
rbCtr+1, bStart[currBlock], bEnd[currBlock] );
|
|
||||||
rbStart[rbCtr] = bStart[currBlock];
|
|
||||||
rbEnd[rbCtr] = bEnd[currBlock];
|
|
||||||
rbCtr++;
|
|
||||||
}
|
|
||||||
if (currBlock >= BZ_MAX_HANDLED_BLOCKS)
|
|
||||||
tooManyBlocks(BZ_MAX_HANDLED_BLOCKS);
|
|
||||||
currBlock++;
|
|
||||||
|
|
||||||
bStart[currBlock] = bitsRead;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bsClose ( bsIn );
|
|
||||||
|
|
||||||
/*-- identified blocks run from 1 to rbCtr inclusive. --*/
|
|
||||||
|
|
||||||
if (rbCtr < 1) {
|
|
||||||
fprintf ( stderr,
|
|
||||||
"%s: sorry, I couldn't find any block boundaries.\n",
|
|
||||||
progName );
|
|
||||||
exit(1);
|
|
||||||
};
|
|
||||||
|
|
||||||
fprintf ( stderr, "%s: splitting into blocks\n", progName );
|
|
||||||
|
|
||||||
inFile = fopen ( inFileName, "rb" );
|
|
||||||
if (inFile == NULL) {
|
|
||||||
fprintf ( stderr, "%s: can't open `%s'\n", progName, inFileName );
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
bsIn = bsOpenReadStream ( inFile );
|
|
||||||
|
|
||||||
/*-- placate gcc's dataflow analyser --*/
|
|
||||||
blockCRC = 0; bsWr = 0;
|
|
||||||
|
|
||||||
bitsRead = 0;
|
|
||||||
outFile = NULL;
|
|
||||||
wrBlock = 0;
|
|
||||||
while (True) {
|
|
||||||
b = bsGetBit(bsIn);
|
|
||||||
if (b == 2) break;
|
|
||||||
buffHi = (buffHi << 1) | (buffLo >> 31);
|
|
||||||
buffLo = (buffLo << 1) | (b & 1);
|
|
||||||
if (bitsRead == 47+rbStart[wrBlock])
|
|
||||||
blockCRC = (buffHi << 16) | (buffLo >> 16);
|
|
||||||
|
|
||||||
if (outFile != NULL && bitsRead >= rbStart[wrBlock]
|
|
||||||
&& bitsRead <= rbEnd[wrBlock]) {
|
|
||||||
bsPutBit ( bsWr, b );
|
|
||||||
}
|
|
||||||
|
|
||||||
bitsRead++;
|
|
||||||
|
|
||||||
if (bitsRead == rbEnd[wrBlock]+1) {
|
|
||||||
if (outFile != NULL) {
|
|
||||||
bsPutUChar ( bsWr, 0x17 ); bsPutUChar ( bsWr, 0x72 );
|
|
||||||
bsPutUChar ( bsWr, 0x45 ); bsPutUChar ( bsWr, 0x38 );
|
|
||||||
bsPutUChar ( bsWr, 0x50 ); bsPutUChar ( bsWr, 0x90 );
|
|
||||||
bsPutUInt32 ( bsWr, blockCRC );
|
|
||||||
bsClose ( bsWr );
|
|
||||||
}
|
|
||||||
if (wrBlock >= rbCtr) break;
|
|
||||||
wrBlock++;
|
|
||||||
} else
|
|
||||||
if (bitsRead == rbStart[wrBlock]) {
|
|
||||||
/* Create the output file name, correctly handling leading paths.
|
|
||||||
(31.10.2001 by Sergey E. Kusikov) */
|
|
||||||
Char* split;
|
|
||||||
Int32 ofs, k;
|
|
||||||
for (k = 0; k < BZ_MAX_FILENAME; k++)
|
|
||||||
outFileName[k] = 0;
|
|
||||||
strcpy (outFileName, inFileName);
|
|
||||||
split = strrchr (outFileName, BZ_SPLIT_SYM);
|
|
||||||
if (split == NULL) {
|
|
||||||
split = outFileName;
|
|
||||||
} else {
|
|
||||||
++split;
|
|
||||||
}
|
|
||||||
/* Now split points to the start of the basename. */
|
|
||||||
ofs = split - outFileName;
|
|
||||||
sprintf (split, "rec%5d", wrBlock+1);
|
|
||||||
for (p = split; *p != 0; p++) if (*p == ' ') *p = '0';
|
|
||||||
strcat (outFileName, inFileName + ofs);
|
|
||||||
|
|
||||||
if ( !endsInBz2(outFileName)) strcat ( outFileName, ".bz2" );
|
|
||||||
|
|
||||||
fprintf ( stderr, " writing block %d to `%s' ...\n",
|
|
||||||
wrBlock+1, outFileName );
|
|
||||||
|
|
||||||
outFile = fopen ( outFileName, "wb" );
|
|
||||||
if (outFile == NULL) {
|
|
||||||
fprintf ( stderr, "%s: can't write `%s'\n",
|
|
||||||
progName, outFileName );
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
bsWr = bsOpenWriteStream ( outFile );
|
|
||||||
bsPutUChar ( bsWr, BZ_HDR_B );
|
|
||||||
bsPutUChar ( bsWr, BZ_HDR_Z );
|
|
||||||
bsPutUChar ( bsWr, BZ_HDR_h );
|
|
||||||
bsPutUChar ( bsWr, BZ_HDR_0 + 9 );
|
|
||||||
bsPutUChar ( bsWr, 0x31 ); bsPutUChar ( bsWr, 0x41 );
|
|
||||||
bsPutUChar ( bsWr, 0x59 ); bsPutUChar ( bsWr, 0x26 );
|
|
||||||
bsPutUChar ( bsWr, 0x53 ); bsPutUChar ( bsWr, 0x59 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf ( stderr, "%s: finished\n", progName );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
|
||||||
/*--- end bzip2recover.c ---*/
|
|
||||||
/*-----------------------------------------------------------*/
|
|
File diff suppressed because it is too large
Load Diff
@ -1,285 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Public header file for the library. ---*/
|
|
||||||
/*--- bzlib.h ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _BZLIB_H
|
|
||||||
#define _BZLIB_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// we don't need the FILE* interface
|
|
||||||
#define BZ_NO_STDIO
|
|
||||||
|
|
||||||
#define BZ_RUN 0
|
|
||||||
#define BZ_FLUSH 1
|
|
||||||
#define BZ_FINISH 2
|
|
||||||
|
|
||||||
#define BZ_OK 0
|
|
||||||
#define BZ_RUN_OK 1
|
|
||||||
#define BZ_FLUSH_OK 2
|
|
||||||
#define BZ_FINISH_OK 3
|
|
||||||
#define BZ_STREAM_END 4
|
|
||||||
#define BZ_SEQUENCE_ERROR (-1)
|
|
||||||
#define BZ_PARAM_ERROR (-2)
|
|
||||||
#define BZ_MEM_ERROR (-3)
|
|
||||||
#define BZ_DATA_ERROR (-4)
|
|
||||||
#define BZ_DATA_ERROR_MAGIC (-5)
|
|
||||||
#define BZ_IO_ERROR (-6)
|
|
||||||
#define BZ_UNEXPECTED_EOF (-7)
|
|
||||||
#define BZ_OUTBUFF_FULL (-8)
|
|
||||||
#define BZ_CONFIG_ERROR (-9)
|
|
||||||
|
|
||||||
typedef
|
|
||||||
struct {
|
|
||||||
char *next_in;
|
|
||||||
unsigned int avail_in;
|
|
||||||
unsigned int total_in_lo32;
|
|
||||||
unsigned int total_in_hi32;
|
|
||||||
|
|
||||||
char *next_out;
|
|
||||||
unsigned int avail_out;
|
|
||||||
unsigned int total_out_lo32;
|
|
||||||
unsigned int total_out_hi32;
|
|
||||||
|
|
||||||
void *state;
|
|
||||||
|
|
||||||
void *(*bzalloc)(void *,int,int);
|
|
||||||
void (*bzfree)(void *,void *);
|
|
||||||
void *opaque;
|
|
||||||
}
|
|
||||||
bz_stream;
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef BZ_IMPORT
|
|
||||||
#define BZ_EXPORT
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BZ_NO_STDIO
|
|
||||||
/* Need a definitition for FILE */
|
|
||||||
#include <stdio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
# include <windows.h>
|
|
||||||
# ifdef small
|
|
||||||
/* windows.h define small to char */
|
|
||||||
# undef small
|
|
||||||
# endif
|
|
||||||
# ifdef BZ_EXPORT
|
|
||||||
# define BZ_API(func) WINAPI func
|
|
||||||
# define BZ_EXTERN extern
|
|
||||||
# else
|
|
||||||
/* import windows dll dynamically */
|
|
||||||
# define BZ_API(func) (WINAPI * func)
|
|
||||||
# define BZ_EXTERN
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define BZ_API(func) func
|
|
||||||
# define BZ_EXTERN extern
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Core (low-level) library functions --*/
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzCompressInit) (
|
|
||||||
bz_stream* strm,
|
|
||||||
int blockSize100k,
|
|
||||||
int verbosity,
|
|
||||||
int workFactor
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzCompress) (
|
|
||||||
bz_stream* strm,
|
|
||||||
int action
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzCompressEnd) (
|
|
||||||
bz_stream* strm
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzDecompressInit) (
|
|
||||||
bz_stream *strm,
|
|
||||||
int verbosity,
|
|
||||||
int small
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzDecompress) (
|
|
||||||
bz_stream* strm
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzDecompressEnd) (
|
|
||||||
bz_stream *strm
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- High(er) level library functions --*/
|
|
||||||
|
|
||||||
#ifndef BZ_NO_STDIO
|
|
||||||
#define BZ_MAX_UNUSED 5000
|
|
||||||
|
|
||||||
typedef void BZFILE;
|
|
||||||
|
|
||||||
BZ_EXTERN BZFILE* BZ_API(BZ2_bzReadOpen) (
|
|
||||||
int* bzerror,
|
|
||||||
FILE* f,
|
|
||||||
int verbosity,
|
|
||||||
int small,
|
|
||||||
void* unused,
|
|
||||||
int nUnused
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzReadClose) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzReadGetUnused) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b,
|
|
||||||
void** unused,
|
|
||||||
int* nUnused
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzRead) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b,
|
|
||||||
void* buf,
|
|
||||||
int len
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN BZFILE* BZ_API(BZ2_bzWriteOpen) (
|
|
||||||
int* bzerror,
|
|
||||||
FILE* f,
|
|
||||||
int blockSize100k,
|
|
||||||
int verbosity,
|
|
||||||
int workFactor
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzWrite) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b,
|
|
||||||
void* buf,
|
|
||||||
int len
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzWriteClose) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b,
|
|
||||||
int abandon,
|
|
||||||
unsigned int* nbytes_in,
|
|
||||||
unsigned int* nbytes_out
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzWriteClose64) (
|
|
||||||
int* bzerror,
|
|
||||||
BZFILE* b,
|
|
||||||
int abandon,
|
|
||||||
unsigned int* nbytes_in_lo32,
|
|
||||||
unsigned int* nbytes_in_hi32,
|
|
||||||
unsigned int* nbytes_out_lo32,
|
|
||||||
unsigned int* nbytes_out_hi32
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Utility functions --*/
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffCompress) (
|
|
||||||
char* dest,
|
|
||||||
unsigned int* destLen,
|
|
||||||
char* source,
|
|
||||||
unsigned int sourceLen,
|
|
||||||
int blockSize100k,
|
|
||||||
int verbosity,
|
|
||||||
int workFactor
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzBuffToBuffDecompress) (
|
|
||||||
char* dest,
|
|
||||||
unsigned int* destLen,
|
|
||||||
char* source,
|
|
||||||
unsigned int sourceLen,
|
|
||||||
int small,
|
|
||||||
int verbosity
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
/*--
|
|
||||||
Code contributed by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
|
|
||||||
to support better zlib compatibility.
|
|
||||||
This code is not _officially_ part of libbzip2 (yet);
|
|
||||||
I haven't tested it, documented it, or considered the
|
|
||||||
threading-safeness of it.
|
|
||||||
If this code breaks, please contact both Yoshioka and me.
|
|
||||||
--*/
|
|
||||||
|
|
||||||
BZ_EXTERN const char * BZ_API(BZ2_bzlibVersion) (
|
|
||||||
void
|
|
||||||
);
|
|
||||||
|
|
||||||
#ifndef BZ_NO_STDIO
|
|
||||||
BZ_EXTERN BZFILE * BZ_API(BZ2_bzopen) (
|
|
||||||
const char *path,
|
|
||||||
const char *mode
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN BZFILE * BZ_API(BZ2_bzdopen) (
|
|
||||||
int fd,
|
|
||||||
const char *mode
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzread) (
|
|
||||||
BZFILE* b,
|
|
||||||
void* buf,
|
|
||||||
int len
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzwrite) (
|
|
||||||
BZFILE* b,
|
|
||||||
void* buf,
|
|
||||||
int len
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN int BZ_API(BZ2_bzflush) (
|
|
||||||
BZFILE* b
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN void BZ_API(BZ2_bzclose) (
|
|
||||||
BZFILE* b
|
|
||||||
);
|
|
||||||
|
|
||||||
BZ_EXTERN const char * BZ_API(BZ2_bzerror) (
|
|
||||||
BZFILE *b,
|
|
||||||
int *errnum
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end bzlib.h ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,509 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Private header file for the library. ---*/
|
|
||||||
/*--- bzlib_private.h ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _BZLIB_PRIVATE_H
|
|
||||||
#define _BZLIB_PRIVATE_H
|
|
||||||
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#ifndef BZ_NO_STDIO
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "bzlib.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- General stuff. --*/
|
|
||||||
|
|
||||||
#define BZ_VERSION "1.0.6, 6-Sept-2010"
|
|
||||||
|
|
||||||
typedef char Char;
|
|
||||||
typedef unsigned char Bool;
|
|
||||||
typedef unsigned char UChar;
|
|
||||||
typedef int Int32;
|
|
||||||
typedef unsigned int UInt32;
|
|
||||||
typedef short Int16;
|
|
||||||
typedef unsigned short UInt16;
|
|
||||||
|
|
||||||
#define True ((Bool)1)
|
|
||||||
#define False ((Bool)0)
|
|
||||||
|
|
||||||
#ifndef __GNUC__
|
|
||||||
#define __inline__ /* */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef BZ_NO_STDIO
|
|
||||||
|
|
||||||
extern void BZ2_bz__AssertH__fail ( int errcode );
|
|
||||||
#define AssertH(cond,errcode) \
|
|
||||||
{ if (!(cond)) BZ2_bz__AssertH__fail ( errcode ); }
|
|
||||||
|
|
||||||
#if BZ_DEBUG
|
|
||||||
#define AssertD(cond,msg) \
|
|
||||||
{ if (!(cond)) { \
|
|
||||||
fprintf ( stderr, \
|
|
||||||
"\n\nlibbzip2(debug build): internal error\n\t%s\n", msg );\
|
|
||||||
exit(1); \
|
|
||||||
}}
|
|
||||||
#else
|
|
||||||
#define AssertD(cond,msg) /* */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define VPrintf0(zf) \
|
|
||||||
fprintf(stderr,zf)
|
|
||||||
#define VPrintf1(zf,za1) \
|
|
||||||
fprintf(stderr,zf,za1)
|
|
||||||
#define VPrintf2(zf,za1,za2) \
|
|
||||||
fprintf(stderr,zf,za1,za2)
|
|
||||||
#define VPrintf3(zf,za1,za2,za3) \
|
|
||||||
fprintf(stderr,zf,za1,za2,za3)
|
|
||||||
#define VPrintf4(zf,za1,za2,za3,za4) \
|
|
||||||
fprintf(stderr,zf,za1,za2,za3,za4)
|
|
||||||
#define VPrintf5(zf,za1,za2,za3,za4,za5) \
|
|
||||||
fprintf(stderr,zf,za1,za2,za3,za4,za5)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern void bz_internal_error ( int errcode );
|
|
||||||
#define AssertH(cond,errcode) \
|
|
||||||
{ if (!(cond)) bz_internal_error ( errcode ); }
|
|
||||||
#define AssertD(cond,msg) do { } while (0)
|
|
||||||
#define VPrintf0(zf) do { } while (0)
|
|
||||||
#define VPrintf1(zf,za1) do { } while (0)
|
|
||||||
#define VPrintf2(zf,za1,za2) do { } while (0)
|
|
||||||
#define VPrintf3(zf,za1,za2,za3) do { } while (0)
|
|
||||||
#define VPrintf4(zf,za1,za2,za3,za4) do { } while (0)
|
|
||||||
#define VPrintf5(zf,za1,za2,za3,za4,za5) do { } while (0)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#define BZALLOC(nnn) (strm->bzalloc)(strm->opaque,(nnn),1)
|
|
||||||
#define BZFREE(ppp) (strm->bzfree)(strm->opaque,(ppp))
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Header bytes. --*/
|
|
||||||
|
|
||||||
#define BZ_HDR_B 0x42 /* 'B' */
|
|
||||||
#define BZ_HDR_Z 0x5a /* 'Z' */
|
|
||||||
#define BZ_HDR_h 0x68 /* 'h' */
|
|
||||||
#define BZ_HDR_0 0x30 /* '0' */
|
|
||||||
|
|
||||||
/*-- Constants for the back end. --*/
|
|
||||||
|
|
||||||
#define BZ_MAX_ALPHA_SIZE 258
|
|
||||||
#define BZ_MAX_CODE_LEN 23
|
|
||||||
|
|
||||||
#define BZ_RUNA 0
|
|
||||||
#define BZ_RUNB 1
|
|
||||||
|
|
||||||
#define BZ_N_GROUPS 6
|
|
||||||
#define BZ_G_SIZE 50
|
|
||||||
#define BZ_N_ITERS 4
|
|
||||||
|
|
||||||
#define BZ_MAX_SELECTORS (2 + (900000 / BZ_G_SIZE))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Stuff for randomising repetitive blocks. --*/
|
|
||||||
|
|
||||||
extern Int32 BZ2_rNums[512];
|
|
||||||
|
|
||||||
#define BZ_RAND_DECLS \
|
|
||||||
Int32 rNToGo; \
|
|
||||||
Int32 rTPos \
|
|
||||||
|
|
||||||
#define BZ_RAND_INIT_MASK \
|
|
||||||
s->rNToGo = 0; \
|
|
||||||
s->rTPos = 0 \
|
|
||||||
|
|
||||||
#define BZ_RAND_MASK ((s->rNToGo == 1) ? 1 : 0)
|
|
||||||
|
|
||||||
#define BZ_RAND_UPD_MASK \
|
|
||||||
if (s->rNToGo == 0) { \
|
|
||||||
s->rNToGo = BZ2_rNums[s->rTPos]; \
|
|
||||||
s->rTPos++; \
|
|
||||||
if (s->rTPos == 512) s->rTPos = 0; \
|
|
||||||
} \
|
|
||||||
s->rNToGo--;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Stuff for doing CRCs. --*/
|
|
||||||
|
|
||||||
extern UInt32 BZ2_crc32Table[256];
|
|
||||||
|
|
||||||
#define BZ_INITIALISE_CRC(crcVar) \
|
|
||||||
{ \
|
|
||||||
crcVar = 0xffffffffL; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BZ_FINALISE_CRC(crcVar) \
|
|
||||||
{ \
|
|
||||||
crcVar = ~(crcVar); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define BZ_UPDATE_CRC(crcVar,cha) \
|
|
||||||
{ \
|
|
||||||
crcVar = (crcVar << 8) ^ \
|
|
||||||
BZ2_crc32Table[(crcVar >> 24) ^ \
|
|
||||||
((UChar)cha)]; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- States and modes for compression. --*/
|
|
||||||
|
|
||||||
#define BZ_M_IDLE 1
|
|
||||||
#define BZ_M_RUNNING 2
|
|
||||||
#define BZ_M_FLUSHING 3
|
|
||||||
#define BZ_M_FINISHING 4
|
|
||||||
|
|
||||||
#define BZ_S_OUTPUT 1
|
|
||||||
#define BZ_S_INPUT 2
|
|
||||||
|
|
||||||
#define BZ_N_RADIX 2
|
|
||||||
#define BZ_N_QSORT 12
|
|
||||||
#define BZ_N_SHELL 18
|
|
||||||
#define BZ_N_OVERSHOOT (BZ_N_RADIX + BZ_N_QSORT + BZ_N_SHELL + 2)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Structure holding all the compression-side stuff. --*/
|
|
||||||
|
|
||||||
typedef
|
|
||||||
struct {
|
|
||||||
/* pointer back to the struct bz_stream */
|
|
||||||
bz_stream* strm;
|
|
||||||
|
|
||||||
/* mode this stream is in, and whether inputting */
|
|
||||||
/* or outputting data */
|
|
||||||
Int32 mode;
|
|
||||||
Int32 state;
|
|
||||||
|
|
||||||
/* remembers avail_in when flush/finish requested */
|
|
||||||
UInt32 avail_in_expect;
|
|
||||||
|
|
||||||
/* for doing the block sorting */
|
|
||||||
UInt32* arr1;
|
|
||||||
UInt32* arr2;
|
|
||||||
UInt32* ftab;
|
|
||||||
Int32 origPtr;
|
|
||||||
|
|
||||||
/* aliases for arr1 and arr2 */
|
|
||||||
UInt32* ptr;
|
|
||||||
UChar* block;
|
|
||||||
UInt16* mtfv;
|
|
||||||
UChar* zbits;
|
|
||||||
|
|
||||||
/* for deciding when to use the fallback sorting algorithm */
|
|
||||||
Int32 workFactor;
|
|
||||||
|
|
||||||
/* run-length-encoding of the input */
|
|
||||||
UInt32 state_in_ch;
|
|
||||||
Int32 state_in_len;
|
|
||||||
BZ_RAND_DECLS;
|
|
||||||
|
|
||||||
/* input and output limits and current posns */
|
|
||||||
Int32 nblock;
|
|
||||||
Int32 nblockMAX;
|
|
||||||
Int32 numZ;
|
|
||||||
Int32 state_out_pos;
|
|
||||||
|
|
||||||
/* map of bytes used in block */
|
|
||||||
Int32 nInUse;
|
|
||||||
Bool inUse[256];
|
|
||||||
UChar unseqToSeq[256];
|
|
||||||
|
|
||||||
/* the buffer for bit stream creation */
|
|
||||||
UInt32 bsBuff;
|
|
||||||
Int32 bsLive;
|
|
||||||
|
|
||||||
/* block and combined CRCs */
|
|
||||||
UInt32 blockCRC;
|
|
||||||
UInt32 combinedCRC;
|
|
||||||
|
|
||||||
/* misc administratium */
|
|
||||||
Int32 verbosity;
|
|
||||||
Int32 blockNo;
|
|
||||||
Int32 blockSize100k;
|
|
||||||
|
|
||||||
/* stuff for coding the MTF values */
|
|
||||||
Int32 nMTF;
|
|
||||||
Int32 mtfFreq [BZ_MAX_ALPHA_SIZE];
|
|
||||||
UChar selector [BZ_MAX_SELECTORS];
|
|
||||||
UChar selectorMtf[BZ_MAX_SELECTORS];
|
|
||||||
|
|
||||||
UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 code [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 rfreq [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
/* second dimension: only 3 needed; 4 makes index calculations faster */
|
|
||||||
UInt32 len_pack[BZ_MAX_ALPHA_SIZE][4];
|
|
||||||
|
|
||||||
}
|
|
||||||
EState;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- externs for compression. --*/
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_blockSort ( EState* );
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_compressBlock ( EState*, Bool );
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_bsInitWrite ( EState* );
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_hbAssignCodes ( Int32*, UChar*, Int32, Int32, Int32 );
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_hbMakeCodeLengths ( UChar*, Int32*, Int32, Int32 );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- states for decompression. --*/
|
|
||||||
|
|
||||||
#define BZ_X_IDLE 1
|
|
||||||
#define BZ_X_OUTPUT 2
|
|
||||||
|
|
||||||
#define BZ_X_MAGIC_1 10
|
|
||||||
#define BZ_X_MAGIC_2 11
|
|
||||||
#define BZ_X_MAGIC_3 12
|
|
||||||
#define BZ_X_MAGIC_4 13
|
|
||||||
#define BZ_X_BLKHDR_1 14
|
|
||||||
#define BZ_X_BLKHDR_2 15
|
|
||||||
#define BZ_X_BLKHDR_3 16
|
|
||||||
#define BZ_X_BLKHDR_4 17
|
|
||||||
#define BZ_X_BLKHDR_5 18
|
|
||||||
#define BZ_X_BLKHDR_6 19
|
|
||||||
#define BZ_X_BCRC_1 20
|
|
||||||
#define BZ_X_BCRC_2 21
|
|
||||||
#define BZ_X_BCRC_3 22
|
|
||||||
#define BZ_X_BCRC_4 23
|
|
||||||
#define BZ_X_RANDBIT 24
|
|
||||||
#define BZ_X_ORIGPTR_1 25
|
|
||||||
#define BZ_X_ORIGPTR_2 26
|
|
||||||
#define BZ_X_ORIGPTR_3 27
|
|
||||||
#define BZ_X_MAPPING_1 28
|
|
||||||
#define BZ_X_MAPPING_2 29
|
|
||||||
#define BZ_X_SELECTOR_1 30
|
|
||||||
#define BZ_X_SELECTOR_2 31
|
|
||||||
#define BZ_X_SELECTOR_3 32
|
|
||||||
#define BZ_X_CODING_1 33
|
|
||||||
#define BZ_X_CODING_2 34
|
|
||||||
#define BZ_X_CODING_3 35
|
|
||||||
#define BZ_X_MTF_1 36
|
|
||||||
#define BZ_X_MTF_2 37
|
|
||||||
#define BZ_X_MTF_3 38
|
|
||||||
#define BZ_X_MTF_4 39
|
|
||||||
#define BZ_X_MTF_5 40
|
|
||||||
#define BZ_X_MTF_6 41
|
|
||||||
#define BZ_X_ENDHDR_2 42
|
|
||||||
#define BZ_X_ENDHDR_3 43
|
|
||||||
#define BZ_X_ENDHDR_4 44
|
|
||||||
#define BZ_X_ENDHDR_5 45
|
|
||||||
#define BZ_X_ENDHDR_6 46
|
|
||||||
#define BZ_X_CCRC_1 47
|
|
||||||
#define BZ_X_CCRC_2 48
|
|
||||||
#define BZ_X_CCRC_3 49
|
|
||||||
#define BZ_X_CCRC_4 50
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Constants for the fast MTF decoder. --*/
|
|
||||||
|
|
||||||
#define MTFA_SIZE 4096
|
|
||||||
#define MTFL_SIZE 16
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Structure holding all the decompression-side stuff. --*/
|
|
||||||
|
|
||||||
typedef
|
|
||||||
struct {
|
|
||||||
/* pointer back to the struct bz_stream */
|
|
||||||
bz_stream* strm;
|
|
||||||
|
|
||||||
/* state indicator for this stream */
|
|
||||||
Int32 state;
|
|
||||||
|
|
||||||
/* for doing the final run-length decoding */
|
|
||||||
UChar state_out_ch;
|
|
||||||
Int32 state_out_len;
|
|
||||||
Bool blockRandomised;
|
|
||||||
BZ_RAND_DECLS;
|
|
||||||
|
|
||||||
/* the buffer for bit stream reading */
|
|
||||||
UInt32 bsBuff;
|
|
||||||
Int32 bsLive;
|
|
||||||
|
|
||||||
/* misc administratium */
|
|
||||||
Int32 blockSize100k;
|
|
||||||
Bool smallDecompress;
|
|
||||||
Int32 currBlockNo;
|
|
||||||
Int32 verbosity;
|
|
||||||
|
|
||||||
/* for undoing the Burrows-Wheeler transform */
|
|
||||||
Int32 origPtr;
|
|
||||||
UInt32 tPos;
|
|
||||||
Int32 k0;
|
|
||||||
Int32 unzftab[256];
|
|
||||||
Int32 nblock_used;
|
|
||||||
Int32 cftab[257];
|
|
||||||
Int32 cftabCopy[257];
|
|
||||||
|
|
||||||
/* for undoing the Burrows-Wheeler transform (FAST) */
|
|
||||||
UInt32 *tt;
|
|
||||||
|
|
||||||
/* for undoing the Burrows-Wheeler transform (SMALL) */
|
|
||||||
UInt16 *ll16;
|
|
||||||
UChar *ll4;
|
|
||||||
|
|
||||||
/* stored and calculated CRCs */
|
|
||||||
UInt32 storedBlockCRC;
|
|
||||||
UInt32 storedCombinedCRC;
|
|
||||||
UInt32 calculatedBlockCRC;
|
|
||||||
UInt32 calculatedCombinedCRC;
|
|
||||||
|
|
||||||
/* map of bytes used in block */
|
|
||||||
Int32 nInUse;
|
|
||||||
Bool inUse[256];
|
|
||||||
Bool inUse16[16];
|
|
||||||
UChar seqToUnseq[256];
|
|
||||||
|
|
||||||
/* for decoding the MTF values */
|
|
||||||
UChar mtfa [MTFA_SIZE];
|
|
||||||
Int32 mtfbase[256 / MTFL_SIZE];
|
|
||||||
UChar selector [BZ_MAX_SELECTORS];
|
|
||||||
UChar selectorMtf[BZ_MAX_SELECTORS];
|
|
||||||
UChar len [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
|
|
||||||
Int32 limit [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 base [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 perm [BZ_N_GROUPS][BZ_MAX_ALPHA_SIZE];
|
|
||||||
Int32 minLens[BZ_N_GROUPS];
|
|
||||||
|
|
||||||
/* save area for scalars in the main decompress code */
|
|
||||||
Int32 save_i;
|
|
||||||
Int32 save_j;
|
|
||||||
Int32 save_t;
|
|
||||||
Int32 save_alphaSize;
|
|
||||||
Int32 save_nGroups;
|
|
||||||
Int32 save_nSelectors;
|
|
||||||
Int32 save_EOB;
|
|
||||||
Int32 save_groupNo;
|
|
||||||
Int32 save_groupPos;
|
|
||||||
Int32 save_nextSym;
|
|
||||||
Int32 save_nblockMAX;
|
|
||||||
Int32 save_nblock;
|
|
||||||
Int32 save_es;
|
|
||||||
Int32 save_N;
|
|
||||||
Int32 save_curr;
|
|
||||||
Int32 save_zt;
|
|
||||||
Int32 save_zn;
|
|
||||||
Int32 save_zvec;
|
|
||||||
Int32 save_zj;
|
|
||||||
Int32 save_gSel;
|
|
||||||
Int32 save_gMinlen;
|
|
||||||
Int32* save_gLimit;
|
|
||||||
Int32* save_gBase;
|
|
||||||
Int32* save_gPerm;
|
|
||||||
|
|
||||||
}
|
|
||||||
DState;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*-- Macros for decompression. --*/
|
|
||||||
|
|
||||||
#define BZ_GET_FAST(cccc) \
|
|
||||||
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
|
|
||||||
if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
|
|
||||||
s->tPos = s->tt[s->tPos]; \
|
|
||||||
cccc = (UChar)(s->tPos & 0xff); \
|
|
||||||
s->tPos >>= 8;
|
|
||||||
|
|
||||||
#define BZ_GET_FAST_C(cccc) \
|
|
||||||
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
|
|
||||||
if (c_tPos >= (UInt32)100000 * (UInt32)ro_blockSize100k) return True; \
|
|
||||||
c_tPos = c_tt[c_tPos]; \
|
|
||||||
cccc = (UChar)(c_tPos & 0xff); \
|
|
||||||
c_tPos >>= 8;
|
|
||||||
|
|
||||||
#define SET_LL4(i,n) \
|
|
||||||
{ if (((i) & 0x1) == 0) \
|
|
||||||
s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0xf0) | (n); else \
|
|
||||||
s->ll4[(i) >> 1] = (s->ll4[(i) >> 1] & 0x0f) | ((n) << 4); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_LL4(i) \
|
|
||||||
((((UInt32)(s->ll4[(i) >> 1])) >> (((i) << 2) & 0x4)) & 0xF)
|
|
||||||
|
|
||||||
#define SET_LL(i,n) \
|
|
||||||
{ s->ll16[i] = (UInt16)(n & 0x0000ffff); \
|
|
||||||
SET_LL4(i, n >> 16); \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_LL(i) \
|
|
||||||
(((UInt32)s->ll16[i]) | (GET_LL4(i) << 16))
|
|
||||||
|
|
||||||
#define BZ_GET_SMALL(cccc) \
|
|
||||||
/* c_tPos is unsigned, hence test < 0 is pointless. */ \
|
|
||||||
if (s->tPos >= (UInt32)100000 * (UInt32)s->blockSize100k) return True; \
|
|
||||||
cccc = BZ2_indexIntoF ( s->tPos, s->cftab ); \
|
|
||||||
s->tPos = GET_LL(s->tPos);
|
|
||||||
|
|
||||||
|
|
||||||
/*-- externs for decompression. --*/
|
|
||||||
|
|
||||||
extern Int32
|
|
||||||
BZ2_indexIntoF ( Int32, Int32* );
|
|
||||||
|
|
||||||
extern Int32
|
|
||||||
BZ2_decompress ( DState* );
|
|
||||||
|
|
||||||
extern void
|
|
||||||
BZ2_hbCreateDecodeTables ( Int32*, Int32*, Int32*, UChar*,
|
|
||||||
Int32, Int32, Int32 );
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*-- BZ_NO_STDIO seems to make NULL disappear on some platforms. --*/
|
|
||||||
|
|
||||||
#ifdef BZ_NO_STDIO
|
|
||||||
#ifndef NULL
|
|
||||||
#define NULL 0
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end bzlib_private.h ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,61 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# Bzmore wrapped for bzip2,
|
|
||||||
# adapted from zmore by Philippe Troin <phil@fifi.org> for Debian GNU/Linux.
|
|
||||||
|
|
||||||
PATH="/usr/bin:$PATH"; export PATH
|
|
||||||
|
|
||||||
prog=`echo $0 | sed 's|.*/||'`
|
|
||||||
case "$prog" in
|
|
||||||
*less) more=less ;;
|
|
||||||
*) more=more ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test "`echo -n a`" = "-n a"; then
|
|
||||||
# looks like a SysV system:
|
|
||||||
n1=''; n2='\c'
|
|
||||||
else
|
|
||||||
n1='-n'; n2=''
|
|
||||||
fi
|
|
||||||
oldtty=`stty -g 2>/dev/null`
|
|
||||||
if stty -cbreak 2>/dev/null; then
|
|
||||||
cb='cbreak'; ncb='-cbreak'
|
|
||||||
else
|
|
||||||
# 'stty min 1' resets eof to ^a on both SunOS and SysV!
|
|
||||||
cb='min 1 -icanon'; ncb='icanon eof ^d'
|
|
||||||
fi
|
|
||||||
if test $? -eq 0 -a -n "$oldtty"; then
|
|
||||||
trap 'stty $oldtty 2>/dev/null; exit' 0 2 3 5 10 13 15
|
|
||||||
else
|
|
||||||
trap 'stty $ncb echo 2>/dev/null; exit' 0 2 3 5 10 13 15
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# = 0; then
|
|
||||||
if test -t 0; then
|
|
||||||
echo usage: $prog files...
|
|
||||||
else
|
|
||||||
bzip2 -cdfq | eval $more
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
FIRST=1
|
|
||||||
for FILE
|
|
||||||
do
|
|
||||||
if test $FIRST -eq 0; then
|
|
||||||
echo $n1 "--More--(Next file: $FILE)$n2"
|
|
||||||
stty $cb -echo 2>/dev/null
|
|
||||||
ANS=`dd bs=1 count=1 2>/dev/null`
|
|
||||||
stty $ncb echo 2>/dev/null
|
|
||||||
echo " "
|
|
||||||
if test "$ANS" = 'e' -o "$ANS" = 'q'; then
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$ANS" != 's'; then
|
|
||||||
echo "------> $FILE <------"
|
|
||||||
bzip2 -cdfq "$FILE" | eval $more
|
|
||||||
fi
|
|
||||||
if test -t; then
|
|
||||||
FIRST=0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
@ -1,152 +0,0 @@
|
|||||||
.\"Shamelessly copied from zmore.1 by Philippe Troin <phil@fifi.org>
|
|
||||||
.\"for Debian GNU/Linux
|
|
||||||
.TH BZMORE 1
|
|
||||||
.SH NAME
|
|
||||||
bzmore, bzless \- file perusal filter for crt viewing of bzip2 compressed text
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B bzmore
|
|
||||||
[ name ... ]
|
|
||||||
.br
|
|
||||||
.B bzless
|
|
||||||
[ name ... ]
|
|
||||||
.SH NOTE
|
|
||||||
In the following description,
|
|
||||||
.I bzless
|
|
||||||
and
|
|
||||||
.I less
|
|
||||||
can be used interchangeably with
|
|
||||||
.I bzmore
|
|
||||||
and
|
|
||||||
.I more.
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.I Bzmore
|
|
||||||
is a filter which allows examination of compressed or plain text files
|
|
||||||
one screenful at a time on a soft-copy terminal.
|
|
||||||
.I bzmore
|
|
||||||
works on files compressed with
|
|
||||||
.I bzip2
|
|
||||||
and also on uncompressed files.
|
|
||||||
If a file does not exist,
|
|
||||||
.I bzmore
|
|
||||||
looks for a file of the same name with the addition of a .bz2 suffix.
|
|
||||||
.PP
|
|
||||||
.I Bzmore
|
|
||||||
normally pauses after each screenful, printing --More--
|
|
||||||
at the bottom of the screen.
|
|
||||||
If the user then types a carriage return, one more line is displayed.
|
|
||||||
If the user hits a space,
|
|
||||||
another screenful is displayed. Other possibilities are enumerated later.
|
|
||||||
.PP
|
|
||||||
.I Bzmore
|
|
||||||
looks in the file
|
|
||||||
.I /etc/termcap
|
|
||||||
to determine terminal characteristics,
|
|
||||||
and to determine the default window size.
|
|
||||||
On a terminal capable of displaying 24 lines,
|
|
||||||
the default window size is 22 lines.
|
|
||||||
Other sequences which may be typed when
|
|
||||||
.I bzmore
|
|
||||||
pauses, and their effects, are as follows (\fIi\fP is an optional integer
|
|
||||||
argument, defaulting to 1) :
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fP<space>
|
|
||||||
display
|
|
||||||
.I i
|
|
||||||
more lines, (or another screenful if no argument is given)
|
|
||||||
.PP
|
|
||||||
.IP ^D
|
|
||||||
display 11 more lines (a ``scroll'').
|
|
||||||
If
|
|
||||||
.I i
|
|
||||||
is given, then the scroll size is set to \fIi\|\fP.
|
|
||||||
.PP
|
|
||||||
.IP d
|
|
||||||
same as ^D (control-D)
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fPz
|
|
||||||
same as typing a space except that \fIi\|\fP, if present, becomes the new
|
|
||||||
window size. Note that the window size reverts back to the default at the
|
|
||||||
end of the current file.
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fPs
|
|
||||||
skip \fIi\|\fP lines and print a screenful of lines
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fPf
|
|
||||||
skip \fIi\fP screenfuls and print a screenful of lines
|
|
||||||
.PP
|
|
||||||
.IP "q or Q"
|
|
||||||
quit reading the current file; go on to the next (if any)
|
|
||||||
.PP
|
|
||||||
.IP "e or q"
|
|
||||||
When the prompt --More--(Next file:
|
|
||||||
.IR file )
|
|
||||||
is printed, this command causes bzmore to exit.
|
|
||||||
.PP
|
|
||||||
.IP s
|
|
||||||
When the prompt --More--(Next file:
|
|
||||||
.IR file )
|
|
||||||
is printed, this command causes bzmore to skip the next file and continue.
|
|
||||||
.PP
|
|
||||||
.IP =
|
|
||||||
Display the current line number.
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fP/expr
|
|
||||||
search for the \fIi\|\fP-th occurrence of the regular expression \fIexpr.\fP
|
|
||||||
If the pattern is not found,
|
|
||||||
.I bzmore
|
|
||||||
goes on to the next file (if any).
|
|
||||||
Otherwise, a screenful is displayed, starting two lines before the place
|
|
||||||
where the expression was found.
|
|
||||||
The user's erase and kill characters may be used to edit the regular
|
|
||||||
expression.
|
|
||||||
Erasing back past the first column cancels the search command.
|
|
||||||
.PP
|
|
||||||
.IP \fIi\|\fPn
|
|
||||||
search for the \fIi\|\fP-th occurrence of the last regular expression entered.
|
|
||||||
.PP
|
|
||||||
.IP !command
|
|
||||||
invoke a shell with \fIcommand\|\fP.
|
|
||||||
The character `!' in "command" are replaced with the
|
|
||||||
previous shell command. The sequence "\\!" is replaced by "!".
|
|
||||||
.PP
|
|
||||||
.IP ":q or :Q"
|
|
||||||
quit reading the current file; go on to the next (if any)
|
|
||||||
(same as q or Q).
|
|
||||||
.PP
|
|
||||||
.IP .
|
|
||||||
(dot) repeat the previous command.
|
|
||||||
.PP
|
|
||||||
The commands take effect immediately, i.e., it is not necessary to
|
|
||||||
type a carriage return.
|
|
||||||
Up to the time when the command character itself is given,
|
|
||||||
the user may hit the line kill character to cancel the numerical
|
|
||||||
argument being formed.
|
|
||||||
In addition, the user may hit the erase character to redisplay the
|
|
||||||
--More-- message.
|
|
||||||
.PP
|
|
||||||
At any time when output is being sent to the terminal, the user can
|
|
||||||
hit the quit key (normally control\-\\).
|
|
||||||
.I Bzmore
|
|
||||||
will stop sending output, and will display the usual --More--
|
|
||||||
prompt.
|
|
||||||
The user may then enter one of the above commands in the normal manner.
|
|
||||||
Unfortunately, some output is lost when this is done, due to the
|
|
||||||
fact that any characters waiting in the terminal's output queue
|
|
||||||
are flushed when the quit signal occurs.
|
|
||||||
.PP
|
|
||||||
The terminal is set to
|
|
||||||
.I noecho
|
|
||||||
mode by this program so that the output can be continuous.
|
|
||||||
What you type will thus not show on your terminal, except for the / and !
|
|
||||||
commands.
|
|
||||||
.PP
|
|
||||||
If the standard output is not a teletype, then
|
|
||||||
.I bzmore
|
|
||||||
acts just like
|
|
||||||
.I bzcat,
|
|
||||||
except that a header is printed before each file.
|
|
||||||
.SH FILES
|
|
||||||
.DT
|
|
||||||
/etc/termcap Terminal data base
|
|
||||||
.SH "SEE ALSO"
|
|
||||||
more(1), less(1), bzip2(1), bzdiff(1), bzgrep(1)
|
|
@ -1,104 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Table for doing CRCs ---*/
|
|
||||||
/*--- crctable.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include "bzlib_private.h"
|
|
||||||
|
|
||||||
/*--
|
|
||||||
I think this is an implementation of the AUTODIN-II,
|
|
||||||
Ethernet & FDDI 32-bit CRC standard. Vaguely derived
|
|
||||||
from code by Rob Warnock, in Section 51 of the
|
|
||||||
comp.compression FAQ.
|
|
||||||
--*/
|
|
||||||
|
|
||||||
UInt32 BZ2_crc32Table[256] = {
|
|
||||||
|
|
||||||
/*-- Ugly, innit? --*/
|
|
||||||
|
|
||||||
0x00000000L, 0x04c11db7L, 0x09823b6eL, 0x0d4326d9L,
|
|
||||||
0x130476dcL, 0x17c56b6bL, 0x1a864db2L, 0x1e475005L,
|
|
||||||
0x2608edb8L, 0x22c9f00fL, 0x2f8ad6d6L, 0x2b4bcb61L,
|
|
||||||
0x350c9b64L, 0x31cd86d3L, 0x3c8ea00aL, 0x384fbdbdL,
|
|
||||||
0x4c11db70L, 0x48d0c6c7L, 0x4593e01eL, 0x4152fda9L,
|
|
||||||
0x5f15adacL, 0x5bd4b01bL, 0x569796c2L, 0x52568b75L,
|
|
||||||
0x6a1936c8L, 0x6ed82b7fL, 0x639b0da6L, 0x675a1011L,
|
|
||||||
0x791d4014L, 0x7ddc5da3L, 0x709f7b7aL, 0x745e66cdL,
|
|
||||||
0x9823b6e0L, 0x9ce2ab57L, 0x91a18d8eL, 0x95609039L,
|
|
||||||
0x8b27c03cL, 0x8fe6dd8bL, 0x82a5fb52L, 0x8664e6e5L,
|
|
||||||
0xbe2b5b58L, 0xbaea46efL, 0xb7a96036L, 0xb3687d81L,
|
|
||||||
0xad2f2d84L, 0xa9ee3033L, 0xa4ad16eaL, 0xa06c0b5dL,
|
|
||||||
0xd4326d90L, 0xd0f37027L, 0xddb056feL, 0xd9714b49L,
|
|
||||||
0xc7361b4cL, 0xc3f706fbL, 0xceb42022L, 0xca753d95L,
|
|
||||||
0xf23a8028L, 0xf6fb9d9fL, 0xfbb8bb46L, 0xff79a6f1L,
|
|
||||||
0xe13ef6f4L, 0xe5ffeb43L, 0xe8bccd9aL, 0xec7dd02dL,
|
|
||||||
0x34867077L, 0x30476dc0L, 0x3d044b19L, 0x39c556aeL,
|
|
||||||
0x278206abL, 0x23431b1cL, 0x2e003dc5L, 0x2ac12072L,
|
|
||||||
0x128e9dcfL, 0x164f8078L, 0x1b0ca6a1L, 0x1fcdbb16L,
|
|
||||||
0x018aeb13L, 0x054bf6a4L, 0x0808d07dL, 0x0cc9cdcaL,
|
|
||||||
0x7897ab07L, 0x7c56b6b0L, 0x71159069L, 0x75d48ddeL,
|
|
||||||
0x6b93dddbL, 0x6f52c06cL, 0x6211e6b5L, 0x66d0fb02L,
|
|
||||||
0x5e9f46bfL, 0x5a5e5b08L, 0x571d7dd1L, 0x53dc6066L,
|
|
||||||
0x4d9b3063L, 0x495a2dd4L, 0x44190b0dL, 0x40d816baL,
|
|
||||||
0xaca5c697L, 0xa864db20L, 0xa527fdf9L, 0xa1e6e04eL,
|
|
||||||
0xbfa1b04bL, 0xbb60adfcL, 0xb6238b25L, 0xb2e29692L,
|
|
||||||
0x8aad2b2fL, 0x8e6c3698L, 0x832f1041L, 0x87ee0df6L,
|
|
||||||
0x99a95df3L, 0x9d684044L, 0x902b669dL, 0x94ea7b2aL,
|
|
||||||
0xe0b41de7L, 0xe4750050L, 0xe9362689L, 0xedf73b3eL,
|
|
||||||
0xf3b06b3bL, 0xf771768cL, 0xfa325055L, 0xfef34de2L,
|
|
||||||
0xc6bcf05fL, 0xc27dede8L, 0xcf3ecb31L, 0xcbffd686L,
|
|
||||||
0xd5b88683L, 0xd1799b34L, 0xdc3abdedL, 0xd8fba05aL,
|
|
||||||
0x690ce0eeL, 0x6dcdfd59L, 0x608edb80L, 0x644fc637L,
|
|
||||||
0x7a089632L, 0x7ec98b85L, 0x738aad5cL, 0x774bb0ebL,
|
|
||||||
0x4f040d56L, 0x4bc510e1L, 0x46863638L, 0x42472b8fL,
|
|
||||||
0x5c007b8aL, 0x58c1663dL, 0x558240e4L, 0x51435d53L,
|
|
||||||
0x251d3b9eL, 0x21dc2629L, 0x2c9f00f0L, 0x285e1d47L,
|
|
||||||
0x36194d42L, 0x32d850f5L, 0x3f9b762cL, 0x3b5a6b9bL,
|
|
||||||
0x0315d626L, 0x07d4cb91L, 0x0a97ed48L, 0x0e56f0ffL,
|
|
||||||
0x1011a0faL, 0x14d0bd4dL, 0x19939b94L, 0x1d528623L,
|
|
||||||
0xf12f560eL, 0xf5ee4bb9L, 0xf8ad6d60L, 0xfc6c70d7L,
|
|
||||||
0xe22b20d2L, 0xe6ea3d65L, 0xeba91bbcL, 0xef68060bL,
|
|
||||||
0xd727bbb6L, 0xd3e6a601L, 0xdea580d8L, 0xda649d6fL,
|
|
||||||
0xc423cd6aL, 0xc0e2d0ddL, 0xcda1f604L, 0xc960ebb3L,
|
|
||||||
0xbd3e8d7eL, 0xb9ff90c9L, 0xb4bcb610L, 0xb07daba7L,
|
|
||||||
0xae3afba2L, 0xaafbe615L, 0xa7b8c0ccL, 0xa379dd7bL,
|
|
||||||
0x9b3660c6L, 0x9ff77d71L, 0x92b45ba8L, 0x9675461fL,
|
|
||||||
0x8832161aL, 0x8cf30badL, 0x81b02d74L, 0x857130c3L,
|
|
||||||
0x5d8a9099L, 0x594b8d2eL, 0x5408abf7L, 0x50c9b640L,
|
|
||||||
0x4e8ee645L, 0x4a4ffbf2L, 0x470cdd2bL, 0x43cdc09cL,
|
|
||||||
0x7b827d21L, 0x7f436096L, 0x7200464fL, 0x76c15bf8L,
|
|
||||||
0x68860bfdL, 0x6c47164aL, 0x61043093L, 0x65c52d24L,
|
|
||||||
0x119b4be9L, 0x155a565eL, 0x18197087L, 0x1cd86d30L,
|
|
||||||
0x029f3d35L, 0x065e2082L, 0x0b1d065bL, 0x0fdc1becL,
|
|
||||||
0x3793a651L, 0x3352bbe6L, 0x3e119d3fL, 0x3ad08088L,
|
|
||||||
0x2497d08dL, 0x2056cd3aL, 0x2d15ebe3L, 0x29d4f654L,
|
|
||||||
0xc5a92679L, 0xc1683bceL, 0xcc2b1d17L, 0xc8ea00a0L,
|
|
||||||
0xd6ad50a5L, 0xd26c4d12L, 0xdf2f6bcbL, 0xdbee767cL,
|
|
||||||
0xe3a1cbc1L, 0xe760d676L, 0xea23f0afL, 0xeee2ed18L,
|
|
||||||
0xf0a5bd1dL, 0xf464a0aaL, 0xf9278673L, 0xfde69bc4L,
|
|
||||||
0x89b8fd09L, 0x8d79e0beL, 0x803ac667L, 0x84fbdbd0L,
|
|
||||||
0x9abc8bd5L, 0x9e7d9662L, 0x933eb0bbL, 0x97ffad0cL,
|
|
||||||
0xafb010b1L, 0xab710d06L, 0xa6322bdfL, 0xa2f33668L,
|
|
||||||
0xbcb4666dL, 0xb8757bdaL, 0xb5365d03L, 0xb1f740b4L
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end crctable.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,646 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Decompression machinery ---*/
|
|
||||||
/*--- decompress.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include "bzlib_private.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
static
|
|
||||||
void makeMaps_d ( DState* s )
|
|
||||||
{
|
|
||||||
Int32 i;
|
|
||||||
s->nInUse = 0;
|
|
||||||
for (i = 0; i < 256; i++)
|
|
||||||
if (s->inUse[i]) {
|
|
||||||
s->seqToUnseq[s->nInUse] = i;
|
|
||||||
s->nInUse++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
#define RETURN(rrr) \
|
|
||||||
{ retVal = rrr; goto save_state_and_return; };
|
|
||||||
|
|
||||||
#define GET_BITS(lll,vvv,nnn) \
|
|
||||||
case lll: s->state = lll; \
|
|
||||||
while (True) { \
|
|
||||||
if (s->bsLive >= nnn) { \
|
|
||||||
UInt32 v; \
|
|
||||||
v = (s->bsBuff >> \
|
|
||||||
(s->bsLive-nnn)) & ((1 << nnn)-1); \
|
|
||||||
s->bsLive -= nnn; \
|
|
||||||
vvv = v; \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
if (s->strm->avail_in == 0) RETURN(BZ_OK); \
|
|
||||||
s->bsBuff \
|
|
||||||
= (s->bsBuff << 8) | \
|
|
||||||
((UInt32) \
|
|
||||||
(*((UChar*)(s->strm->next_in)))); \
|
|
||||||
s->bsLive += 8; \
|
|
||||||
s->strm->next_in++; \
|
|
||||||
s->strm->avail_in--; \
|
|
||||||
s->strm->total_in_lo32++; \
|
|
||||||
if (s->strm->total_in_lo32 == 0) \
|
|
||||||
s->strm->total_in_hi32++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define GET_UCHAR(lll,uuu) \
|
|
||||||
GET_BITS(lll,uuu,8)
|
|
||||||
|
|
||||||
#define GET_BIT(lll,uuu) \
|
|
||||||
GET_BITS(lll,uuu,1)
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
#define GET_MTF_VAL(label1,label2,lval) \
|
|
||||||
{ \
|
|
||||||
if (groupPos == 0) { \
|
|
||||||
groupNo++; \
|
|
||||||
if (groupNo >= nSelectors) \
|
|
||||||
RETURN(BZ_DATA_ERROR); \
|
|
||||||
groupPos = BZ_G_SIZE; \
|
|
||||||
gSel = s->selector[groupNo]; \
|
|
||||||
gMinlen = s->minLens[gSel]; \
|
|
||||||
gLimit = &(s->limit[gSel][0]); \
|
|
||||||
gPerm = &(s->perm[gSel][0]); \
|
|
||||||
gBase = &(s->base[gSel][0]); \
|
|
||||||
} \
|
|
||||||
groupPos--; \
|
|
||||||
zn = gMinlen; \
|
|
||||||
GET_BITS(label1, zvec, zn); \
|
|
||||||
while (1) { \
|
|
||||||
if (zn > 20 /* the longest code */) \
|
|
||||||
RETURN(BZ_DATA_ERROR); \
|
|
||||||
if (zvec <= gLimit[zn]) break; \
|
|
||||||
zn++; \
|
|
||||||
GET_BIT(label2, zj); \
|
|
||||||
zvec = (zvec << 1) | zj; \
|
|
||||||
}; \
|
|
||||||
if (zvec - gBase[zn] < 0 \
|
|
||||||
|| zvec - gBase[zn] >= BZ_MAX_ALPHA_SIZE) \
|
|
||||||
RETURN(BZ_DATA_ERROR); \
|
|
||||||
lval = gPerm[zvec - gBase[zn]]; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
Int32 BZ2_decompress ( DState* s )
|
|
||||||
{
|
|
||||||
UChar uc;
|
|
||||||
Int32 retVal;
|
|
||||||
Int32 minLen, maxLen;
|
|
||||||
bz_stream* strm = s->strm;
|
|
||||||
|
|
||||||
/* stuff that needs to be saved/restored */
|
|
||||||
Int32 i;
|
|
||||||
Int32 j;
|
|
||||||
Int32 t;
|
|
||||||
Int32 alphaSize;
|
|
||||||
Int32 nGroups;
|
|
||||||
Int32 nSelectors;
|
|
||||||
Int32 EOB;
|
|
||||||
Int32 groupNo;
|
|
||||||
Int32 groupPos;
|
|
||||||
Int32 nextSym;
|
|
||||||
Int32 nblockMAX;
|
|
||||||
Int32 nblock;
|
|
||||||
Int32 es;
|
|
||||||
Int32 N;
|
|
||||||
Int32 curr;
|
|
||||||
Int32 zt;
|
|
||||||
Int32 zn;
|
|
||||||
Int32 zvec;
|
|
||||||
Int32 zj;
|
|
||||||
Int32 gSel;
|
|
||||||
Int32 gMinlen;
|
|
||||||
Int32* gLimit;
|
|
||||||
Int32* gBase;
|
|
||||||
Int32* gPerm;
|
|
||||||
|
|
||||||
if (s->state == BZ_X_MAGIC_1) {
|
|
||||||
/*initialise the save area*/
|
|
||||||
s->save_i = 0;
|
|
||||||
s->save_j = 0;
|
|
||||||
s->save_t = 0;
|
|
||||||
s->save_alphaSize = 0;
|
|
||||||
s->save_nGroups = 0;
|
|
||||||
s->save_nSelectors = 0;
|
|
||||||
s->save_EOB = 0;
|
|
||||||
s->save_groupNo = 0;
|
|
||||||
s->save_groupPos = 0;
|
|
||||||
s->save_nextSym = 0;
|
|
||||||
s->save_nblockMAX = 0;
|
|
||||||
s->save_nblock = 0;
|
|
||||||
s->save_es = 0;
|
|
||||||
s->save_N = 0;
|
|
||||||
s->save_curr = 0;
|
|
||||||
s->save_zt = 0;
|
|
||||||
s->save_zn = 0;
|
|
||||||
s->save_zvec = 0;
|
|
||||||
s->save_zj = 0;
|
|
||||||
s->save_gSel = 0;
|
|
||||||
s->save_gMinlen = 0;
|
|
||||||
s->save_gLimit = NULL;
|
|
||||||
s->save_gBase = NULL;
|
|
||||||
s->save_gPerm = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*restore from the save area*/
|
|
||||||
i = s->save_i;
|
|
||||||
j = s->save_j;
|
|
||||||
t = s->save_t;
|
|
||||||
alphaSize = s->save_alphaSize;
|
|
||||||
nGroups = s->save_nGroups;
|
|
||||||
nSelectors = s->save_nSelectors;
|
|
||||||
EOB = s->save_EOB;
|
|
||||||
groupNo = s->save_groupNo;
|
|
||||||
groupPos = s->save_groupPos;
|
|
||||||
nextSym = s->save_nextSym;
|
|
||||||
nblockMAX = s->save_nblockMAX;
|
|
||||||
nblock = s->save_nblock;
|
|
||||||
es = s->save_es;
|
|
||||||
N = s->save_N;
|
|
||||||
curr = s->save_curr;
|
|
||||||
zt = s->save_zt;
|
|
||||||
zn = s->save_zn;
|
|
||||||
zvec = s->save_zvec;
|
|
||||||
zj = s->save_zj;
|
|
||||||
gSel = s->save_gSel;
|
|
||||||
gMinlen = s->save_gMinlen;
|
|
||||||
gLimit = s->save_gLimit;
|
|
||||||
gBase = s->save_gBase;
|
|
||||||
gPerm = s->save_gPerm;
|
|
||||||
|
|
||||||
retVal = BZ_OK;
|
|
||||||
|
|
||||||
switch (s->state) {
|
|
||||||
|
|
||||||
GET_UCHAR(BZ_X_MAGIC_1, uc);
|
|
||||||
if (uc != BZ_HDR_B) RETURN(BZ_DATA_ERROR_MAGIC);
|
|
||||||
|
|
||||||
GET_UCHAR(BZ_X_MAGIC_2, uc);
|
|
||||||
if (uc != BZ_HDR_Z) RETURN(BZ_DATA_ERROR_MAGIC);
|
|
||||||
|
|
||||||
GET_UCHAR(BZ_X_MAGIC_3, uc)
|
|
||||||
if (uc != BZ_HDR_h) RETURN(BZ_DATA_ERROR_MAGIC);
|
|
||||||
|
|
||||||
GET_BITS(BZ_X_MAGIC_4, s->blockSize100k, 8)
|
|
||||||
if (s->blockSize100k < (BZ_HDR_0 + 1) ||
|
|
||||||
s->blockSize100k > (BZ_HDR_0 + 9)) RETURN(BZ_DATA_ERROR_MAGIC);
|
|
||||||
s->blockSize100k -= BZ_HDR_0;
|
|
||||||
|
|
||||||
if (s->smallDecompress) {
|
|
||||||
s->ll16 = BZALLOC( s->blockSize100k * 100000 * sizeof(UInt16) );
|
|
||||||
s->ll4 = BZALLOC(
|
|
||||||
((1 + s->blockSize100k * 100000) >> 1) * sizeof(UChar)
|
|
||||||
);
|
|
||||||
if (s->ll16 == NULL || s->ll4 == NULL) RETURN(BZ_MEM_ERROR);
|
|
||||||
} else {
|
|
||||||
s->tt = BZALLOC( s->blockSize100k * 100000 * sizeof(Int32) );
|
|
||||||
if (s->tt == NULL) RETURN(BZ_MEM_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_1, uc);
|
|
||||||
|
|
||||||
if (uc == 0x17) goto endhdr_2;
|
|
||||||
if (uc != 0x31) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_2, uc);
|
|
||||||
if (uc != 0x41) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_3, uc);
|
|
||||||
if (uc != 0x59) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_4, uc);
|
|
||||||
if (uc != 0x26) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_5, uc);
|
|
||||||
if (uc != 0x53) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_BLKHDR_6, uc);
|
|
||||||
if (uc != 0x59) RETURN(BZ_DATA_ERROR);
|
|
||||||
|
|
||||||
s->currBlockNo++;
|
|
||||||
if (s->verbosity >= 2)
|
|
||||||
VPrintf1 ( "\n [%d: huff+mtf ", s->currBlockNo );
|
|
||||||
|
|
||||||
s->storedBlockCRC = 0;
|
|
||||||
GET_UCHAR(BZ_X_BCRC_1, uc);
|
|
||||||
s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_BCRC_2, uc);
|
|
||||||
s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_BCRC_3, uc);
|
|
||||||
s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_BCRC_4, uc);
|
|
||||||
s->storedBlockCRC = (s->storedBlockCRC << 8) | ((UInt32)uc);
|
|
||||||
|
|
||||||
GET_BITS(BZ_X_RANDBIT, s->blockRandomised, 1);
|
|
||||||
|
|
||||||
s->origPtr = 0;
|
|
||||||
GET_UCHAR(BZ_X_ORIGPTR_1, uc);
|
|
||||||
s->origPtr = (s->origPtr << 8) | ((Int32)uc);
|
|
||||||
GET_UCHAR(BZ_X_ORIGPTR_2, uc);
|
|
||||||
s->origPtr = (s->origPtr << 8) | ((Int32)uc);
|
|
||||||
GET_UCHAR(BZ_X_ORIGPTR_3, uc);
|
|
||||||
s->origPtr = (s->origPtr << 8) | ((Int32)uc);
|
|
||||||
|
|
||||||
if (s->origPtr < 0)
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
if (s->origPtr > 10 + 100000*s->blockSize100k)
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
|
|
||||||
/*--- Receive the mapping table ---*/
|
|
||||||
for (i = 0; i < 16; i++) {
|
|
||||||
GET_BIT(BZ_X_MAPPING_1, uc);
|
|
||||||
if (uc == 1)
|
|
||||||
s->inUse16[i] = True; else
|
|
||||||
s->inUse16[i] = False;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 256; i++) s->inUse[i] = False;
|
|
||||||
|
|
||||||
for (i = 0; i < 16; i++)
|
|
||||||
if (s->inUse16[i])
|
|
||||||
for (j = 0; j < 16; j++) {
|
|
||||||
GET_BIT(BZ_X_MAPPING_2, uc);
|
|
||||||
if (uc == 1) s->inUse[i * 16 + j] = True;
|
|
||||||
}
|
|
||||||
makeMaps_d ( s );
|
|
||||||
if (s->nInUse == 0) RETURN(BZ_DATA_ERROR);
|
|
||||||
alphaSize = s->nInUse+2;
|
|
||||||
|
|
||||||
/*--- Now the selectors ---*/
|
|
||||||
GET_BITS(BZ_X_SELECTOR_1, nGroups, 3);
|
|
||||||
if (nGroups < 2 || nGroups > 6) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_BITS(BZ_X_SELECTOR_2, nSelectors, 15);
|
|
||||||
if (nSelectors < 1) RETURN(BZ_DATA_ERROR);
|
|
||||||
for (i = 0; i < nSelectors; i++) {
|
|
||||||
j = 0;
|
|
||||||
while (True) {
|
|
||||||
GET_BIT(BZ_X_SELECTOR_3, uc);
|
|
||||||
if (uc == 0) break;
|
|
||||||
j++;
|
|
||||||
if (j >= nGroups) RETURN(BZ_DATA_ERROR);
|
|
||||||
}
|
|
||||||
s->selectorMtf[i] = j;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Undo the MTF values for the selectors. ---*/
|
|
||||||
{
|
|
||||||
UChar pos[BZ_N_GROUPS], tmp, v;
|
|
||||||
for (v = 0; v < nGroups; v++) pos[v] = v;
|
|
||||||
|
|
||||||
for (i = 0; i < nSelectors; i++) {
|
|
||||||
v = s->selectorMtf[i];
|
|
||||||
tmp = pos[v];
|
|
||||||
while (v > 0) { pos[v] = pos[v-1]; v--; }
|
|
||||||
pos[0] = tmp;
|
|
||||||
s->selector[i] = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Now the coding tables ---*/
|
|
||||||
for (t = 0; t < nGroups; t++) {
|
|
||||||
GET_BITS(BZ_X_CODING_1, curr, 5);
|
|
||||||
for (i = 0; i < alphaSize; i++) {
|
|
||||||
while (True) {
|
|
||||||
if (curr < 1 || curr > 20) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_BIT(BZ_X_CODING_2, uc);
|
|
||||||
if (uc == 0) break;
|
|
||||||
GET_BIT(BZ_X_CODING_3, uc);
|
|
||||||
if (uc == 0) curr++; else curr--;
|
|
||||||
}
|
|
||||||
s->len[t][i] = curr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Create the Huffman decoding tables ---*/
|
|
||||||
for (t = 0; t < nGroups; t++) {
|
|
||||||
minLen = 32;
|
|
||||||
maxLen = 0;
|
|
||||||
for (i = 0; i < alphaSize; i++) {
|
|
||||||
if (s->len[t][i] > maxLen) maxLen = s->len[t][i];
|
|
||||||
if (s->len[t][i] < minLen) minLen = s->len[t][i];
|
|
||||||
}
|
|
||||||
BZ2_hbCreateDecodeTables (
|
|
||||||
&(s->limit[t][0]),
|
|
||||||
&(s->base[t][0]),
|
|
||||||
&(s->perm[t][0]),
|
|
||||||
&(s->len[t][0]),
|
|
||||||
minLen, maxLen, alphaSize
|
|
||||||
);
|
|
||||||
s->minLens[t] = minLen;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*--- Now the MTF values ---*/
|
|
||||||
|
|
||||||
EOB = s->nInUse+1;
|
|
||||||
nblockMAX = 100000 * s->blockSize100k;
|
|
||||||
groupNo = -1;
|
|
||||||
groupPos = 0;
|
|
||||||
|
|
||||||
for (i = 0; i <= 255; i++) s->unzftab[i] = 0;
|
|
||||||
|
|
||||||
/*-- MTF init --*/
|
|
||||||
{
|
|
||||||
Int32 ii, jj, kk;
|
|
||||||
kk = MTFA_SIZE-1;
|
|
||||||
for (ii = 256 / MTFL_SIZE - 1; ii >= 0; ii--) {
|
|
||||||
for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
|
|
||||||
s->mtfa[kk] = (UChar)(ii * MTFL_SIZE + jj);
|
|
||||||
kk--;
|
|
||||||
}
|
|
||||||
s->mtfbase[ii] = kk + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-- end MTF init --*/
|
|
||||||
|
|
||||||
nblock = 0;
|
|
||||||
GET_MTF_VAL(BZ_X_MTF_1, BZ_X_MTF_2, nextSym);
|
|
||||||
|
|
||||||
while (True) {
|
|
||||||
|
|
||||||
if (nextSym == EOB) break;
|
|
||||||
|
|
||||||
if (nextSym == BZ_RUNA || nextSym == BZ_RUNB) {
|
|
||||||
|
|
||||||
es = -1;
|
|
||||||
N = 1;
|
|
||||||
do {
|
|
||||||
/* Check that N doesn't get too big, so that es doesn't
|
|
||||||
go negative. The maximum value that can be
|
|
||||||
RUNA/RUNB encoded is equal to the block size (post
|
|
||||||
the initial RLE), viz, 900k, so bounding N at 2
|
|
||||||
million should guard against overflow without
|
|
||||||
rejecting any legitimate inputs. */
|
|
||||||
if (N >= 2*1024*1024) RETURN(BZ_DATA_ERROR);
|
|
||||||
if (nextSym == BZ_RUNA) es = es + (0+1) * N; else
|
|
||||||
if (nextSym == BZ_RUNB) es = es + (1+1) * N;
|
|
||||||
N = N * 2;
|
|
||||||
GET_MTF_VAL(BZ_X_MTF_3, BZ_X_MTF_4, nextSym);
|
|
||||||
}
|
|
||||||
while (nextSym == BZ_RUNA || nextSym == BZ_RUNB);
|
|
||||||
|
|
||||||
es++;
|
|
||||||
uc = s->seqToUnseq[ s->mtfa[s->mtfbase[0]] ];
|
|
||||||
s->unzftab[uc] += es;
|
|
||||||
|
|
||||||
if (s->smallDecompress)
|
|
||||||
while (es > 0) {
|
|
||||||
if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
|
|
||||||
s->ll16[nblock] = (UInt16)uc;
|
|
||||||
nblock++;
|
|
||||||
es--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
while (es > 0) {
|
|
||||||
if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
|
|
||||||
s->tt[nblock] = (UInt32)uc;
|
|
||||||
nblock++;
|
|
||||||
es--;
|
|
||||||
};
|
|
||||||
|
|
||||||
continue;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
if (nblock >= nblockMAX) RETURN(BZ_DATA_ERROR);
|
|
||||||
|
|
||||||
/*-- uc = MTF ( nextSym-1 ) --*/
|
|
||||||
{
|
|
||||||
Int32 ii, jj, kk, pp, lno, off;
|
|
||||||
UInt32 nn;
|
|
||||||
nn = (UInt32)(nextSym - 1);
|
|
||||||
|
|
||||||
if (nn < MTFL_SIZE) {
|
|
||||||
/* avoid general-case expense */
|
|
||||||
pp = s->mtfbase[0];
|
|
||||||
uc = s->mtfa[pp+nn];
|
|
||||||
while (nn > 3) {
|
|
||||||
Int32 z = pp+nn;
|
|
||||||
s->mtfa[(z) ] = s->mtfa[(z)-1];
|
|
||||||
s->mtfa[(z)-1] = s->mtfa[(z)-2];
|
|
||||||
s->mtfa[(z)-2] = s->mtfa[(z)-3];
|
|
||||||
s->mtfa[(z)-3] = s->mtfa[(z)-4];
|
|
||||||
nn -= 4;
|
|
||||||
}
|
|
||||||
while (nn > 0) {
|
|
||||||
s->mtfa[(pp+nn)] = s->mtfa[(pp+nn)-1]; nn--;
|
|
||||||
};
|
|
||||||
s->mtfa[pp] = uc;
|
|
||||||
} else {
|
|
||||||
/* general case */
|
|
||||||
lno = nn / MTFL_SIZE;
|
|
||||||
off = nn % MTFL_SIZE;
|
|
||||||
pp = s->mtfbase[lno] + off;
|
|
||||||
uc = s->mtfa[pp];
|
|
||||||
while (pp > s->mtfbase[lno]) {
|
|
||||||
s->mtfa[pp] = s->mtfa[pp-1]; pp--;
|
|
||||||
};
|
|
||||||
s->mtfbase[lno]++;
|
|
||||||
while (lno > 0) {
|
|
||||||
s->mtfbase[lno]--;
|
|
||||||
s->mtfa[s->mtfbase[lno]]
|
|
||||||
= s->mtfa[s->mtfbase[lno-1] + MTFL_SIZE - 1];
|
|
||||||
lno--;
|
|
||||||
}
|
|
||||||
s->mtfbase[0]--;
|
|
||||||
s->mtfa[s->mtfbase[0]] = uc;
|
|
||||||
if (s->mtfbase[0] == 0) {
|
|
||||||
kk = MTFA_SIZE-1;
|
|
||||||
for (ii = 256 / MTFL_SIZE-1; ii >= 0; ii--) {
|
|
||||||
for (jj = MTFL_SIZE-1; jj >= 0; jj--) {
|
|
||||||
s->mtfa[kk] = s->mtfa[s->mtfbase[ii] + jj];
|
|
||||||
kk--;
|
|
||||||
}
|
|
||||||
s->mtfbase[ii] = kk + 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*-- end uc = MTF ( nextSym-1 ) --*/
|
|
||||||
|
|
||||||
s->unzftab[s->seqToUnseq[uc]]++;
|
|
||||||
if (s->smallDecompress)
|
|
||||||
s->ll16[nblock] = (UInt16)(s->seqToUnseq[uc]); else
|
|
||||||
s->tt[nblock] = (UInt32)(s->seqToUnseq[uc]);
|
|
||||||
nblock++;
|
|
||||||
|
|
||||||
GET_MTF_VAL(BZ_X_MTF_5, BZ_X_MTF_6, nextSym);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now we know what nblock is, we can do a better sanity
|
|
||||||
check on s->origPtr.
|
|
||||||
*/
|
|
||||||
if (s->origPtr < 0 || s->origPtr >= nblock)
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
|
|
||||||
/*-- Set up cftab to facilitate generation of T^(-1) --*/
|
|
||||||
/* Check: unzftab entries in range. */
|
|
||||||
for (i = 0; i <= 255; i++) {
|
|
||||||
if (s->unzftab[i] < 0 || s->unzftab[i] > nblock)
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
}
|
|
||||||
/* Actually generate cftab. */
|
|
||||||
s->cftab[0] = 0;
|
|
||||||
for (i = 1; i <= 256; i++) s->cftab[i] = s->unzftab[i-1];
|
|
||||||
for (i = 1; i <= 256; i++) s->cftab[i] += s->cftab[i-1];
|
|
||||||
/* Check: cftab entries in range. */
|
|
||||||
for (i = 0; i <= 256; i++) {
|
|
||||||
if (s->cftab[i] < 0 || s->cftab[i] > nblock) {
|
|
||||||
/* s->cftab[i] can legitimately be == nblock */
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Check: cftab entries non-descending. */
|
|
||||||
for (i = 1; i <= 256; i++) {
|
|
||||||
if (s->cftab[i-1] > s->cftab[i]) {
|
|
||||||
RETURN(BZ_DATA_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s->state_out_len = 0;
|
|
||||||
s->state_out_ch = 0;
|
|
||||||
BZ_INITIALISE_CRC ( s->calculatedBlockCRC );
|
|
||||||
s->state = BZ_X_OUTPUT;
|
|
||||||
if (s->verbosity >= 2) VPrintf0 ( "rt+rld" );
|
|
||||||
|
|
||||||
if (s->smallDecompress) {
|
|
||||||
|
|
||||||
/*-- Make a copy of cftab, used in generation of T --*/
|
|
||||||
for (i = 0; i <= 256; i++) s->cftabCopy[i] = s->cftab[i];
|
|
||||||
|
|
||||||
/*-- compute the T vector --*/
|
|
||||||
for (i = 0; i < nblock; i++) {
|
|
||||||
uc = (UChar)(s->ll16[i]);
|
|
||||||
SET_LL(i, s->cftabCopy[uc]);
|
|
||||||
s->cftabCopy[uc]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*-- Compute T^(-1) by pointer reversal on T --*/
|
|
||||||
i = s->origPtr;
|
|
||||||
j = GET_LL(i);
|
|
||||||
do {
|
|
||||||
Int32 tmp = GET_LL(j);
|
|
||||||
SET_LL(j, i);
|
|
||||||
i = j;
|
|
||||||
j = tmp;
|
|
||||||
}
|
|
||||||
while (i != s->origPtr);
|
|
||||||
|
|
||||||
s->tPos = s->origPtr;
|
|
||||||
s->nblock_used = 0;
|
|
||||||
if (s->blockRandomised) {
|
|
||||||
BZ_RAND_INIT_MASK;
|
|
||||||
BZ_GET_SMALL(s->k0); s->nblock_used++;
|
|
||||||
BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
|
|
||||||
} else {
|
|
||||||
BZ_GET_SMALL(s->k0); s->nblock_used++;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
/*-- compute the T^(-1) vector --*/
|
|
||||||
for (i = 0; i < nblock; i++) {
|
|
||||||
uc = (UChar)(s->tt[i] & 0xff);
|
|
||||||
s->tt[s->cftab[uc]] |= (i << 8);
|
|
||||||
s->cftab[uc]++;
|
|
||||||
}
|
|
||||||
|
|
||||||
s->tPos = s->tt[s->origPtr] >> 8;
|
|
||||||
s->nblock_used = 0;
|
|
||||||
if (s->blockRandomised) {
|
|
||||||
BZ_RAND_INIT_MASK;
|
|
||||||
BZ_GET_FAST(s->k0); s->nblock_used++;
|
|
||||||
BZ_RAND_UPD_MASK; s->k0 ^= BZ_RAND_MASK;
|
|
||||||
} else {
|
|
||||||
BZ_GET_FAST(s->k0); s->nblock_used++;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
RETURN(BZ_OK);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
endhdr_2:
|
|
||||||
|
|
||||||
GET_UCHAR(BZ_X_ENDHDR_2, uc);
|
|
||||||
if (uc != 0x72) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_ENDHDR_3, uc);
|
|
||||||
if (uc != 0x45) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_ENDHDR_4, uc);
|
|
||||||
if (uc != 0x38) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_ENDHDR_5, uc);
|
|
||||||
if (uc != 0x50) RETURN(BZ_DATA_ERROR);
|
|
||||||
GET_UCHAR(BZ_X_ENDHDR_6, uc);
|
|
||||||
if (uc != 0x90) RETURN(BZ_DATA_ERROR);
|
|
||||||
|
|
||||||
s->storedCombinedCRC = 0;
|
|
||||||
GET_UCHAR(BZ_X_CCRC_1, uc);
|
|
||||||
s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_CCRC_2, uc);
|
|
||||||
s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_CCRC_3, uc);
|
|
||||||
s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
|
|
||||||
GET_UCHAR(BZ_X_CCRC_4, uc);
|
|
||||||
s->storedCombinedCRC = (s->storedCombinedCRC << 8) | ((UInt32)uc);
|
|
||||||
|
|
||||||
s->state = BZ_X_IDLE;
|
|
||||||
RETURN(BZ_STREAM_END);
|
|
||||||
|
|
||||||
default: AssertH ( False, 4001 );
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertH ( False, 4002 );
|
|
||||||
|
|
||||||
save_state_and_return:
|
|
||||||
|
|
||||||
s->save_i = i;
|
|
||||||
s->save_j = j;
|
|
||||||
s->save_t = t;
|
|
||||||
s->save_alphaSize = alphaSize;
|
|
||||||
s->save_nGroups = nGroups;
|
|
||||||
s->save_nSelectors = nSelectors;
|
|
||||||
s->save_EOB = EOB;
|
|
||||||
s->save_groupNo = groupNo;
|
|
||||||
s->save_groupPos = groupPos;
|
|
||||||
s->save_nextSym = nextSym;
|
|
||||||
s->save_nblockMAX = nblockMAX;
|
|
||||||
s->save_nblock = nblock;
|
|
||||||
s->save_es = es;
|
|
||||||
s->save_N = N;
|
|
||||||
s->save_curr = curr;
|
|
||||||
s->save_zt = zt;
|
|
||||||
s->save_zn = zn;
|
|
||||||
s->save_zvec = zvec;
|
|
||||||
s->save_zj = zj;
|
|
||||||
s->save_gSel = gSel;
|
|
||||||
s->save_gMinlen = gMinlen;
|
|
||||||
s->save_gLimit = gLimit;
|
|
||||||
s->save_gBase = gBase;
|
|
||||||
s->save_gPerm = gPerm;
|
|
||||||
|
|
||||||
return retVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end decompress.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,175 +0,0 @@
|
|||||||
/*
|
|
||||||
minibz2
|
|
||||||
libbz2.dll test program.
|
|
||||||
by Yoshioka Tsuneo (tsuneo@rr.iij4u.or.jp)
|
|
||||||
This file is Public Domain. Welcome any email to me.
|
|
||||||
|
|
||||||
usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define BZ_IMPORT
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include "bzlib.h"
|
|
||||||
#ifdef _WIN32
|
|
||||||
#include <io.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
|
|
||||||
#define BZ2_LIBNAME "libbz2-1.0.2.DLL"
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
static int BZ2DLLLoaded = 0;
|
|
||||||
static HINSTANCE BZ2DLLhLib;
|
|
||||||
int BZ2DLLLoadLibrary(void)
|
|
||||||
{
|
|
||||||
HINSTANCE hLib;
|
|
||||||
|
|
||||||
if(BZ2DLLLoaded==1){return 0;}
|
|
||||||
hLib=LoadLibrary(BZ2_LIBNAME);
|
|
||||||
if(hLib == NULL){
|
|
||||||
fprintf(stderr,"Can't load %s\n",BZ2_LIBNAME);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
BZ2_bzlibVersion=GetProcAddress(hLib,"BZ2_bzlibVersion");
|
|
||||||
BZ2_bzopen=GetProcAddress(hLib,"BZ2_bzopen");
|
|
||||||
BZ2_bzdopen=GetProcAddress(hLib,"BZ2_bzdopen");
|
|
||||||
BZ2_bzread=GetProcAddress(hLib,"BZ2_bzread");
|
|
||||||
BZ2_bzwrite=GetProcAddress(hLib,"BZ2_bzwrite");
|
|
||||||
BZ2_bzflush=GetProcAddress(hLib,"BZ2_bzflush");
|
|
||||||
BZ2_bzclose=GetProcAddress(hLib,"BZ2_bzclose");
|
|
||||||
BZ2_bzerror=GetProcAddress(hLib,"BZ2_bzerror");
|
|
||||||
|
|
||||||
if (!BZ2_bzlibVersion || !BZ2_bzopen || !BZ2_bzdopen
|
|
||||||
|| !BZ2_bzread || !BZ2_bzwrite || !BZ2_bzflush
|
|
||||||
|| !BZ2_bzclose || !BZ2_bzerror) {
|
|
||||||
fprintf(stderr,"GetProcAddress failed.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
BZ2DLLLoaded=1;
|
|
||||||
BZ2DLLhLib=hLib;
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
}
|
|
||||||
int BZ2DLLFreeLibrary(void)
|
|
||||||
{
|
|
||||||
if(BZ2DLLLoaded==0){return 0;}
|
|
||||||
FreeLibrary(BZ2DLLhLib);
|
|
||||||
BZ2DLLLoaded=0;
|
|
||||||
}
|
|
||||||
#endif /* WIN32 */
|
|
||||||
|
|
||||||
void usage(void)
|
|
||||||
{
|
|
||||||
puts("usage: minibz2 [-d] [-{1,2,..9}] [[srcfilename] destfilename]");
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc,char *argv[])
|
|
||||||
{
|
|
||||||
int decompress = 0;
|
|
||||||
int level = 9;
|
|
||||||
char *fn_r = NULL;
|
|
||||||
char *fn_w = NULL;
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
if(BZ2DLLLoadLibrary()<0){
|
|
||||||
fprintf(stderr,"Loading of %s failed. Giving up.\n", BZ2_LIBNAME);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
printf("Loading of %s succeeded. Library version is %s.\n",
|
|
||||||
BZ2_LIBNAME, BZ2_bzlibVersion() );
|
|
||||||
#endif
|
|
||||||
while(++argv,--argc){
|
|
||||||
if(**argv =='-' || **argv=='/'){
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
for(p=*argv+1;*p;p++){
|
|
||||||
if(*p=='d'){
|
|
||||||
decompress = 1;
|
|
||||||
}else if('1'<=*p && *p<='9'){
|
|
||||||
level = *p - '0';
|
|
||||||
}else{
|
|
||||||
usage();
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(argc>=1){
|
|
||||||
fn_r = *argv;
|
|
||||||
argc--;argv++;
|
|
||||||
}else{
|
|
||||||
fn_r = NULL;
|
|
||||||
}
|
|
||||||
if(argc>=1){
|
|
||||||
fn_w = *argv;
|
|
||||||
argc--;argv++;
|
|
||||||
}else{
|
|
||||||
fn_w = NULL;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
int len;
|
|
||||||
char buff[0x1000];
|
|
||||||
char mode[10];
|
|
||||||
|
|
||||||
if(decompress){
|
|
||||||
BZFILE *BZ2fp_r = NULL;
|
|
||||||
FILE *fp_w = NULL;
|
|
||||||
|
|
||||||
if(fn_w){
|
|
||||||
if((fp_w = fopen(fn_w,"wb"))==NULL){
|
|
||||||
printf("can't open [%s]\n",fn_w);
|
|
||||||
perror("reason:");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
fp_w = stdout;
|
|
||||||
}
|
|
||||||
if((fn_r == NULL && (BZ2fp_r = BZ2_bzdopen(fileno(stdin),"rb"))==NULL)
|
|
||||||
|| (fn_r != NULL && (BZ2fp_r = BZ2_bzopen(fn_r,"rb"))==NULL)){
|
|
||||||
printf("can't bz2openstream\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
while((len=BZ2_bzread(BZ2fp_r,buff,0x1000))>0){
|
|
||||||
fwrite(buff,1,len,fp_w);
|
|
||||||
}
|
|
||||||
BZ2_bzclose(BZ2fp_r);
|
|
||||||
if(fp_w != stdout) fclose(fp_w);
|
|
||||||
}else{
|
|
||||||
BZFILE *BZ2fp_w = NULL;
|
|
||||||
FILE *fp_r = NULL;
|
|
||||||
|
|
||||||
if(fn_r){
|
|
||||||
if((fp_r = fopen(fn_r,"rb"))==NULL){
|
|
||||||
printf("can't open [%s]\n",fn_r);
|
|
||||||
perror("reason:");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}else{
|
|
||||||
fp_r = stdin;
|
|
||||||
}
|
|
||||||
mode[0]='w';
|
|
||||||
mode[1] = '0' + level;
|
|
||||||
mode[2] = '\0';
|
|
||||||
|
|
||||||
if((fn_w == NULL && (BZ2fp_w = BZ2_bzdopen(fileno(stdout),mode))==NULL)
|
|
||||||
|| (fn_w !=NULL && (BZ2fp_w = BZ2_bzopen(fn_w,mode))==NULL)){
|
|
||||||
printf("can't bz2openstream\n");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
while((len=fread(buff,1,0x1000,fp_r))>0){
|
|
||||||
BZ2_bzwrite(BZ2fp_w,buff,len);
|
|
||||||
}
|
|
||||||
BZ2_bzclose(BZ2fp_w);
|
|
||||||
if(fp_r!=stdin)fclose(fp_r);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#ifdef _WIN32
|
|
||||||
BZ2DLLFreeLibrary();
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,93 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="dlltest" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 5.00
|
|
||||||
# ** 編集しないでください **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Console Application" 0x0103
|
|
||||||
|
|
||||||
CFG=dlltest - Win32 Debug
|
|
||||||
!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。
|
|
||||||
!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "dlltest.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE の実行時に構成を指定できます
|
|
||||||
!MESSAGE コマンド ライン上でマクロの設定を定義します。例:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "dlltest.mak" CFG="dlltest - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE 選択可能なビルド モード:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "dlltest - Win32 Release" ("Win32 (x86) Console Application" 用)
|
|
||||||
!MESSAGE "dlltest - Win32 Debug" ("Win32 (x86) Console Application" 用)
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "dlltest - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x411 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x411 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"minibz2.exe"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "dlltest - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "dlltest_"
|
|
||||||
# PROP BASE Intermediate_Dir "dlltest_"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "dlltest_"
|
|
||||||
# PROP Intermediate_Dir "dlltest_"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x411 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x411 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /out:"minibz2.exe" /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "dlltest - Win32 Release"
|
|
||||||
# Name "dlltest - Win32 Debug"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\bzlib.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\dlltest.c
|
|
||||||
# End Source File
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
@ -1,9 +0,0 @@
|
|||||||
<!-- misc. strings -->
|
|
||||||
<!ENTITY bz-url "http://www.bzip.org">
|
|
||||||
<!ENTITY bz-email "jseward@bzip.org">
|
|
||||||
<!ENTITY bz-lifespan "1996-2010">
|
|
||||||
|
|
||||||
<!ENTITY bz-version "1.0.6">
|
|
||||||
<!ENTITY bz-date "6 September 2010">
|
|
||||||
|
|
||||||
<!ENTITY manual-title "bzip2 Manual">
|
|
@ -1,68 +0,0 @@
|
|||||||
#!/usr/bin/perl -w
|
|
||||||
#
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
# This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
# lossless, block-sorting data compression.
|
|
||||||
#
|
|
||||||
# bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
#
|
|
||||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
# README file.
|
|
||||||
#
|
|
||||||
# This program is released under the terms of the license contained
|
|
||||||
# in the file LICENSE.
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
#
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
# get command line values:
|
|
||||||
if ( $#ARGV !=1 ) {
|
|
||||||
die "Usage: $0 xml_infile xml_outfile\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
my $infile = shift;
|
|
||||||
# check infile exists
|
|
||||||
die "Can't find file \"$infile\""
|
|
||||||
unless -f $infile;
|
|
||||||
# check we can read infile
|
|
||||||
if (! -r $infile) {
|
|
||||||
die "Can't read input $infile\n";
|
|
||||||
}
|
|
||||||
# check we can open infile
|
|
||||||
open( INFILE,"<$infile" ) or
|
|
||||||
die "Can't input $infile $!";
|
|
||||||
|
|
||||||
#my $outfile = 'fmt-manual.xml';
|
|
||||||
my $outfile = shift;
|
|
||||||
#print "Infile: $infile, Outfile: $outfile\n";
|
|
||||||
# check we can write to outfile
|
|
||||||
open( OUTFILE,">$outfile" ) or
|
|
||||||
die "Can't output $outfile $! for writing";
|
|
||||||
|
|
||||||
my ($prev, $curr, $str);
|
|
||||||
$prev = ''; $curr = '';
|
|
||||||
while ( <INFILE> ) {
|
|
||||||
|
|
||||||
print OUTFILE $prev;
|
|
||||||
$prev = $curr;
|
|
||||||
$curr = $_;
|
|
||||||
$str = '';
|
|
||||||
|
|
||||||
if ( $prev =~ /<programlisting>$|<screen>$/ ) {
|
|
||||||
chomp $prev;
|
|
||||||
$curr = join( '', $prev, "<![CDATA[", $curr );
|
|
||||||
$prev = '';
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
elsif ( $curr =~ /<\/programlisting>|<\/screen>/ ) {
|
|
||||||
chomp $prev;
|
|
||||||
$curr = join( '', $prev, "]]>", $curr );
|
|
||||||
$prev = '';
|
|
||||||
next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
print OUTFILE $curr;
|
|
||||||
close INFILE;
|
|
||||||
close OUTFILE;
|
|
||||||
exit;
|
|
@ -1,205 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Huffman coding low-level stuff ---*/
|
|
||||||
/*--- huffman.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include "bzlib_private.h"
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
#define WEIGHTOF(zz0) ((zz0) & 0xffffff00)
|
|
||||||
#define DEPTHOF(zz1) ((zz1) & 0x000000ff)
|
|
||||||
#define MYMAX(zz2,zz3) ((zz2) > (zz3) ? (zz2) : (zz3))
|
|
||||||
|
|
||||||
#define ADDWEIGHTS(zw1,zw2) \
|
|
||||||
(WEIGHTOF(zw1)+WEIGHTOF(zw2)) | \
|
|
||||||
(1 + MYMAX(DEPTHOF(zw1),DEPTHOF(zw2)))
|
|
||||||
|
|
||||||
#define UPHEAP(z) \
|
|
||||||
{ \
|
|
||||||
Int32 zz, tmp; \
|
|
||||||
zz = z; tmp = heap[zz]; \
|
|
||||||
while (weight[tmp] < weight[heap[zz >> 1]]) { \
|
|
||||||
heap[zz] = heap[zz >> 1]; \
|
|
||||||
zz >>= 1; \
|
|
||||||
} \
|
|
||||||
heap[zz] = tmp; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define DOWNHEAP(z) \
|
|
||||||
{ \
|
|
||||||
Int32 zz, yy, tmp; \
|
|
||||||
zz = z; tmp = heap[zz]; \
|
|
||||||
while (True) { \
|
|
||||||
yy = zz << 1; \
|
|
||||||
if (yy > nHeap) break; \
|
|
||||||
if (yy < nHeap && \
|
|
||||||
weight[heap[yy+1]] < weight[heap[yy]]) \
|
|
||||||
yy++; \
|
|
||||||
if (weight[tmp] < weight[heap[yy]]) break; \
|
|
||||||
heap[zz] = heap[yy]; \
|
|
||||||
zz = yy; \
|
|
||||||
} \
|
|
||||||
heap[zz] = tmp; \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
void BZ2_hbMakeCodeLengths ( UChar *len,
|
|
||||||
Int32 *freq,
|
|
||||||
Int32 alphaSize,
|
|
||||||
Int32 maxLen )
|
|
||||||
{
|
|
||||||
/*--
|
|
||||||
Nodes and heap entries run from 1. Entry 0
|
|
||||||
for both the heap and nodes is a sentinel.
|
|
||||||
--*/
|
|
||||||
Int32 nNodes, nHeap, n1, n2, i, j, k;
|
|
||||||
Bool tooLong;
|
|
||||||
|
|
||||||
Int32 heap [ BZ_MAX_ALPHA_SIZE + 2 ];
|
|
||||||
Int32 weight [ BZ_MAX_ALPHA_SIZE * 2 ];
|
|
||||||
Int32 parent [ BZ_MAX_ALPHA_SIZE * 2 ];
|
|
||||||
|
|
||||||
for (i = 0; i < alphaSize; i++)
|
|
||||||
weight[i+1] = (freq[i] == 0 ? 1 : freq[i]) << 8;
|
|
||||||
|
|
||||||
while (True) {
|
|
||||||
|
|
||||||
nNodes = alphaSize;
|
|
||||||
nHeap = 0;
|
|
||||||
|
|
||||||
heap[0] = 0;
|
|
||||||
weight[0] = 0;
|
|
||||||
parent[0] = -2;
|
|
||||||
|
|
||||||
for (i = 1; i <= alphaSize; i++) {
|
|
||||||
parent[i] = -1;
|
|
||||||
nHeap++;
|
|
||||||
heap[nHeap] = i;
|
|
||||||
UPHEAP(nHeap);
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertH( nHeap < (BZ_MAX_ALPHA_SIZE+2), 2001 );
|
|
||||||
|
|
||||||
while (nHeap > 1) {
|
|
||||||
n1 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
|
|
||||||
n2 = heap[1]; heap[1] = heap[nHeap]; nHeap--; DOWNHEAP(1);
|
|
||||||
nNodes++;
|
|
||||||
parent[n1] = parent[n2] = nNodes;
|
|
||||||
weight[nNodes] = ADDWEIGHTS(weight[n1], weight[n2]);
|
|
||||||
parent[nNodes] = -1;
|
|
||||||
nHeap++;
|
|
||||||
heap[nHeap] = nNodes;
|
|
||||||
UPHEAP(nHeap);
|
|
||||||
}
|
|
||||||
|
|
||||||
AssertH( nNodes < (BZ_MAX_ALPHA_SIZE * 2), 2002 );
|
|
||||||
|
|
||||||
tooLong = False;
|
|
||||||
for (i = 1; i <= alphaSize; i++) {
|
|
||||||
j = 0;
|
|
||||||
k = i;
|
|
||||||
while (parent[k] >= 0) { k = parent[k]; j++; }
|
|
||||||
len[i-1] = j;
|
|
||||||
if (j > maxLen) tooLong = True;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! tooLong) break;
|
|
||||||
|
|
||||||
/* 17 Oct 04: keep-going condition for the following loop used
|
|
||||||
to be 'i < alphaSize', which missed the last element,
|
|
||||||
theoretically leading to the possibility of the compressor
|
|
||||||
looping. However, this count-scaling step is only needed if
|
|
||||||
one of the generated Huffman code words is longer than
|
|
||||||
maxLen, which up to and including version 1.0.2 was 20 bits,
|
|
||||||
which is extremely unlikely. In version 1.0.3 maxLen was
|
|
||||||
changed to 17 bits, which has minimal effect on compression
|
|
||||||
ratio, but does mean this scaling step is used from time to
|
|
||||||
time, enough to verify that it works.
|
|
||||||
|
|
||||||
This means that bzip2-1.0.3 and later will only produce
|
|
||||||
Huffman codes with a maximum length of 17 bits. However, in
|
|
||||||
order to preserve backwards compatibility with bitstreams
|
|
||||||
produced by versions pre-1.0.3, the decompressor must still
|
|
||||||
handle lengths of up to 20. */
|
|
||||||
|
|
||||||
for (i = 1; i <= alphaSize; i++) {
|
|
||||||
j = weight[i] >> 8;
|
|
||||||
j = 1 + (j / 2);
|
|
||||||
weight[i] = j << 8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
void BZ2_hbAssignCodes ( Int32 *code,
|
|
||||||
UChar *length,
|
|
||||||
Int32 minLen,
|
|
||||||
Int32 maxLen,
|
|
||||||
Int32 alphaSize )
|
|
||||||
{
|
|
||||||
Int32 n, vec, i;
|
|
||||||
|
|
||||||
vec = 0;
|
|
||||||
for (n = minLen; n <= maxLen; n++) {
|
|
||||||
for (i = 0; i < alphaSize; i++)
|
|
||||||
if (length[i] == n) { code[i] = vec; vec++; };
|
|
||||||
vec <<= 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------*/
|
|
||||||
void BZ2_hbCreateDecodeTables ( Int32 *limit,
|
|
||||||
Int32 *base,
|
|
||||||
Int32 *perm,
|
|
||||||
UChar *length,
|
|
||||||
Int32 minLen,
|
|
||||||
Int32 maxLen,
|
|
||||||
Int32 alphaSize )
|
|
||||||
{
|
|
||||||
Int32 pp, i, j, vec;
|
|
||||||
|
|
||||||
pp = 0;
|
|
||||||
for (i = minLen; i <= maxLen; i++)
|
|
||||||
for (j = 0; j < alphaSize; j++)
|
|
||||||
if (length[j] == i) { perm[pp] = j; pp++; };
|
|
||||||
|
|
||||||
for (i = 0; i < BZ_MAX_CODE_LEN; i++) base[i] = 0;
|
|
||||||
for (i = 0; i < alphaSize; i++) base[length[i]+1]++;
|
|
||||||
|
|
||||||
for (i = 1; i < BZ_MAX_CODE_LEN; i++) base[i] += base[i-1];
|
|
||||||
|
|
||||||
for (i = 0; i < BZ_MAX_CODE_LEN; i++) limit[i] = 0;
|
|
||||||
vec = 0;
|
|
||||||
|
|
||||||
for (i = minLen; i <= maxLen; i++) {
|
|
||||||
vec += (base[i+1] - base[i]);
|
|
||||||
limit[i] = vec-1;
|
|
||||||
vec <<= 1;
|
|
||||||
}
|
|
||||||
for (i = minLen + 1; i <= maxLen; i++)
|
|
||||||
base[i] = ((limit[i-1] + 1) << 1) - base[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end huffman.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,27 +0,0 @@
|
|||||||
LIBRARY LIBBZ2
|
|
||||||
DESCRIPTION "libbzip2: library for data compression"
|
|
||||||
EXPORTS
|
|
||||||
BZ2_bzCompressInit
|
|
||||||
BZ2_bzCompress
|
|
||||||
BZ2_bzCompressEnd
|
|
||||||
BZ2_bzDecompressInit
|
|
||||||
BZ2_bzDecompress
|
|
||||||
BZ2_bzDecompressEnd
|
|
||||||
BZ2_bzReadOpen
|
|
||||||
BZ2_bzReadClose
|
|
||||||
BZ2_bzReadGetUnused
|
|
||||||
BZ2_bzRead
|
|
||||||
BZ2_bzWriteOpen
|
|
||||||
BZ2_bzWrite
|
|
||||||
BZ2_bzWriteClose
|
|
||||||
BZ2_bzWriteClose64
|
|
||||||
BZ2_bzBuffToBuffCompress
|
|
||||||
BZ2_bzBuffToBuffDecompress
|
|
||||||
BZ2_bzlibVersion
|
|
||||||
BZ2_bzopen
|
|
||||||
BZ2_bzdopen
|
|
||||||
BZ2_bzread
|
|
||||||
BZ2_bzwrite
|
|
||||||
BZ2_bzflush
|
|
||||||
BZ2_bzclose
|
|
||||||
BZ2_bzerror
|
|
@ -1,130 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="libbz2" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 5.00
|
|
||||||
# ** 編集しないでください **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=libbz2 - Win32 Debug
|
|
||||||
!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。
|
|
||||||
!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "libbz2.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE の実行時に構成を指定できます
|
|
||||||
!MESSAGE コマンド ライン上でマクロの設定を定義します。例:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "libbz2.mak" CFG="libbz2 - Win32 Debug"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE 選択可能なビルド モード:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "libbz2 - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用)
|
|
||||||
!MESSAGE "libbz2 - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用)
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "libbz2 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
|
|
||||||
# ADD BASE RSC /l 0x411 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x411 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /out:"libbz2.dll"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "libbz2 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
|
|
||||||
# ADD BASE RSC /l 0x411 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x411 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"libbz2.dll" /pdbtype:sept
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "libbz2 - Win32 Release"
|
|
||||||
# Name "libbz2 - Win32 Debug"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\blocksort.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\bzlib.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\bzlib.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\bzlib_private.h
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\compress.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\crctable.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\decompress.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\huffman.c
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\libbz2.def
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=.\randtable.c
|
|
||||||
# End Source File
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
@ -1,63 +0,0 @@
|
|||||||
# Makefile for Microsoft Visual C++ 6.0
|
|
||||||
# usage: nmake -f makefile.msc
|
|
||||||
# K.M. Syring (syring@gsf.de)
|
|
||||||
# Fixed up by JRS for bzip2-0.9.5d release.
|
|
||||||
|
|
||||||
CC=cl
|
|
||||||
CFLAGS= -DWIN32 -MD -Ox -D_FILE_OFFSET_BITS=64 -nologo
|
|
||||||
|
|
||||||
OBJS= blocksort.obj \
|
|
||||||
huffman.obj \
|
|
||||||
crctable.obj \
|
|
||||||
randtable.obj \
|
|
||||||
compress.obj \
|
|
||||||
decompress.obj \
|
|
||||||
bzlib.obj
|
|
||||||
|
|
||||||
all: lib bzip2 test
|
|
||||||
|
|
||||||
bzip2: lib
|
|
||||||
$(CC) $(CFLAGS) -o bzip2 bzip2.c libbz2.lib setargv.obj
|
|
||||||
$(CC) $(CFLAGS) -o bzip2recover bzip2recover.c
|
|
||||||
|
|
||||||
lib: $(OBJS)
|
|
||||||
lib /out:libbz2.lib $(OBJS)
|
|
||||||
|
|
||||||
test: bzip2
|
|
||||||
type words1
|
|
||||||
.\\bzip2 -1 < sample1.ref > sample1.rb2
|
|
||||||
.\\bzip2 -2 < sample2.ref > sample2.rb2
|
|
||||||
.\\bzip2 -3 < sample3.ref > sample3.rb2
|
|
||||||
.\\bzip2 -d < sample1.bz2 > sample1.tst
|
|
||||||
.\\bzip2 -d < sample2.bz2 > sample2.tst
|
|
||||||
.\\bzip2 -ds < sample3.bz2 > sample3.tst
|
|
||||||
@echo All six of the fc's should find no differences.
|
|
||||||
@echo If fc finds an error on sample3.bz2, this could be
|
|
||||||
@echo because WinZip's 'TAR file smart CR/LF conversion'
|
|
||||||
@echo is too clever for its own good. Disable this option.
|
|
||||||
@echo The correct size for sample3.ref is 120,244. If it
|
|
||||||
@echo is 150,251, WinZip has messed it up.
|
|
||||||
fc sample1.bz2 sample1.rb2
|
|
||||||
fc sample2.bz2 sample2.rb2
|
|
||||||
fc sample3.bz2 sample3.rb2
|
|
||||||
fc sample1.tst sample1.ref
|
|
||||||
fc sample2.tst sample2.ref
|
|
||||||
fc sample3.tst sample3.ref
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
clean:
|
|
||||||
del *.obj
|
|
||||||
del libbz2.lib
|
|
||||||
del bzip2.exe
|
|
||||||
del bzip2recover.exe
|
|
||||||
del sample1.rb2
|
|
||||||
del sample2.rb2
|
|
||||||
del sample3.rb2
|
|
||||||
del sample1.tst
|
|
||||||
del sample2.tst
|
|
||||||
del sample3.tst
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
$(CC) $(CFLAGS) -c $*.c -o $*.obj
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
|||||||
|
|
||||||
/* Spew out a long sequence of the byte 251. When fed to bzip2
|
|
||||||
versions 1.0.0 or 1.0.1, causes it to die with internal error
|
|
||||||
1007 in blocksort.c. This assertion misses an extremely rare
|
|
||||||
case, which is fixed in this version (1.0.2) and above.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
int main ()
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
for (i = 0; i < 48500000 ; i++)
|
|
||||||
putchar(251);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,84 +0,0 @@
|
|||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- Table for randomising repetitive blocks ---*/
|
|
||||||
/*--- randtable.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include "bzlib_private.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------*/
|
|
||||||
Int32 BZ2_rNums[512] = {
|
|
||||||
619, 720, 127, 481, 931, 816, 813, 233, 566, 247,
|
|
||||||
985, 724, 205, 454, 863, 491, 741, 242, 949, 214,
|
|
||||||
733, 859, 335, 708, 621, 574, 73, 654, 730, 472,
|
|
||||||
419, 436, 278, 496, 867, 210, 399, 680, 480, 51,
|
|
||||||
878, 465, 811, 169, 869, 675, 611, 697, 867, 561,
|
|
||||||
862, 687, 507, 283, 482, 129, 807, 591, 733, 623,
|
|
||||||
150, 238, 59, 379, 684, 877, 625, 169, 643, 105,
|
|
||||||
170, 607, 520, 932, 727, 476, 693, 425, 174, 647,
|
|
||||||
73, 122, 335, 530, 442, 853, 695, 249, 445, 515,
|
|
||||||
909, 545, 703, 919, 874, 474, 882, 500, 594, 612,
|
|
||||||
641, 801, 220, 162, 819, 984, 589, 513, 495, 799,
|
|
||||||
161, 604, 958, 533, 221, 400, 386, 867, 600, 782,
|
|
||||||
382, 596, 414, 171, 516, 375, 682, 485, 911, 276,
|
|
||||||
98, 553, 163, 354, 666, 933, 424, 341, 533, 870,
|
|
||||||
227, 730, 475, 186, 263, 647, 537, 686, 600, 224,
|
|
||||||
469, 68, 770, 919, 190, 373, 294, 822, 808, 206,
|
|
||||||
184, 943, 795, 384, 383, 461, 404, 758, 839, 887,
|
|
||||||
715, 67, 618, 276, 204, 918, 873, 777, 604, 560,
|
|
||||||
951, 160, 578, 722, 79, 804, 96, 409, 713, 940,
|
|
||||||
652, 934, 970, 447, 318, 353, 859, 672, 112, 785,
|
|
||||||
645, 863, 803, 350, 139, 93, 354, 99, 820, 908,
|
|
||||||
609, 772, 154, 274, 580, 184, 79, 626, 630, 742,
|
|
||||||
653, 282, 762, 623, 680, 81, 927, 626, 789, 125,
|
|
||||||
411, 521, 938, 300, 821, 78, 343, 175, 128, 250,
|
|
||||||
170, 774, 972, 275, 999, 639, 495, 78, 352, 126,
|
|
||||||
857, 956, 358, 619, 580, 124, 737, 594, 701, 612,
|
|
||||||
669, 112, 134, 694, 363, 992, 809, 743, 168, 974,
|
|
||||||
944, 375, 748, 52, 600, 747, 642, 182, 862, 81,
|
|
||||||
344, 805, 988, 739, 511, 655, 814, 334, 249, 515,
|
|
||||||
897, 955, 664, 981, 649, 113, 974, 459, 893, 228,
|
|
||||||
433, 837, 553, 268, 926, 240, 102, 654, 459, 51,
|
|
||||||
686, 754, 806, 760, 493, 403, 415, 394, 687, 700,
|
|
||||||
946, 670, 656, 610, 738, 392, 760, 799, 887, 653,
|
|
||||||
978, 321, 576, 617, 626, 502, 894, 679, 243, 440,
|
|
||||||
680, 879, 194, 572, 640, 724, 926, 56, 204, 700,
|
|
||||||
707, 151, 457, 449, 797, 195, 791, 558, 945, 679,
|
|
||||||
297, 59, 87, 824, 713, 663, 412, 693, 342, 606,
|
|
||||||
134, 108, 571, 364, 631, 212, 174, 643, 304, 329,
|
|
||||||
343, 97, 430, 751, 497, 314, 983, 374, 822, 928,
|
|
||||||
140, 206, 73, 263, 980, 736, 876, 478, 430, 305,
|
|
||||||
170, 514, 364, 692, 829, 82, 855, 953, 676, 246,
|
|
||||||
369, 970, 294, 750, 807, 827, 150, 790, 288, 923,
|
|
||||||
804, 378, 215, 828, 592, 281, 565, 555, 710, 82,
|
|
||||||
896, 831, 547, 261, 524, 462, 293, 465, 502, 56,
|
|
||||||
661, 821, 976, 991, 658, 869, 905, 758, 745, 193,
|
|
||||||
768, 550, 608, 933, 378, 286, 215, 979, 792, 961,
|
|
||||||
61, 688, 793, 644, 986, 403, 106, 366, 905, 644,
|
|
||||||
372, 567, 466, 434, 645, 210, 389, 550, 919, 135,
|
|
||||||
780, 773, 635, 389, 707, 100, 626, 958, 165, 504,
|
|
||||||
920, 176, 193, 713, 857, 265, 203, 50, 668, 108,
|
|
||||||
645, 990, 626, 197, 510, 357, 358, 850, 858, 364,
|
|
||||||
936, 638
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------*/
|
|
||||||
/*--- end randtable.c ---*/
|
|
||||||
/*-------------------------------------------------------------*/
|
|
@ -1,54 +0,0 @@
|
|||||||
|
|
||||||
/* spew out a thoroughly gigantic file designed so that bzip2
|
|
||||||
can compress it reasonably rapidly. This is to help test
|
|
||||||
support for large files (> 2GB) in a reasonable amount of time.
|
|
||||||
I suggest you use the undocumented --exponential option to
|
|
||||||
bzip2 when compressing the resulting file; this saves a bit of
|
|
||||||
time. Note: *don't* bother with --exponential when compressing
|
|
||||||
Real Files; it'll just waste a lot of CPU time :-)
|
|
||||||
(but is otherwise harmless).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#define _FILE_OFFSET_BITS 64
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/* The number of megabytes of junk to spew out (roughly) */
|
|
||||||
#define MEGABYTES 5000
|
|
||||||
|
|
||||||
#define N_BUF 1000000
|
|
||||||
char buf[N_BUF];
|
|
||||||
|
|
||||||
int main ( int argc, char** argv )
|
|
||||||
{
|
|
||||||
int ii, kk, p;
|
|
||||||
srandom(1);
|
|
||||||
setbuffer ( stdout, buf, N_BUF );
|
|
||||||
for (kk = 0; kk < MEGABYTES * 515; kk+=3) {
|
|
||||||
p = 25+random()%50;
|
|
||||||
for (ii = 0; ii < p; ii++)
|
|
||||||
printf ( "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" );
|
|
||||||
for (ii = 0; ii < p-1; ii++)
|
|
||||||
printf ( "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb" );
|
|
||||||
for (ii = 0; ii < p+1; ii++)
|
|
||||||
printf ( "ccccccccccccccccccccccccccccccccccccc" );
|
|
||||||
}
|
|
||||||
fflush(stdout);
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,141 +0,0 @@
|
|||||||
|
|
||||||
/* A test program written to test robustness to decompression of
|
|
||||||
corrupted data. Usage is
|
|
||||||
unzcrash filename
|
|
||||||
and the program will read the specified file, compress it (in memory),
|
|
||||||
and then repeatedly decompress it, each time with a different bit of
|
|
||||||
the compressed data inverted, so as to test all possible one-bit errors.
|
|
||||||
This should not cause any invalid memory accesses. If it does,
|
|
||||||
I want to know about it!
|
|
||||||
|
|
||||||
PS. As you can see from the above description, the process is
|
|
||||||
incredibly slow. A file of size eg 5KB will cause it to run for
|
|
||||||
many hours.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------
|
|
||||||
This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
lossless, block-sorting data compression.
|
|
||||||
|
|
||||||
bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
|
|
||||||
Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
README file.
|
|
||||||
|
|
||||||
This program is released under the terms of the license contained
|
|
||||||
in the file LICENSE.
|
|
||||||
------------------------------------------------------------------ */
|
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include "bzlib.h"
|
|
||||||
|
|
||||||
#define M_BLOCK 1000000
|
|
||||||
|
|
||||||
typedef unsigned char uchar;
|
|
||||||
|
|
||||||
#define M_BLOCK_OUT (M_BLOCK + 1000000)
|
|
||||||
uchar inbuf[M_BLOCK];
|
|
||||||
uchar outbuf[M_BLOCK_OUT];
|
|
||||||
uchar zbuf[M_BLOCK + 600 + (M_BLOCK / 100)];
|
|
||||||
|
|
||||||
int nIn, nOut, nZ;
|
|
||||||
|
|
||||||
static char *bzerrorstrings[] = {
|
|
||||||
"OK"
|
|
||||||
,"SEQUENCE_ERROR"
|
|
||||||
,"PARAM_ERROR"
|
|
||||||
,"MEM_ERROR"
|
|
||||||
,"DATA_ERROR"
|
|
||||||
,"DATA_ERROR_MAGIC"
|
|
||||||
,"IO_ERROR"
|
|
||||||
,"UNEXPECTED_EOF"
|
|
||||||
,"OUTBUFF_FULL"
|
|
||||||
,"???" /* for future */
|
|
||||||
,"???" /* for future */
|
|
||||||
,"???" /* for future */
|
|
||||||
,"???" /* for future */
|
|
||||||
,"???" /* for future */
|
|
||||||
,"???" /* for future */
|
|
||||||
};
|
|
||||||
|
|
||||||
void flip_bit ( int bit )
|
|
||||||
{
|
|
||||||
int byteno = bit / 8;
|
|
||||||
int bitno = bit % 8;
|
|
||||||
uchar mask = 1 << bitno;
|
|
||||||
//fprintf ( stderr, "(byte %d bit %d mask %d)",
|
|
||||||
// byteno, bitno, (int)mask );
|
|
||||||
zbuf[byteno] ^= mask;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main ( int argc, char** argv )
|
|
||||||
{
|
|
||||||
FILE* f;
|
|
||||||
int r;
|
|
||||||
int bit;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (argc != 2) {
|
|
||||||
fprintf ( stderr, "usage: unzcrash filename\n" );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
f = fopen ( argv[1], "r" );
|
|
||||||
if (!f) {
|
|
||||||
fprintf ( stderr, "unzcrash: can't open %s\n", argv[1] );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
nIn = fread ( inbuf, 1, M_BLOCK, f );
|
|
||||||
fprintf ( stderr, "%d bytes read\n", nIn );
|
|
||||||
|
|
||||||
nZ = M_BLOCK;
|
|
||||||
r = BZ2_bzBuffToBuffCompress (
|
|
||||||
zbuf, &nZ, inbuf, nIn, 9, 0, 30 );
|
|
||||||
|
|
||||||
assert (r == BZ_OK);
|
|
||||||
fprintf ( stderr, "%d after compression\n", nZ );
|
|
||||||
|
|
||||||
for (bit = 0; bit < nZ*8; bit++) {
|
|
||||||
fprintf ( stderr, "bit %d ", bit );
|
|
||||||
flip_bit ( bit );
|
|
||||||
nOut = M_BLOCK_OUT;
|
|
||||||
r = BZ2_bzBuffToBuffDecompress (
|
|
||||||
outbuf, &nOut, zbuf, nZ, 0, 0 );
|
|
||||||
fprintf ( stderr, " %d %s ", r, bzerrorstrings[-r] );
|
|
||||||
|
|
||||||
if (r != BZ_OK) {
|
|
||||||
fprintf ( stderr, "\n" );
|
|
||||||
} else {
|
|
||||||
if (nOut != nIn) {
|
|
||||||
fprintf(stderr, "nIn/nOut mismatch %d %d\n", nIn, nOut );
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < nOut; i++)
|
|
||||||
if (inbuf[i] != outbuf[i]) {
|
|
||||||
fprintf(stderr, "mismatch at %d\n", i );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (i == nOut) fprintf(stderr, "really ok!\n" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
flip_bit ( bit );
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
assert (nOut == nIn);
|
|
||||||
for (i = 0; i < nOut; i++) {
|
|
||||||
if (inbuf[i] != outbuf[i]) {
|
|
||||||
fprintf ( stderr, "difference at %d !\n", i );
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf ( stderr, "all ok\n" );
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,9 +0,0 @@
|
|||||||
|
|
||||||
If compilation produces errors, or a large number of warnings,
|
|
||||||
please read README.COMPILATION.PROBLEMS -- you might be able to
|
|
||||||
adjust the flags in this Makefile to improve matters.
|
|
||||||
|
|
||||||
Also in README.COMPILATION.PROBLEMS are some hints that may help
|
|
||||||
if your build produces an executable which is unable to correctly
|
|
||||||
handle so-called 'large files' -- files of size 2GB or more.
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
|
|
||||||
Doing 6 tests (3 compress, 3 uncompress) ...
|
|
||||||
If there's a problem, things might stop at this point.
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
|
|
||||||
Checking test results. If any of the four "cmp"s which follow
|
|
||||||
report any differences, something is wrong. If you can't easily
|
|
||||||
figure out what, please let me know (jseward@bzip.org).
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
|
|
||||||
If you got this far and the 'cmp's didn't complain, it looks
|
|
||||||
like you're in business.
|
|
||||||
|
|
||||||
To install in /usr/local/bin, /usr/local/lib, /usr/local/man and
|
|
||||||
/usr/local/include, type
|
|
||||||
|
|
||||||
make install
|
|
||||||
|
|
||||||
To install somewhere else, eg, /xxx/yyy/{bin,lib,man,include}, type
|
|
||||||
|
|
||||||
make install PREFIX=/xxx/yyy
|
|
||||||
|
|
||||||
If you are (justifiably) paranoid and want to see what 'make install'
|
|
||||||
is going to do, you can first do
|
|
||||||
|
|
||||||
make -n install or
|
|
||||||
make -n install PREFIX=/xxx/yyy respectively.
|
|
||||||
|
|
||||||
The -n instructs make to show the commands it would execute, but
|
|
||||||
not actually execute them.
|
|
||||||
|
|
||||||
Instructions for use are in the preformatted manual page, in the file
|
|
||||||
bzip2.txt. For more detailed documentation, read the full manual.
|
|
||||||
It is available in Postscript form (manual.ps), PDF form (manual.pdf),
|
|
||||||
and HTML form (manual.html).
|
|
||||||
|
|
||||||
You can also do "bzip2 --help" to see some helpful information.
|
|
||||||
"bzip2 -L" displays the software license.
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# see the README file for usage etc.
|
|
||||||
#
|
|
||||||
# ------------------------------------------------------------------
|
|
||||||
# This file is part of bzip2/libbzip2, a program and library for
|
|
||||||
# lossless, block-sorting data compression.
|
|
||||||
#
|
|
||||||
# bzip2/libbzip2 version 1.0.6 of 6 September 2010
|
|
||||||
# Copyright (C) 1996-2010 Julian Seward <jseward@bzip.org>
|
|
||||||
#
|
|
||||||
# Please read the WARNING, DISCLAIMER and PATENTS sections in the
|
|
||||||
# README file.
|
|
||||||
#
|
|
||||||
# This program is released under the terms of the license contained
|
|
||||||
# in the file LICENSE.
|
|
||||||
# ----------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo '';
|
|
||||||
echo 'Usage: xmlproc.sh -[option] <filename.xml>';
|
|
||||||
echo 'Specify a target from:';
|
|
||||||
echo '-v verify xml file conforms to dtd';
|
|
||||||
echo '-html output in html format (single file)';
|
|
||||||
echo '-ps output in postscript format';
|
|
||||||
echo '-pdf output in pdf format';
|
|
||||||
exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if test $# -ne 2; then
|
|
||||||
usage
|
|
||||||
fi
|
|
||||||
# assign the variable for the output type
|
|
||||||
action=$1; shift
|
|
||||||
# assign the output filename
|
|
||||||
xmlfile=$1; shift
|
|
||||||
# and check user input it correct
|
|
||||||
if !(test -f $xmlfile); then
|
|
||||||
echo "No such file: $xmlfile";
|
|
||||||
exit;
|
|
||||||
fi
|
|
||||||
# some other stuff we will use
|
|
||||||
OUT=output
|
|
||||||
xsl_fo=bz-fo.xsl
|
|
||||||
xsl_html=bz-html.xsl
|
|
||||||
|
|
||||||
basename=$xmlfile
|
|
||||||
basename=${basename//'.xml'/''}
|
|
||||||
|
|
||||||
fofile="${basename}.fo"
|
|
||||||
htmlfile="${basename}.html"
|
|
||||||
pdffile="${basename}.pdf"
|
|
||||||
psfile="${basename}.ps"
|
|
||||||
xmlfmtfile="${basename}.fmt"
|
|
||||||
|
|
||||||
# first process the xmlfile with CDATA tags
|
|
||||||
./format.pl $xmlfile $xmlfmtfile
|
|
||||||
# so the shell knows where the catalogs live
|
|
||||||
export XML_CATALOG_FILES=/etc/xml/catalog
|
|
||||||
|
|
||||||
# post-processing tidy up
|
|
||||||
cleanup() {
|
|
||||||
echo "Cleaning up: $@"
|
|
||||||
while [ $# != 0 ]
|
|
||||||
do
|
|
||||||
arg=$1; shift;
|
|
||||||
echo " deleting $arg";
|
|
||||||
rm $arg
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
case $action in
|
|
||||||
-v)
|
|
||||||
flags='--noout --xinclude --noblanks --postvalid'
|
|
||||||
dtd='--dtdvalid http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd'
|
|
||||||
xmllint $flags $dtd $xmlfmtfile 2> $OUT
|
|
||||||
egrep 'error' $OUT
|
|
||||||
rm $OUT
|
|
||||||
;;
|
|
||||||
|
|
||||||
-html)
|
|
||||||
echo "Creating $htmlfile ..."
|
|
||||||
xsltproc --nonet --xinclude -o $htmlfile $xsl_html $xmlfmtfile
|
|
||||||
cleanup $xmlfmtfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
-pdf)
|
|
||||||
echo "Creating $pdffile ..."
|
|
||||||
xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
cleanup $OUT $xmlfmtfile *.aux *.fo *.log *.out
|
|
||||||
;;
|
|
||||||
|
|
||||||
-ps)
|
|
||||||
echo "Creating $psfile ..."
|
|
||||||
xsltproc --nonet --xinclude -o $fofile $xsl_fo $xmlfmtfile
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
pdfxmltex $fofile >$OUT </dev/null
|
|
||||||
pdftops $pdffile $psfile
|
|
||||||
cleanup $OUT $xmlfmtfile $pdffile *.aux *.fo *.log *.out
|
|
||||||
# passivetex is broken, so we can't go this route yet.
|
|
||||||
# xmltex $fofile >$OUT </dev/null
|
|
||||||
# xmltex $fofile >$OUT </dev/null
|
|
||||||
# xmltex $fofile >$OUT </dev/null
|
|
||||||
# dvips -R -q -o bzip-manual.ps *.dvi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
usage
|
|
||||||
;;
|
|
||||||
esac
|
|
@ -1,134 +0,0 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
|
||||||
#
|
|
||||||
# Automake Makefile for the JPEG library
|
|
||||||
#
|
|
||||||
# This file is written by Bob Friesenhahn, Guido Vollbeding
|
|
||||||
#
|
|
||||||
|
|
||||||
# Sources to build library
|
|
||||||
LIBSOURCES = jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c \
|
|
||||||
jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c \
|
|
||||||
jcomapi.c jcparam.c jcprepct.c jcsample.c jctrans.c jdapimin.c \
|
|
||||||
jdapistd.c jdarith.c jdatadst.c jdatasrc.c jdcoefct.c jdcolor.c \
|
|
||||||
jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c \
|
|
||||||
jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c \
|
|
||||||
jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jquant1.c \
|
|
||||||
jquant2.c jutils.c jmemmgr.c @MEMORYMGR@.c
|
|
||||||
|
|
||||||
# System dependent sources
|
|
||||||
SYSDEPSOURCES = jmemansi.c jmemname.c jmemnobs.c jmemdos.c jmemmac.c
|
|
||||||
|
|
||||||
# Headers which are installed to support the library
|
|
||||||
INSTINCLUDES = jerror.h jmorecfg.h jpeglib.h
|
|
||||||
|
|
||||||
# Headers which are not installed
|
|
||||||
OTHERINCLUDES = cderror.h cdjpeg.h jdct.h jinclude.h jmemsys.h jpegint.h \
|
|
||||||
jversion.h transupp.h
|
|
||||||
|
|
||||||
# Manual pages (Automake uses 'MANS' for itself)
|
|
||||||
DISTMANS= cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1
|
|
||||||
|
|
||||||
# Other documentation files
|
|
||||||
DOCS= README install.txt usage.txt wizard.txt example.c libjpeg.txt \
|
|
||||||
structure.txt coderules.txt filelist.txt change.log
|
|
||||||
|
|
||||||
# Makefiles for various systems
|
|
||||||
MKFILES= configure Makefile.in makefile.ansi makefile.unix makefile.bcc \
|
|
||||||
makefile.mc6 makefile.dj makefile.wat makefile.vc makejdsw.vc6 \
|
|
||||||
makeadsw.vc6 makejdep.vc6 makejdsp.vc6 makejmak.vc6 makecdep.vc6 \
|
|
||||||
makecdsp.vc6 makecmak.vc6 makeddep.vc6 makeddsp.vc6 makedmak.vc6 \
|
|
||||||
maketdep.vc6 maketdsp.vc6 maketmak.vc6 makerdep.vc6 makerdsp.vc6 \
|
|
||||||
makermak.vc6 makewdep.vc6 makewdsp.vc6 makewmak.vc6 makejsln.v10 \
|
|
||||||
makeasln.v10 makejvcx.v10 makejfil.v10 makecvcx.v10 makecfil.v10 \
|
|
||||||
makedvcx.v10 makedfil.v10 maketvcx.v10 maketfil.v10 makervcx.v10 \
|
|
||||||
makerfil.v10 makewvcx.v10 makewfil.v10 makeproj.mac makcjpeg.st \
|
|
||||||
makdjpeg.st makljpeg.st maktjpeg.st makefile.manx makefile.sas \
|
|
||||||
makefile.mms makefile.vms makvms.opt
|
|
||||||
|
|
||||||
# Configuration files
|
|
||||||
CONFIGFILES= jconfig.cfg jconfig.bcc jconfig.mc6 jconfig.dj jconfig.wat \
|
|
||||||
jconfig.vc jconfig.mac jconfig.st jconfig.manx jconfig.sas \
|
|
||||||
jconfig.vms
|
|
||||||
|
|
||||||
# Support scripts for configure
|
|
||||||
CONFIGUREFILES= config.guess config.sub install-sh ltmain.sh depcomp \
|
|
||||||
missing ar-lib
|
|
||||||
|
|
||||||
# Miscellaneous support files
|
|
||||||
OTHERFILES= jconfig.txt ckconfig.c jmemdosa.asm libjpeg.map
|
|
||||||
|
|
||||||
# Test support files
|
|
||||||
TESTFILES= testorig.jpg testimg.ppm testimg.bmp testimg.jpg testprog.jpg \
|
|
||||||
testimgp.jpg
|
|
||||||
|
|
||||||
# libtool libraries to build
|
|
||||||
lib_LTLIBRARIES = libjpeg.la
|
|
||||||
|
|
||||||
# Library sources for libjpeg.la
|
|
||||||
libjpeg_la_SOURCES = $(LIBSOURCES)
|
|
||||||
|
|
||||||
# LDFLAGS for libjpeg.la
|
|
||||||
libjpeg_la_LDFLAGS = -no-undefined \
|
|
||||||
-version-info $(JPEG_LIB_VERSION)
|
|
||||||
|
|
||||||
if HAVE_LD_VERSION_SCRIPT
|
|
||||||
libjpeg_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libjpeg.map
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Executables to build
|
|
||||||
bin_PROGRAMS = cjpeg djpeg jpegtran rdjpgcom wrjpgcom
|
|
||||||
|
|
||||||
# Executable sources & libs
|
|
||||||
cjpeg_SOURCES = cjpeg.c rdppm.c rdgif.c rdtarga.c rdrle.c rdbmp.c \
|
|
||||||
rdswitch.c cdjpeg.c
|
|
||||||
cjpeg_LDADD = libjpeg.la
|
|
||||||
djpeg_SOURCES = djpeg.c wrppm.c wrgif.c wrtarga.c wrrle.c wrbmp.c \
|
|
||||||
rdcolmap.c cdjpeg.c
|
|
||||||
djpeg_LDADD = libjpeg.la
|
|
||||||
jpegtran_SOURCES = jpegtran.c rdswitch.c cdjpeg.c transupp.c
|
|
||||||
jpegtran_LDADD = libjpeg.la
|
|
||||||
rdjpgcom_SOURCES = rdjpgcom.c
|
|
||||||
wrjpgcom_SOURCES = wrjpgcom.c
|
|
||||||
|
|
||||||
# Manual pages to install
|
|
||||||
man_MANS = $(DISTMANS)
|
|
||||||
|
|
||||||
# Headers to install
|
|
||||||
include_HEADERS = $(INSTINCLUDES)
|
|
||||||
|
|
||||||
# Other distributed headers
|
|
||||||
noinst_HEADERS = $(OTHERINCLUDES)
|
|
||||||
|
|
||||||
# Other distributed files
|
|
||||||
EXTRA_DIST = $(DOCS) $(DISTMANS) $(MKFILES) $(CONFIGFILES) $(SYSDEPSOURCES) \
|
|
||||||
$(OTHERFILES) $(TESTFILES)
|
|
||||||
|
|
||||||
# Files to be cleaned
|
|
||||||
CLEANFILES = testout.ppm testout.bmp testout.jpg testoutp.ppm testoutp.jpg \
|
|
||||||
testoutt.jpg
|
|
||||||
|
|
||||||
# Install jconfig.h
|
|
||||||
install-data-local:
|
|
||||||
$(mkinstalldirs) $(DESTDIR)$(includedir)
|
|
||||||
$(INSTALL_HEADER) jconfig.h $(DESTDIR)$(includedir)/jconfig.h
|
|
||||||
|
|
||||||
# Uninstall jconfig.h
|
|
||||||
uninstall-local:
|
|
||||||
rm -f $(DESTDIR)$(includedir)/jconfig.h
|
|
||||||
|
|
||||||
# Run tests
|
|
||||||
test: check-local
|
|
||||||
check-local:
|
|
||||||
rm -f testout*
|
|
||||||
./djpeg -dct int -ppm -outfile testout.ppm $(srcdir)/testorig.jpg
|
|
||||||
./djpeg -dct int -bmp -colors 256 -outfile testout.bmp $(srcdir)/testorig.jpg
|
|
||||||
./cjpeg -dct int -outfile testout.jpg $(srcdir)/testimg.ppm
|
|
||||||
./djpeg -dct int -ppm -outfile testoutp.ppm $(srcdir)/testprog.jpg
|
|
||||||
./cjpeg -dct int -progressive -opt -outfile testoutp.jpg $(srcdir)/testimg.ppm
|
|
||||||
./jpegtran -outfile testoutt.jpg $(srcdir)/testprog.jpg
|
|
||||||
cmp $(srcdir)/testimg.ppm testout.ppm
|
|
||||||
cmp $(srcdir)/testimg.bmp testout.bmp
|
|
||||||
cmp $(srcdir)/testimg.jpg testout.jpg
|
|
||||||
cmp $(srcdir)/testimg.ppm testoutp.ppm
|
|
||||||
cmp $(srcdir)/testimgp.jpg testoutp.jpg
|
|
||||||
cmp $(srcdir)/testorig.jpg testoutt.jpg
|
|
File diff suppressed because it is too large
Load Diff
@ -1,381 +0,0 @@
|
|||||||
The Independent JPEG Group's JPEG software
|
|
||||||
==========================================
|
|
||||||
|
|
||||||
README for release 9a of 19-Jan-2014
|
|
||||||
====================================
|
|
||||||
|
|
||||||
This distribution contains the ninth public release of the Independent JPEG
|
|
||||||
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.
|
|
||||||
|
|
||||||
This software is the work of Tom Lane, Guido Vollbeding, Philip Gladstone,
|
|
||||||
Bill Allombert, Jim Boucher, Lee Crocker, Bob Friesenhahn, Ben Jackson,
|
|
||||||
Julian Minguillon, Luis Ortiz, George Phillips, Davide Rossi, Ge' Weijers,
|
|
||||||
and other members of the Independent JPEG Group.
|
|
||||||
|
|
||||||
IJG is not affiliated with the ISO/IEC JTC1/SC29/WG1 standards committee
|
|
||||||
(previously known as JPEG, together with ITU-T SG16).
|
|
||||||
|
|
||||||
|
|
||||||
DOCUMENTATION ROADMAP
|
|
||||||
=====================
|
|
||||||
|
|
||||||
This file contains the following sections:
|
|
||||||
|
|
||||||
OVERVIEW General description of JPEG and the IJG software.
|
|
||||||
LEGAL ISSUES Copyright, lack of warranty, terms of distribution.
|
|
||||||
REFERENCES Where to learn more about JPEG.
|
|
||||||
ARCHIVE LOCATIONS Where to find newer versions of this software.
|
|
||||||
ACKNOWLEDGMENTS Special thanks.
|
|
||||||
FILE FORMAT WARS Software *not* to get.
|
|
||||||
TO DO Plans for future IJG releases.
|
|
||||||
|
|
||||||
Other documentation files in the distribution are:
|
|
||||||
|
|
||||||
User documentation:
|
|
||||||
install.txt How to configure and install the IJG software.
|
|
||||||
usage.txt Usage instructions for cjpeg, djpeg, jpegtran,
|
|
||||||
rdjpgcom, and wrjpgcom.
|
|
||||||
*.1 Unix-style man pages for programs (same info as usage.txt).
|
|
||||||
wizard.txt Advanced usage instructions for JPEG wizards only.
|
|
||||||
change.log Version-to-version change highlights.
|
|
||||||
Programmer and internal documentation:
|
|
||||||
libjpeg.txt How to use the JPEG library in your own programs.
|
|
||||||
example.c Sample code for calling the JPEG library.
|
|
||||||
structure.txt Overview of the JPEG library's internal structure.
|
|
||||||
filelist.txt Road map of IJG files.
|
|
||||||
coderules.txt Coding style rules --- please read if you contribute code.
|
|
||||||
|
|
||||||
Please read at least the files install.txt and usage.txt. Some information
|
|
||||||
can also be found in the JPEG FAQ (Frequently Asked Questions) article. See
|
|
||||||
ARCHIVE LOCATIONS below to find out where to obtain the FAQ article.
|
|
||||||
|
|
||||||
If you want to understand how the JPEG code works, we suggest reading one or
|
|
||||||
more of the REFERENCES, then looking at the documentation files (in roughly
|
|
||||||
the order listed) before diving into the code.
|
|
||||||
|
|
||||||
|
|
||||||
OVERVIEW
|
|
||||||
========
|
|
||||||
|
|
||||||
This package contains C software to implement JPEG image encoding, decoding,
|
|
||||||
and transcoding. JPEG (pronounced "jay-peg") is a standardized compression
|
|
||||||
method for full-color and gray-scale images.
|
|
||||||
|
|
||||||
This software implements JPEG baseline, extended-sequential, and progressive
|
|
||||||
compression processes. Provision is made for supporting all variants of these
|
|
||||||
processes, although some uncommon parameter settings aren't implemented yet.
|
|
||||||
We have made no provision for supporting the hierarchical or lossless
|
|
||||||
processes defined in the standard.
|
|
||||||
|
|
||||||
We provide a set of library routines for reading and writing JPEG image files,
|
|
||||||
plus two sample applications "cjpeg" and "djpeg", which use the library to
|
|
||||||
perform conversion between JPEG and some other popular image file formats.
|
|
||||||
The library is intended to be reused in other applications.
|
|
||||||
|
|
||||||
In order to support file conversion and viewing software, we have included
|
|
||||||
considerable functionality beyond the bare JPEG coding/decoding capability;
|
|
||||||
for example, the color quantization modules are not strictly part of JPEG
|
|
||||||
decoding, but they are essential for output to colormapped file formats or
|
|
||||||
colormapped displays. These extra functions can be compiled out of the
|
|
||||||
library if not required for a particular application.
|
|
||||||
|
|
||||||
We have also included "jpegtran", a utility for lossless transcoding between
|
|
||||||
different JPEG processes, and "rdjpgcom" and "wrjpgcom", two simple
|
|
||||||
applications for inserting and extracting textual comments in JFIF files.
|
|
||||||
|
|
||||||
The emphasis in designing this software has been on achieving portability and
|
|
||||||
flexibility, while also making it fast enough to be useful. In particular,
|
|
||||||
the software is not intended to be read as a tutorial on JPEG. (See the
|
|
||||||
REFERENCES section for introductory material.) Rather, it is intended to
|
|
||||||
be reliable, portable, industrial-strength code. We do not claim to have
|
|
||||||
achieved that goal in every aspect of the software, but we strive for it.
|
|
||||||
|
|
||||||
We welcome the use of this software as a component of commercial products.
|
|
||||||
No royalty is required, but we do ask for an acknowledgement in product
|
|
||||||
documentation, as described under LEGAL ISSUES.
|
|
||||||
|
|
||||||
|
|
||||||
LEGAL ISSUES
|
|
||||||
============
|
|
||||||
|
|
||||||
In plain English:
|
|
||||||
|
|
||||||
1. We don't promise that this software works. (But if you find any bugs,
|
|
||||||
please let us know!)
|
|
||||||
2. You can use this software for whatever you want. You don't have to pay us.
|
|
||||||
3. You may not pretend that you wrote this software. If you use it in a
|
|
||||||
program, you must acknowledge somewhere in your documentation that
|
|
||||||
you've used the IJG code.
|
|
||||||
|
|
||||||
In legalese:
|
|
||||||
|
|
||||||
The authors make NO WARRANTY or representation, either express or implied,
|
|
||||||
with respect to this software, its quality, accuracy, merchantability, or
|
|
||||||
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.
|
|
||||||
|
|
||||||
This software is copyright (C) 1991-2014, Thomas G. Lane, Guido Vollbeding.
|
|
||||||
All Rights Reserved except as specified below.
|
|
||||||
|
|
||||||
Permission is hereby granted to use, copy, modify, and distribute this
|
|
||||||
software (or portions thereof) for any purpose, without fee, subject to these
|
|
||||||
conditions:
|
|
||||||
(1) If any part of the source code for this software is distributed, then this
|
|
||||||
README file must be included, with this copyright and no-warranty notice
|
|
||||||
unaltered; and any additions, deletions, or changes to the original files
|
|
||||||
must be clearly indicated in accompanying documentation.
|
|
||||||
(2) If only executable code is distributed, then the accompanying
|
|
||||||
documentation must state that "this software is based in part on the work of
|
|
||||||
the Independent JPEG Group".
|
|
||||||
(3) Permission for use of this software is granted only if the user accepts
|
|
||||||
full responsibility for any undesirable consequences; the authors accept
|
|
||||||
NO LIABILITY for damages of any kind.
|
|
||||||
|
|
||||||
These conditions apply to any software derived from or based on the IJG code,
|
|
||||||
not just to the unmodified library. If you use our work, you ought to
|
|
||||||
acknowledge us.
|
|
||||||
|
|
||||||
Permission is NOT granted for the use of any IJG author's name or company name
|
|
||||||
in advertising or publicity relating to this software or products derived from
|
|
||||||
it. This software may be referred to only as "the Independent JPEG Group's
|
|
||||||
software".
|
|
||||||
|
|
||||||
We specifically permit and encourage the use of this software as the basis of
|
|
||||||
commercial products, provided that all warranty or liability claims are
|
|
||||||
assumed by the product vendor.
|
|
||||||
|
|
||||||
|
|
||||||
The Unix configuration script "configure" was produced with GNU Autoconf.
|
|
||||||
It is copyright by the Free Software Foundation but is freely distributable.
|
|
||||||
The same holds for its supporting scripts (config.guess, config.sub,
|
|
||||||
ltmain.sh). Another support script, install-sh, is copyright by X Consortium
|
|
||||||
but is also freely distributable.
|
|
||||||
|
|
||||||
The IJG distribution formerly included code to read and write GIF files.
|
|
||||||
To avoid entanglement with the Unisys LZW patent (now expired), GIF reading
|
|
||||||
support has been removed altogether, and the GIF writer has been simplified
|
|
||||||
to produce "uncompressed GIFs". This technique does not use the LZW
|
|
||||||
algorithm; the resulting GIF files are larger than usual, but are readable
|
|
||||||
by all standard GIF decoders.
|
|
||||||
|
|
||||||
We are required to state that
|
|
||||||
"The Graphics Interchange Format(c) is the Copyright property of
|
|
||||||
CompuServe Incorporated. GIF(sm) is a Service Mark property of
|
|
||||||
CompuServe Incorporated."
|
|
||||||
|
|
||||||
|
|
||||||
REFERENCES
|
|
||||||
==========
|
|
||||||
|
|
||||||
We recommend reading one or more of these references before trying to
|
|
||||||
understand the innards of the JPEG software.
|
|
||||||
|
|
||||||
The best short technical introduction to the JPEG compression algorithm is
|
|
||||||
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|
||||||
Communications of the ACM, April 1991 (vol. 34 no. 4), pp. 30-44.
|
|
||||||
(Adjacent articles in that issue discuss MPEG motion picture compression,
|
|
||||||
applications of JPEG, and related topics.) If you don't have the CACM issue
|
|
||||||
handy, a PostScript file containing a revised version of Wallace's article is
|
|
||||||
available at http://www.ijg.org/files/wallace.ps.gz. The file (actually
|
|
||||||
a preprint for an article that appeared in IEEE Trans. Consumer Electronics)
|
|
||||||
omits the sample images that appeared in CACM, but it includes corrections
|
|
||||||
and some added material. Note: the Wallace article is copyright ACM and IEEE,
|
|
||||||
and it may not be used for commercial purposes.
|
|
||||||
|
|
||||||
A somewhat less technical, more leisurely introduction to JPEG can be found in
|
|
||||||
"The Data Compression Book" by Mark Nelson and Jean-loup Gailly, published by
|
|
||||||
M&T Books (New York), 2nd ed. 1996, ISBN 1-55851-434-1. This book provides
|
|
||||||
good explanations and example C code for a multitude of compression methods
|
|
||||||
including JPEG. It is an excellent source if you are comfortable reading C
|
|
||||||
code but don't know much about data compression in general. The book's JPEG
|
|
||||||
sample code is far from industrial-strength, but when you are ready to look
|
|
||||||
at a full implementation, you've got one here...
|
|
||||||
|
|
||||||
The best currently available description of JPEG is the textbook "JPEG Still
|
|
||||||
Image Data Compression Standard" by William B. Pennebaker and Joan L.
|
|
||||||
Mitchell, published by Van Nostrand Reinhold, 1993, ISBN 0-442-01272-1.
|
|
||||||
Price US$59.95, 638 pp. The book includes the complete text of the ISO JPEG
|
|
||||||
standards (DIS 10918-1 and draft DIS 10918-2).
|
|
||||||
Although this is by far the most detailed and comprehensive exposition of
|
|
||||||
JPEG publicly available, we point out that it is still missing an explanation
|
|
||||||
of the most essential properties and algorithms of the underlying DCT
|
|
||||||
technology.
|
|
||||||
If you think that you know about DCT-based JPEG after reading this book,
|
|
||||||
then you are in delusion. The real fundamentals and corresponding potential
|
|
||||||
of DCT-based JPEG are not publicly known so far, and that is the reason for
|
|
||||||
all the mistaken developments taking place in the image coding domain.
|
|
||||||
|
|
||||||
The original JPEG standard is divided into two parts, Part 1 being the actual
|
|
||||||
specification, while Part 2 covers compliance testing methods. Part 1 is
|
|
||||||
titled "Digital Compression and Coding of Continuous-tone Still Images,
|
|
||||||
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
|
|
||||||
Continuous-tone Still Images, Part 2: Compliance testing" and has document
|
|
||||||
numbers ISO/IEC IS 10918-2, ITU-T T.83.
|
|
||||||
IJG JPEG 8 introduced 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.
|
|
||||||
IJG JPEG 9 introduces a reversible color transform for improved lossless
|
|
||||||
compression which is described in a contributed document ISO/IEC JTC1/SC29/
|
|
||||||
WG1 N 6080 with title "JPEG 9 Lossless Coding", June/July 2012, Paris,
|
|
||||||
France.
|
|
||||||
|
|
||||||
The JPEG standard does not specify all details of an interchangeable file
|
|
||||||
format. For the omitted details we follow the "JFIF" conventions, revision
|
|
||||||
1.02. JFIF 1.02 has been adopted as an Ecma International Technical Report
|
|
||||||
and thus received a formal publication status. It is available as a free
|
|
||||||
download in PDF format from
|
|
||||||
http://www.ecma-international.org/publications/techreports/E-TR-098.htm.
|
|
||||||
A PostScript version of the JFIF 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.txt.gz, but it is missing the figures.
|
|
||||||
|
|
||||||
The TIFF 6.0 file format specification can be obtained by FTP from
|
|
||||||
ftp://ftp.sgi.com/graphics/tiff/TIFF6.ps.gz. The JPEG incorporation scheme
|
|
||||||
found in the TIFF 6.0 spec of 3-June-92 has a number of serious problems.
|
|
||||||
IJG does not recommend use of the TIFF 6.0 design (TIFF Compression tag 6).
|
|
||||||
Instead, we recommend the JPEG design proposed by TIFF Technical Note #2
|
|
||||||
(Compression tag 7). Copies of this Note can be obtained from
|
|
||||||
http://www.ijg.org/files/. It is expected that the next revision
|
|
||||||
of the TIFF spec will replace the 6.0 JPEG design with the Note's design.
|
|
||||||
Although IJG's own code does not support TIFF/JPEG, the free libtiff library
|
|
||||||
uses our library to implement TIFF/JPEG per the Note.
|
|
||||||
|
|
||||||
|
|
||||||
ARCHIVE LOCATIONS
|
|
||||||
=================
|
|
||||||
|
|
||||||
The "official" archive site for this software is www.ijg.org.
|
|
||||||
The most recent released version can always be found there in
|
|
||||||
directory "files". This particular version will be archived as
|
|
||||||
http://www.ijg.org/files/jpegsrc.v9a.tar.gz, and in Windows-compatible
|
|
||||||
"zip" archive format as http://www.ijg.org/files/jpegsr9a.zip.
|
|
||||||
|
|
||||||
The JPEG FAQ (Frequently Asked Questions) article is a source of some
|
|
||||||
general information about JPEG.
|
|
||||||
It is available on the World Wide Web at http://www.faqs.org/faqs/jpeg-faq/
|
|
||||||
and other news.answers archive sites, including the official news.answers
|
|
||||||
archive at rtfm.mit.edu: ftp://rtfm.mit.edu/pub/usenet/news.answers/jpeg-faq/.
|
|
||||||
If you don't have Web or FTP access, send e-mail to mail-server@rtfm.mit.edu
|
|
||||||
with body
|
|
||||||
send usenet/news.answers/jpeg-faq/part1
|
|
||||||
send usenet/news.answers/jpeg-faq/part2
|
|
||||||
|
|
||||||
|
|
||||||
ACKNOWLEDGMENTS
|
|
||||||
===============
|
|
||||||
|
|
||||||
Thank to Juergen Bruder for providing me with a copy of the common 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.
|
|
||||||
|
|
||||||
Thank to Istvan Sebestyen and Joan L. Mitchell for inviting me to the
|
|
||||||
ITU JPEG (Study Group 16) meeting in Geneva, Switzerland.
|
|
||||||
|
|
||||||
Thank to Thomas Wiegand and Gary Sullivan for inviting me to the
|
|
||||||
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 (previously known as JPEG, together with ITU-T SG16)
|
|
||||||
meeting in Berlin, Germany.
|
|
||||||
|
|
||||||
Thank to John Korejwa and Massimo Ballerini for inviting me to
|
|
||||||
fruitful consultations in Boston, MA and Milan, Italy.
|
|
||||||
|
|
||||||
Thank to Hendrik Elstner, Roland Fassauer, Simone Zuck, Guenther
|
|
||||||
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
|
|
||||||
at the Digital Images company in Halle for providing me with extra
|
|
||||||
equipment for configuration tests.
|
|
||||||
|
|
||||||
Thank to Richard F. Lyon (then of Foveon Inc.) for fruitful
|
|
||||||
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
|
|
||||||
design and development of this singular software package.
|
|
||||||
|
|
||||||
|
|
||||||
FILE FORMAT WARS
|
|
||||||
================
|
|
||||||
|
|
||||||
The ISO/IEC JTC1/SC29/WG1 standards committee (previously known as JPEG,
|
|
||||||
together with ITU-T SG16) currently promotes different formats containing
|
|
||||||
the name "JPEG" which is misleading because these formats are incompatible
|
|
||||||
with original DCT-based JPEG and are based on faulty technologies.
|
|
||||||
IJG therefore does not and will not support such momentary mistakes
|
|
||||||
(see REFERENCES).
|
|
||||||
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!
|
|
||||||
(In any case, our decoder will remain capable of reading existing JPEG
|
|
||||||
image files indefinitely.)
|
|
||||||
|
|
||||||
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.
|
|
||||||
Furthermore, the ISO committee pretends to "ensure interoperability" with
|
|
||||||
their standards which is not true because their "standards" support only
|
|
||||||
application-specific and proprietary use cases and contain mathematically
|
|
||||||
incorrect code.
|
|
||||||
|
|
||||||
There are currently different distributions in circulation containing the
|
|
||||||
name "libjpeg" which is misleading because they don't have the features and
|
|
||||||
are incompatible with formats supported by actual IJG libjpeg distributions.
|
|
||||||
One of those fakes is released by members of the ISO committee and just uses
|
|
||||||
the name of libjpeg for misdirection of people, similar to the abuse of the
|
|
||||||
name JPEG as described above, while having nothing in common with actual IJG
|
|
||||||
libjpeg distributions and containing mathematically incorrect code.
|
|
||||||
The other one claims to be a "derivative" or "fork" of the original libjpeg,
|
|
||||||
but violates the license conditions as described under LEGAL ISSUES above
|
|
||||||
and violates basic C programming properties.
|
|
||||||
We have no sympathy for the release of misleading, incorrect and illegal
|
|
||||||
distributions derived from obsolete code bases.
|
|
||||||
Don't use an obsolete code base!
|
|
||||||
|
|
||||||
According to the UCC (Uniform Commercial Code) law, IJG has the lawful and
|
|
||||||
legal right to foreclose on certain standardization bodies and other
|
|
||||||
institutions or corporations that knowingly perform substantial and
|
|
||||||
systematic deceptive acts and practices, fraud, theft, and damaging of the
|
|
||||||
value of the people of this planet without their knowing, willing and
|
|
||||||
intentional consent.
|
|
||||||
The titles, ownership, and rights of these institutions and all their assets
|
|
||||||
are now duly secured and held in trust for the free people of this planet.
|
|
||||||
People of the planet, on every country, may have a financial interest in
|
|
||||||
the assets of these former principals, agents, and beneficiaries of the
|
|
||||||
foreclosed institutions and corporations.
|
|
||||||
IJG asserts what is: that each man, woman, and child has unalienable value
|
|
||||||
and rights granted and deposited in them by the Creator and not any one of
|
|
||||||
the people is subordinate to any artificial principality, corporate fiction
|
|
||||||
or the special interest of another without their appropriate knowing,
|
|
||||||
willing and intentional consent made by contract or accommodation agreement.
|
|
||||||
IJG expresses that which already was.
|
|
||||||
The people have already determined and demanded that public administration
|
|
||||||
entities, national governments, and their supporting judicial systems must
|
|
||||||
be fully transparent, accountable, and liable.
|
|
||||||
IJG has secured the value for all concerned free people of the planet.
|
|
||||||
|
|
||||||
A partial list of foreclosed institutions and corporations ("Hall of Shame")
|
|
||||||
is currently prepared and will be published later.
|
|
||||||
|
|
||||||
|
|
||||||
TO DO
|
|
||||||
=====
|
|
||||||
|
|
||||||
Version 9 is the second release of a new generation JPEG standard
|
|
||||||
to overcome the limitations of the original JPEG specification,
|
|
||||||
and is the first true source reference JPEG codec.
|
|
||||||
More features are being prepared for coming releases...
|
|
||||||
|
|
||||||
Please send bug reports, offers of help, etc. to jpeg-info@jpegclub.org.
|
|
9832
source/Irrlicht/jpeglib/aclocal.m4
vendored
9832
source/Irrlicht/jpeglib/aclocal.m4
vendored
File diff suppressed because it is too large
Load Diff
@ -1,134 +0,0 @@
|
|||||||
/*
|
|
||||||
* cderror.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
|
||||||
* Modified 2009 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file defines the error and message codes for the cjpeg/djpeg
|
|
||||||
* applications. These strings are not needed as part of the JPEG library
|
|
||||||
* proper.
|
|
||||||
* Edit this file to add new codes, or to translate the message strings to
|
|
||||||
* some other language.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* To define the enum list of message codes, include this file without
|
|
||||||
* defining macro JMESSAGE. To create a message string table, include it
|
|
||||||
* again with a suitable JMESSAGE definition (see jerror.c for an example).
|
|
||||||
*/
|
|
||||||
#ifndef JMESSAGE
|
|
||||||
#ifndef CDERROR_H
|
|
||||||
#define CDERROR_H
|
|
||||||
/* First time through, define the enum list */
|
|
||||||
#define JMAKE_ENUM_LIST
|
|
||||||
#else
|
|
||||||
/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */
|
|
||||||
#define JMESSAGE(code,string)
|
|
||||||
#endif /* CDERROR_H */
|
|
||||||
#endif /* JMESSAGE */
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
|
|
||||||
#define JMESSAGE(code,string) code ,
|
|
||||||
|
|
||||||
#endif /* JMAKE_ENUM_LIST */
|
|
||||||
|
|
||||||
JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */
|
|
||||||
|
|
||||||
#ifdef BMP_SUPPORTED
|
|
||||||
JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format")
|
|
||||||
JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported")
|
|
||||||
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_COLORSPACE, "BMP output must be grayscale or RGB")
|
|
||||||
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(JTRC_BMP, "%ux%u 24-bit BMP image")
|
|
||||||
JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image")
|
|
||||||
JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image")
|
|
||||||
JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image")
|
|
||||||
#endif /* BMP_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef GIF_SUPPORTED
|
|
||||||
JMESSAGE(JERR_GIF_BUG, "GIF output got confused")
|
|
||||||
JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d")
|
|
||||||
JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB")
|
|
||||||
JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file")
|
|
||||||
JMESSAGE(JERR_GIF_NOT, "Not a GIF file")
|
|
||||||
JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image")
|
|
||||||
JMESSAGE(JTRC_GIF_BADVERSION,
|
|
||||||
"Warning: unexpected GIF version number '%c%c%c'")
|
|
||||||
JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x")
|
|
||||||
JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input")
|
|
||||||
JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file")
|
|
||||||
JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring")
|
|
||||||
JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image")
|
|
||||||
JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits")
|
|
||||||
#endif /* GIF_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef PPM_SUPPORTED
|
|
||||||
JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB")
|
|
||||||
JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file")
|
|
||||||
JMESSAGE(JERR_PPM_NOT, "Not a PPM/PGM file")
|
|
||||||
JMESSAGE(JTRC_PGM, "%ux%u PGM image")
|
|
||||||
JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image")
|
|
||||||
JMESSAGE(JTRC_PPM, "%ux%u PPM image")
|
|
||||||
JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image")
|
|
||||||
#endif /* PPM_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library")
|
|
||||||
JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB")
|
|
||||||
JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE")
|
|
||||||
JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file")
|
|
||||||
JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header")
|
|
||||||
JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header")
|
|
||||||
JMESSAGE(JERR_RLE_NOT, "Not an RLE file")
|
|
||||||
JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE")
|
|
||||||
JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup")
|
|
||||||
JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file")
|
|
||||||
JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d")
|
|
||||||
JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file")
|
|
||||||
JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d")
|
|
||||||
JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d")
|
|
||||||
#endif /* RLE_SUPPORTED */
|
|
||||||
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format")
|
|
||||||
JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file")
|
|
||||||
JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB")
|
|
||||||
JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image")
|
|
||||||
JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image")
|
|
||||||
JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image")
|
|
||||||
#else
|
|
||||||
JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled")
|
|
||||||
#endif /* TARGA_SUPPORTED */
|
|
||||||
|
|
||||||
JMESSAGE(JERR_BAD_CMAP_FILE,
|
|
||||||
"Color map file is invalid or of unsupported format")
|
|
||||||
JMESSAGE(JERR_TOO_MANY_COLORS,
|
|
||||||
"Output file format cannot handle %d colormap entries")
|
|
||||||
JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed")
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT,
|
|
||||||
"Unrecognized input file format --- perhaps you need -targa")
|
|
||||||
#else
|
|
||||||
JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format")
|
|
||||||
#endif
|
|
||||||
JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format")
|
|
||||||
|
|
||||||
#ifdef JMAKE_ENUM_LIST
|
|
||||||
|
|
||||||
JMSG_LASTADDONCODE
|
|
||||||
} ADDON_MESSAGE_CODE;
|
|
||||||
|
|
||||||
#undef JMAKE_ENUM_LIST
|
|
||||||
#endif /* JMAKE_ENUM_LIST */
|
|
||||||
|
|
||||||
/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */
|
|
||||||
#undef JMESSAGE
|
|
@ -1,181 +0,0 @@
|
|||||||
/*
|
|
||||||
* cdjpeg.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains common support routines used by the IJG application
|
|
||||||
* programs (cjpeg, djpeg, jpegtran).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
|
||||||
#include <ctype.h> /* to declare isupper(), tolower() */
|
|
||||||
#ifdef NEED_SIGNAL_CATCHER
|
|
||||||
#include <signal.h> /* to declare signal() */
|
|
||||||
#endif
|
|
||||||
#ifdef USE_SETMODE
|
|
||||||
#include <fcntl.h> /* to declare setmode()'s parameter macros */
|
|
||||||
/* If you have setmode() but not <io.h>, just delete this line: */
|
|
||||||
#include <io.h> /* to declare setmode() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Signal catcher to ensure that temporary files are removed before aborting.
|
|
||||||
* NB: for Amiga Manx C this is actually a global routine named _abort();
|
|
||||||
* we put "#define signal_catcher _abort" in jconfig.h. Talk about bogus...
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef NEED_SIGNAL_CATCHER
|
|
||||||
|
|
||||||
static j_common_ptr sig_cinfo;
|
|
||||||
|
|
||||||
void /* must be global for Manx C */
|
|
||||||
signal_catcher (int signum)
|
|
||||||
{
|
|
||||||
if (sig_cinfo != NULL) {
|
|
||||||
if (sig_cinfo->err != NULL) /* turn off trace output */
|
|
||||||
sig_cinfo->err->trace_level = 0;
|
|
||||||
jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */
|
|
||||||
}
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
enable_signal_catcher (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
sig_cinfo = cinfo;
|
|
||||||
#ifdef SIGINT /* not all systems have SIGINT */
|
|
||||||
signal(SIGINT, signal_catcher);
|
|
||||||
#endif
|
|
||||||
#ifdef SIGTERM /* not all systems have SIGTERM */
|
|
||||||
signal(SIGTERM, signal_catcher);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Optional progress monitor: display a percent-done figure on stderr.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
progress_monitor (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress;
|
|
||||||
int total_passes = prog->pub.total_passes + prog->total_extra_passes;
|
|
||||||
int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit);
|
|
||||||
|
|
||||||
if (percent_done != prog->percent_done) {
|
|
||||||
prog->percent_done = percent_done;
|
|
||||||
if (total_passes > 1) {
|
|
||||||
fprintf(stderr, "\rPass %d/%d: %3d%% ",
|
|
||||||
prog->pub.completed_passes + prog->completed_extra_passes + 1,
|
|
||||||
total_passes, percent_done);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "\r %3d%% ", percent_done);
|
|
||||||
}
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
start_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress)
|
|
||||||
{
|
|
||||||
/* Enable progress display, unless trace output is on */
|
|
||||||
if (cinfo->err->trace_level == 0) {
|
|
||||||
progress->pub.progress_monitor = progress_monitor;
|
|
||||||
progress->completed_extra_passes = 0;
|
|
||||||
progress->total_extra_passes = 0;
|
|
||||||
progress->percent_done = -1;
|
|
||||||
cinfo->progress = &progress->pub;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
end_progress_monitor (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
/* Clear away progress display */
|
|
||||||
if (cinfo->err->trace_level == 0) {
|
|
||||||
fprintf(stderr, "\r \r");
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Case-insensitive matching of possibly-abbreviated keyword switches.
|
|
||||||
* keyword is the constant keyword (must be lower case already),
|
|
||||||
* minchars is length of minimum legal abbreviation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(boolean)
|
|
||||||
keymatch (char * arg, const char * keyword, int minchars)
|
|
||||||
{
|
|
||||||
register int ca, ck;
|
|
||||||
register int nmatched = 0;
|
|
||||||
|
|
||||||
while ((ca = *arg++) != '\0') {
|
|
||||||
if ((ck = *keyword++) == '\0')
|
|
||||||
return FALSE; /* arg longer than keyword, no good */
|
|
||||||
if (isupper(ca)) /* force arg to lcase (assume ck is already) */
|
|
||||||
ca = tolower(ca);
|
|
||||||
if (ca != ck)
|
|
||||||
return FALSE; /* no good */
|
|
||||||
nmatched++; /* count matched characters */
|
|
||||||
}
|
|
||||||
/* reached end of argument; fail if it's too short for unique abbrev */
|
|
||||||
if (nmatched < minchars)
|
|
||||||
return FALSE;
|
|
||||||
return TRUE; /* A-OK */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Routines to establish binary I/O mode for stdin and stdout.
|
|
||||||
* Non-Unix systems often require some hacking to get out of text mode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(FILE *)
|
|
||||||
read_stdin (void)
|
|
||||||
{
|
|
||||||
FILE * input_file = stdin;
|
|
||||||
|
|
||||||
#ifdef USE_SETMODE /* need to hack file mode? */
|
|
||||||
setmode(fileno(stdin), O_BINARY);
|
|
||||||
#endif
|
|
||||||
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
|
||||||
if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "Cannot reopen stdin\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return input_file;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(FILE *)
|
|
||||||
write_stdout (void)
|
|
||||||
{
|
|
||||||
FILE * output_file = stdout;
|
|
||||||
|
|
||||||
#ifdef USE_SETMODE /* need to hack file mode? */
|
|
||||||
setmode(fileno(stdout), O_BINARY);
|
|
||||||
#endif
|
|
||||||
#ifdef USE_FDOPEN /* need to re-open in binary mode? */
|
|
||||||
if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "Cannot reopen stdout\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return output_file;
|
|
||||||
}
|
|
@ -1,187 +0,0 @@
|
|||||||
/*
|
|
||||||
* cdjpeg.h
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains common declarations for the sample applications
|
|
||||||
* cjpeg and djpeg. It is NOT used by the core JPEG library.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */
|
|
||||||
#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
#include "jerror.h" /* get library error codes too */
|
|
||||||
#include "cderror.h" /* get application-specific error codes */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Object interface for cjpeg's source file decoding modules
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct cjpeg_source_struct * cjpeg_source_ptr;
|
|
||||||
|
|
||||||
struct cjpeg_source_struct {
|
|
||||||
JMETHOD(void, start_input, (j_compress_ptr cinfo,
|
|
||||||
cjpeg_source_ptr sinfo));
|
|
||||||
JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo,
|
|
||||||
cjpeg_source_ptr sinfo));
|
|
||||||
JMETHOD(void, finish_input, (j_compress_ptr cinfo,
|
|
||||||
cjpeg_source_ptr sinfo));
|
|
||||||
|
|
||||||
FILE *input_file;
|
|
||||||
|
|
||||||
JSAMPARRAY buffer;
|
|
||||||
JDIMENSION buffer_height;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Object interface for djpeg's output file encoding modules
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct djpeg_dest_struct * djpeg_dest_ptr;
|
|
||||||
|
|
||||||
struct djpeg_dest_struct {
|
|
||||||
/* start_output is called after jpeg_start_decompress finishes.
|
|
||||||
* The color map will be ready at this time, if one is needed.
|
|
||||||
*/
|
|
||||||
JMETHOD(void, start_output, (j_decompress_ptr cinfo,
|
|
||||||
djpeg_dest_ptr dinfo));
|
|
||||||
/* Emit the specified number of pixel rows from the buffer. */
|
|
||||||
JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo,
|
|
||||||
djpeg_dest_ptr dinfo,
|
|
||||||
JDIMENSION rows_supplied));
|
|
||||||
/* Finish up at the end of the image. */
|
|
||||||
JMETHOD(void, finish_output, (j_decompress_ptr cinfo,
|
|
||||||
djpeg_dest_ptr dinfo));
|
|
||||||
|
|
||||||
/* Target file spec; filled in by djpeg.c after object is created. */
|
|
||||||
FILE * output_file;
|
|
||||||
|
|
||||||
/* Output pixel-row buffer. Created by module init or start_output.
|
|
||||||
* Width is cinfo->output_width * cinfo->output_components;
|
|
||||||
* height is buffer_height.
|
|
||||||
*/
|
|
||||||
JSAMPARRAY buffer;
|
|
||||||
JDIMENSION buffer_height;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* cjpeg/djpeg may need to perform extra passes to convert to or from
|
|
||||||
* the source/destination file format. The JPEG library does not know
|
|
||||||
* about these passes, but we'd like them to be counted by the progress
|
|
||||||
* monitor. We use an expanded progress monitor object to hold the
|
|
||||||
* additional pass count.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct cdjpeg_progress_mgr {
|
|
||||||
struct jpeg_progress_mgr pub; /* fields known to JPEG library */
|
|
||||||
int completed_extra_passes; /* extra passes completed */
|
|
||||||
int total_extra_passes; /* total extra */
|
|
||||||
/* last printed percentage stored here to avoid multiple printouts */
|
|
||||||
int percent_done;
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct cdjpeg_progress_mgr * cd_progress_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/* Short forms of external names for systems with brain-damaged linkers. */
|
|
||||||
|
|
||||||
#ifdef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#define jinit_read_bmp jIRdBMP
|
|
||||||
#define jinit_write_bmp jIWrBMP
|
|
||||||
#define jinit_read_gif jIRdGIF
|
|
||||||
#define jinit_write_gif jIWrGIF
|
|
||||||
#define jinit_read_ppm jIRdPPM
|
|
||||||
#define jinit_write_ppm jIWrPPM
|
|
||||||
#define jinit_read_rle jIRdRLE
|
|
||||||
#define jinit_write_rle jIWrRLE
|
|
||||||
#define jinit_read_targa jIRdTarga
|
|
||||||
#define jinit_write_targa jIWrTarga
|
|
||||||
#define read_quant_tables RdQTables
|
|
||||||
#define read_scan_script RdScnScript
|
|
||||||
#define set_quality_ratings SetQRates
|
|
||||||
#define set_quant_slots SetQSlots
|
|
||||||
#define set_sample_factors SetSFacts
|
|
||||||
#define read_color_map RdCMap
|
|
||||||
#define enable_signal_catcher EnSigCatcher
|
|
||||||
#define start_progress_monitor StProgMon
|
|
||||||
#define end_progress_monitor EnProgMon
|
|
||||||
#define read_stdin RdStdin
|
|
||||||
#define write_stdout WrStdout
|
|
||||||
#endif /* NEED_SHORT_EXTERNAL_NAMES */
|
|
||||||
|
|
||||||
/* Module selection routines for I/O modules. */
|
|
||||||
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo));
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo,
|
|
||||||
boolean is_os2));
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo));
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo));
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo));
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo));
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo));
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo));
|
|
||||||
EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo));
|
|
||||||
EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo));
|
|
||||||
|
|
||||||
/* cjpeg support routines (in rdswitch.c) */
|
|
||||||
|
|
||||||
EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename,
|
|
||||||
boolean force_baseline));
|
|
||||||
EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename));
|
|
||||||
EXTERN(boolean) set_quality_ratings JPP((j_compress_ptr cinfo, char *arg,
|
|
||||||
boolean force_baseline));
|
|
||||||
EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg));
|
|
||||||
EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg));
|
|
||||||
|
|
||||||
/* djpeg support routines (in rdcolmap.c) */
|
|
||||||
|
|
||||||
EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile));
|
|
||||||
|
|
||||||
/* common support routines (in cdjpeg.c) */
|
|
||||||
|
|
||||||
EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo));
|
|
||||||
EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo,
|
|
||||||
cd_progress_ptr progress));
|
|
||||||
EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo));
|
|
||||||
EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars));
|
|
||||||
EXTERN(FILE *) read_stdin JPP((void));
|
|
||||||
EXTERN(FILE *) write_stdout JPP((void));
|
|
||||||
|
|
||||||
/* miscellaneous useful macros */
|
|
||||||
|
|
||||||
#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */
|
|
||||||
#define READ_BINARY "r"
|
|
||||||
#define WRITE_BINARY "w"
|
|
||||||
#else
|
|
||||||
#ifdef VMS /* VMS is very nonstandard */
|
|
||||||
#define READ_BINARY "rb", "ctx=stm"
|
|
||||||
#define WRITE_BINARY "wb", "ctx=stm"
|
|
||||||
#else /* standard ANSI-compliant case */
|
|
||||||
#define READ_BINARY "rb"
|
|
||||||
#define WRITE_BINARY "wb"
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef EXIT_FAILURE /* define exit() codes if not provided */
|
|
||||||
#define EXIT_FAILURE 1
|
|
||||||
#endif
|
|
||||||
#ifndef EXIT_SUCCESS
|
|
||||||
#ifdef VMS
|
|
||||||
#define EXIT_SUCCESS 1 /* VMS is very nonstandard */
|
|
||||||
#else
|
|
||||||
#define EXIT_SUCCESS 0
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#ifndef EXIT_WARNING
|
|
||||||
#ifdef VMS
|
|
||||||
#define EXIT_WARNING 1 /* VMS is very nonstandard */
|
|
||||||
#else
|
|
||||||
#define EXIT_WARNING 2
|
|
||||||
#endif
|
|
||||||
#endif
|
|
@ -1,409 +0,0 @@
|
|||||||
CHANGE LOG for Independent JPEG Group's JPEG software
|
|
||||||
|
|
||||||
|
|
||||||
Version 9a 19-Jan-2014
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
Add support for wide gamut color spaces (JFIF version 2).
|
|
||||||
Improve clarity and accuracy in color conversion modules.
|
|
||||||
Note: Requires rebuild of test images.
|
|
||||||
|
|
||||||
Extend the bit depth support to all values from 8 to 12
|
|
||||||
(BITS_IN_JSAMPLE configuration option in jmorecfg.h).
|
|
||||||
jpegtran now supports N bits sample data precision with all N from 8 to 12
|
|
||||||
in a single instance. Thank to Roland Fassauer for inspiration.
|
|
||||||
|
|
||||||
Try to resolve issues with new boolean type definition.
|
|
||||||
Thank also to v4hn for suggestion.
|
|
||||||
|
|
||||||
Enable option to use default Huffman tables for lossless compression
|
|
||||||
(for hardware solution), and in this case improve lossless RGB compression
|
|
||||||
with reversible color transform. Thank to Benny Alexandar for hint.
|
|
||||||
|
|
||||||
Extend the entropy decoding structure, so that extraneous bytes between
|
|
||||||
compressed scan data and following marker can be reported correctly.
|
|
||||||
Thank to Nigel Tao for hint.
|
|
||||||
|
|
||||||
Add jpegtran -wipe option and extension for -crop.
|
|
||||||
Thank to Andrew Senior, David Clunie, and Josef Schmid for suggestion.
|
|
||||||
|
|
||||||
|
|
||||||
Version 9 13-Jan-2013
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
Add cjpeg -rgb1 option to create an RGB JPEG file, and insert
|
|
||||||
a simple reversible color transform into the processing which
|
|
||||||
significantly improves the compression.
|
|
||||||
The recommended command for lossless coding of RGB images is now
|
|
||||||
cjpeg -rgb1 -block 1 -arithmetic.
|
|
||||||
As said, this option improves the compression significantly, but
|
|
||||||
the files are not compatible with JPEG decoders prior to IJG v9
|
|
||||||
due to the included color transform.
|
|
||||||
The used color transform and marker signaling is compatible with
|
|
||||||
other JPEG standards (e.g., JPEG-LS part 2).
|
|
||||||
|
|
||||||
Remove the automatic de-ANSI-fication support (Automake 1.12).
|
|
||||||
Thank also to Nitin A Kamble for suggestion.
|
|
||||||
|
|
||||||
Add remark for jpeg_mem_dest() in jdatadst.c.
|
|
||||||
Thank to Elie-Gregoire Khoury for the hint.
|
|
||||||
|
|
||||||
Support files with invalid component identifiers (created
|
|
||||||
by Adobe PDF). Thank to Robin Watts for the suggestion.
|
|
||||||
|
|
||||||
Adapt full buffer case in jcmainct.c for use with scaled DCT.
|
|
||||||
Thank to Sergii Biloshytskyi for the suggestion.
|
|
||||||
|
|
||||||
Add type identifier for declaration of noreturn functions.
|
|
||||||
Thank to Brett L. Moore for the suggestion.
|
|
||||||
|
|
||||||
Correct argument type in format string, avoid compiler warnings.
|
|
||||||
Thank to Vincent Torri for hint.
|
|
||||||
|
|
||||||
Add missing #include directives in configuration checks, avoid
|
|
||||||
configuration errors. Thank to John Spencer for the hint.
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
New scaled DCTs implemented.
|
|
||||||
djpeg now supports scalings N/8 with all N from 1 to 16.
|
|
||||||
cjpeg now supports scalings 8/N with all N from 1 to 16.
|
|
||||||
Scaled DCTs with size larger than 8 are now also used for resolving the
|
|
||||||
common 2x2 chroma subsampling case without additional spatial resampling.
|
|
||||||
Separate spatial resampling for those kind of files is now only necessary
|
|
||||||
for N>8 scaling cases.
|
|
||||||
Furthermore, separate scaled DCT functions are provided for direct resolving
|
|
||||||
of the common asymmetric subsampling cases (2x1 and 1x2) without additional
|
|
||||||
spatial resampling.
|
|
||||||
|
|
||||||
cjpeg -quality option has been extended for support of separate quality
|
|
||||||
settings for luminance and chrominance (or in general, for every provided
|
|
||||||
quantization table slot).
|
|
||||||
New API function jpeg_default_qtables() and q_scale_factor array in library.
|
|
||||||
|
|
||||||
Added -nosmooth option to cjpeg, complementary to djpeg.
|
|
||||||
New variable "do_fancy_downsampling" in library, complement to fancy
|
|
||||||
upsampling. Fancy upsampling now uses direct DCT scaling with sizes
|
|
||||||
larger than 8. The old method is not reversible and has been removed.
|
|
||||||
|
|
||||||
Support arithmetic entropy encoding and decoding.
|
|
||||||
Added files jaricom.c, jcarith.c, jdarith.c.
|
|
||||||
|
|
||||||
Straighten the file structure:
|
|
||||||
Removed files jidctred.c, jcphuff.c, jchuff.h, jdphuff.c, jdhuff.h.
|
|
||||||
|
|
||||||
jpegtran has a new "lossless" cropping feature.
|
|
||||||
|
|
||||||
Implement -perfect option in jpegtran, new API function
|
|
||||||
jtransform_perfect_transform() in transupp. (DP 204_perfect.dpatch)
|
|
||||||
|
|
||||||
Better error messages for jpegtran fopen failure.
|
|
||||||
(DP 203_jpegtran_errmsg.dpatch)
|
|
||||||
|
|
||||||
Fix byte order issue with 16bit PPM/PGM files in rdppm.c/wrppm.c:
|
|
||||||
according to Netpbm, the de facto standard implementation of the PNM formats,
|
|
||||||
the most significant byte is first. (DP 203_rdppm.dpatch)
|
|
||||||
|
|
||||||
Add -raw option to rdjpgcom not to mangle the output.
|
|
||||||
(DP 205_rdjpgcom_raw.dpatch)
|
|
||||||
|
|
||||||
Make rdjpgcom locale aware. (DP 201_rdjpgcom_locale.dpatch)
|
|
||||||
|
|
||||||
Add extern "C" to jpeglib.h.
|
|
||||||
This avoids the need to put extern "C" { ... } around #include "jpeglib.h"
|
|
||||||
in your C++ application. Defining the symbol DONT_USE_EXTERN_C in the
|
|
||||||
configuration prevents this. (DP 202_jpeglib.h_c++.dpatch)
|
|
||||||
|
|
||||||
|
|
||||||
Version 6b 27-Mar-1998
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
jpegtran has new features for lossless image transformations (rotation
|
|
||||||
and flipping) as well as "lossless" reduction to grayscale.
|
|
||||||
|
|
||||||
jpegtran now copies comments by default; it has a -copy switch to enable
|
|
||||||
copying all APPn blocks as well, or to suppress comments. (Formerly it
|
|
||||||
always suppressed comments and APPn blocks.) jpegtran now also preserves
|
|
||||||
JFIF version and resolution information.
|
|
||||||
|
|
||||||
New decompressor library feature: COM and APPn markers found in the input
|
|
||||||
file can be saved in memory for later use by the application. (Before,
|
|
||||||
you had to code this up yourself with a custom marker processor.)
|
|
||||||
|
|
||||||
There is an unused field "void * client_data" now in compress and decompress
|
|
||||||
parameter structs; this may be useful in some applications.
|
|
||||||
|
|
||||||
JFIF version number information is now saved by the decoder and accepted by
|
|
||||||
the encoder. jpegtran uses this to copy the source file's version number,
|
|
||||||
to ensure "jpegtran -copy all" won't create bogus files that contain JFXX
|
|
||||||
extensions but claim to be version 1.01. Applications that generate their
|
|
||||||
own JFXX extension markers also (finally) have a supported way to cause the
|
|
||||||
encoder to emit JFIF version number 1.02.
|
|
||||||
|
|
||||||
djpeg's trace mode reports JFIF 1.02 thumbnail images as such, rather
|
|
||||||
than as unknown APP0 markers.
|
|
||||||
|
|
||||||
In -verbose mode, djpeg and rdjpgcom will try to print the contents of
|
|
||||||
APP12 markers as text. Some digital cameras store useful text information
|
|
||||||
in APP12 markers.
|
|
||||||
|
|
||||||
Handling of truncated data streams is more robust: blocks beyond the one in
|
|
||||||
which the error occurs will be output as uniform gray, or left unchanged
|
|
||||||
if decoding a progressive JPEG. The appearance no longer depends on the
|
|
||||||
Huffman tables being used.
|
|
||||||
|
|
||||||
Huffman tables are checked for validity much more carefully than before.
|
|
||||||
|
|
||||||
To avoid the Unisys LZW patent, djpeg's GIF output capability has been
|
|
||||||
changed to produce "uncompressed GIFs", and cjpeg's GIF input capability
|
|
||||||
has been removed altogether. We're not happy about it either, but there
|
|
||||||
seems to be no good alternative.
|
|
||||||
|
|
||||||
The configure script now supports building libjpeg as a shared library
|
|
||||||
on many flavors of Unix (all the ones that GNU libtool knows how to
|
|
||||||
build shared libraries for). Use "./configure --enable-shared" to
|
|
||||||
try this out.
|
|
||||||
|
|
||||||
New jconfig file and makefiles for Microsoft Visual C++ and Developer Studio.
|
|
||||||
Also, a jconfig file and a build script for Metrowerks CodeWarrior
|
|
||||||
on Apple Macintosh. makefile.dj has been updated for DJGPP v2, and there
|
|
||||||
are miscellaneous other minor improvements in the makefiles.
|
|
||||||
|
|
||||||
jmemmac.c now knows how to create temporary files following Mac System 7
|
|
||||||
conventions.
|
|
||||||
|
|
||||||
djpeg's -map switch is now able to read raw-format PPM files reliably.
|
|
||||||
|
|
||||||
cjpeg -progressive -restart no longer generates any unnecessary DRI markers.
|
|
||||||
|
|
||||||
Multiple calls to jpeg_simple_progression for a single JPEG object
|
|
||||||
no longer leak memory.
|
|
||||||
|
|
||||||
|
|
||||||
Version 6a 7-Feb-96
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Library initialization sequence modified to detect version mismatches
|
|
||||||
and struct field packing mismatches between library and calling application.
|
|
||||||
This change requires applications to be recompiled, but does not require
|
|
||||||
any application source code change.
|
|
||||||
|
|
||||||
All routine declarations changed to the style "GLOBAL(type) name ...",
|
|
||||||
that is, GLOBAL, LOCAL, METHODDEF, EXTERN are now macros taking the
|
|
||||||
routine's return type as an argument. This makes it possible to add
|
|
||||||
Microsoft-style linkage keywords to all the routines by changing just
|
|
||||||
these macros. Note that any application code that was using these macros
|
|
||||||
will have to be changed.
|
|
||||||
|
|
||||||
DCT coefficient quantization tables are now stored in normal array order
|
|
||||||
rather than zigzag order. Application code that calls jpeg_add_quant_table,
|
|
||||||
or otherwise manipulates quantization tables directly, will need to be
|
|
||||||
changed. If you need to make such code work with either older or newer
|
|
||||||
versions of the library, a test like "#if JPEG_LIB_VERSION >= 61" is
|
|
||||||
recommended.
|
|
||||||
|
|
||||||
djpeg's trace capability now dumps DQT tables in natural order, not zigzag
|
|
||||||
order. This allows the trace output to be made into a "-qtables" file
|
|
||||||
more easily.
|
|
||||||
|
|
||||||
New system-dependent memory manager module for use on Apple Macintosh.
|
|
||||||
|
|
||||||
Fix bug in cjpeg's -smooth option: last one or two scanlines would be
|
|
||||||
duplicates of the prior line unless the image height mod 16 was 1 or 2.
|
|
||||||
|
|
||||||
Repair minor problems in VMS, BCC, MC6 makefiles.
|
|
||||||
|
|
||||||
New configure script based on latest GNU Autoconf.
|
|
||||||
|
|
||||||
Correct the list of include files needed by MetroWerks C for ccommand().
|
|
||||||
|
|
||||||
Numerous small documentation updates.
|
|
||||||
|
|
||||||
|
|
||||||
Version 6 2-Aug-95
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Progressive JPEG support: library can read and write full progressive JPEG
|
|
||||||
files. A "buffered image" mode supports incremental decoding for on-the-fly
|
|
||||||
display of progressive images. Simply recompiling an existing IJG-v5-based
|
|
||||||
decoder with v6 should allow it to read progressive files, though of course
|
|
||||||
without any special progressive display.
|
|
||||||
|
|
||||||
New "jpegtran" application performs lossless transcoding between different
|
|
||||||
JPEG formats; primarily, it can be used to convert baseline to progressive
|
|
||||||
JPEG and vice versa. In support of jpegtran, the library now allows lossless
|
|
||||||
reading and writing of JPEG files as DCT coefficient arrays. This ability
|
|
||||||
may be of use in other applications.
|
|
||||||
|
|
||||||
Notes for programmers:
|
|
||||||
* We changed jpeg_start_decompress() to be able to suspend; this makes all
|
|
||||||
decoding modes available to suspending-input applications. However,
|
|
||||||
existing applications that use suspending input will need to be changed
|
|
||||||
to check the return value from jpeg_start_decompress(). You don't need to
|
|
||||||
do anything if you don't use a suspending data source.
|
|
||||||
* We changed the interface to the virtual array routines: access_virt_array
|
|
||||||
routines now take a count of the number of rows to access this time. The
|
|
||||||
last parameter to request_virt_array routines is now interpreted as the
|
|
||||||
maximum number of rows that may be accessed at once, but not necessarily
|
|
||||||
the height of every access.
|
|
||||||
|
|
||||||
|
|
||||||
Version 5b 15-Mar-95
|
|
||||||
---------------------
|
|
||||||
|
|
||||||
Correct bugs with grayscale images having v_samp_factor > 1.
|
|
||||||
|
|
||||||
jpeg_write_raw_data() now supports output suspension.
|
|
||||||
|
|
||||||
Correct bugs in "configure" script for case of compiling in
|
|
||||||
a directory other than the one containing the source files.
|
|
||||||
|
|
||||||
Repair bug in jquant1.c: sometimes didn't use as many colors as it could.
|
|
||||||
|
|
||||||
Borland C makefile and jconfig file work under either MS-DOS or OS/2.
|
|
||||||
|
|
||||||
Miscellaneous improvements to documentation.
|
|
||||||
|
|
||||||
|
|
||||||
Version 5a 7-Dec-94
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Changed color conversion roundoff behavior so that grayscale values are
|
|
||||||
represented exactly. (This causes test image files to change.)
|
|
||||||
|
|
||||||
Make ordered dither use 16x16 instead of 4x4 pattern for a small quality
|
|
||||||
improvement.
|
|
||||||
|
|
||||||
New configure script based on latest GNU Autoconf.
|
|
||||||
Fix configure script to handle CFLAGS correctly.
|
|
||||||
Rename *.auto files to *.cfg, so that configure script still works if
|
|
||||||
file names have been truncated for DOS.
|
|
||||||
|
|
||||||
Fix bug in rdbmp.c: didn't allow for extra data between header and image.
|
|
||||||
|
|
||||||
Modify rdppm.c/wrppm.c to handle 2-byte raw PPM/PGM formats for 12-bit data.
|
|
||||||
|
|
||||||
Fix several bugs in rdrle.c.
|
|
||||||
|
|
||||||
NEED_SHORT_EXTERNAL_NAMES option was broken.
|
|
||||||
|
|
||||||
Revise jerror.h/jerror.c for more flexibility in message table.
|
|
||||||
|
|
||||||
Repair oversight in jmemname.c NO_MKTEMP case: file could be there
|
|
||||||
but unreadable.
|
|
||||||
|
|
||||||
|
|
||||||
Version 5 24-Sep-94
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
Version 5 represents a nearly complete redesign and rewrite of the IJG
|
|
||||||
software. Major user-visible changes include:
|
|
||||||
* Automatic configuration simplifies installation for most Unix systems.
|
|
||||||
* A range of speed vs. image quality tradeoffs are supported.
|
|
||||||
This includes resizing of an image during decompression: scaling down
|
|
||||||
by a factor of 1/2, 1/4, or 1/8 is handled very efficiently.
|
|
||||||
* New programs rdjpgcom and wrjpgcom allow insertion and extraction
|
|
||||||
of text comments in a JPEG file.
|
|
||||||
|
|
||||||
The application programmer's interface to the library has changed completely.
|
|
||||||
Notable improvements include:
|
|
||||||
* We have eliminated the use of callback routines for handling the
|
|
||||||
uncompressed image data. The application now sees the library as a
|
|
||||||
set of routines that it calls to read or write image data on a
|
|
||||||
scanline-by-scanline basis.
|
|
||||||
* The application image data is represented in a conventional interleaved-
|
|
||||||
pixel format, rather than as a separate array for each color channel.
|
|
||||||
This can save a copying step in many programs.
|
|
||||||
* The handling of compressed data has been cleaned up: the application can
|
|
||||||
supply routines to source or sink the compressed data. It is possible to
|
|
||||||
suspend processing on source/sink buffer overrun, although this is not
|
|
||||||
supported in all operating modes.
|
|
||||||
* All static state has been eliminated from the library, so that multiple
|
|
||||||
instances of compression or decompression can be active concurrently.
|
|
||||||
* JPEG abbreviated datastream formats are supported, ie, quantization and
|
|
||||||
Huffman tables can be stored separately from the image data.
|
|
||||||
* And not only that, but the documentation of the library has improved
|
|
||||||
considerably!
|
|
||||||
|
|
||||||
|
|
||||||
The last widely used release before the version 5 rewrite was version 4A of
|
|
||||||
18-Feb-93. Change logs before that point have been discarded, since they
|
|
||||||
are not of much interest after the rewrite.
|
|
@ -1,387 +0,0 @@
|
|||||||
.TH CJPEG 1 "23 November 2013"
|
|
||||||
.SH NAME
|
|
||||||
cjpeg \- compress an image file to a JPEG file
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B cjpeg
|
|
||||||
[
|
|
||||||
.I options
|
|
||||||
]
|
|
||||||
[
|
|
||||||
.I filename
|
|
||||||
]
|
|
||||||
.LP
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.LP
|
|
||||||
.B cjpeg
|
|
||||||
compresses the named image file, or the standard input if no file is
|
|
||||||
named, and produces a JPEG/JFIF file on the standard output.
|
|
||||||
The currently supported input file formats are: PPM (PBMPLUS color
|
|
||||||
format), PGM (PBMPLUS gray-scale format), BMP, Targa, and RLE (Utah Raster
|
|
||||||
Toolkit format). (RLE is supported only if the URT library is available.)
|
|
||||||
.SH OPTIONS
|
|
||||||
All switch names may be abbreviated; for example,
|
|
||||||
.B \-grayscale
|
|
||||||
may be written
|
|
||||||
.B \-gray
|
|
||||||
or
|
|
||||||
.BR \-gr .
|
|
||||||
Most of the "basic" switches can be abbreviated to as little as one letter.
|
|
||||||
Upper and lower case are equivalent (thus
|
|
||||||
.B \-BMP
|
|
||||||
is the same as
|
|
||||||
.BR \-bmp ).
|
|
||||||
British spellings are also accepted (e.g.,
|
|
||||||
.BR \-greyscale ),
|
|
||||||
though for brevity these are not mentioned below.
|
|
||||||
.PP
|
|
||||||
The basic switches are:
|
|
||||||
.TP
|
|
||||||
.BI \-quality " N[,...]"
|
|
||||||
Scale quantization tables to adjust image quality. Quality is 0 (worst) to
|
|
||||||
100 (best); default is 75. (See below for more info.)
|
|
||||||
.TP
|
|
||||||
.B \-grayscale
|
|
||||||
Create monochrome JPEG file from color input. Be sure to use this switch when
|
|
||||||
compressing a grayscale BMP file, because
|
|
||||||
.B cjpeg
|
|
||||||
isn't bright enough to notice whether a BMP file uses only shades of gray.
|
|
||||||
By saying
|
|
||||||
.BR \-grayscale ,
|
|
||||||
you'll get a smaller JPEG file that takes less time to process.
|
|
||||||
.TP
|
|
||||||
.B \-rgb
|
|
||||||
Create RGB JPEG file.
|
|
||||||
Using this switch suppresses the conversion from RGB
|
|
||||||
colorspace input to the default YCbCr JPEG colorspace.
|
|
||||||
You can use this switch in combination with the
|
|
||||||
.BI \-block " N"
|
|
||||||
switch (see below) for lossless JPEG coding.
|
|
||||||
See also the
|
|
||||||
.B \-rgb1
|
|
||||||
switch below.
|
|
||||||
.TP
|
|
||||||
.B \-optimize
|
|
||||||
Perform optimization of entropy encoding parameters. Without this, default
|
|
||||||
encoding parameters are used.
|
|
||||||
.B \-optimize
|
|
||||||
usually makes the JPEG file a little smaller, but
|
|
||||||
.B cjpeg
|
|
||||||
runs somewhat slower and needs much more memory. Image quality and speed of
|
|
||||||
decompression are unaffected by
|
|
||||||
.BR \-optimize .
|
|
||||||
.TP
|
|
||||||
.B \-progressive
|
|
||||||
Create progressive JPEG file (see below).
|
|
||||||
.TP
|
|
||||||
.BI \-scale " M/N"
|
|
||||||
Scale the output image by a factor M/N. Currently supported scale factors are
|
|
||||||
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
|
|
||||||
.B \-targa
|
|
||||||
Input file is Targa format. Targa files that contain an "identification"
|
|
||||||
field will not be automatically recognized by
|
|
||||||
.BR cjpeg ;
|
|
||||||
for such files you must specify
|
|
||||||
.B \-targa
|
|
||||||
to make
|
|
||||||
.B cjpeg
|
|
||||||
treat the input as Targa format.
|
|
||||||
For most Targa files, you won't need this switch.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-quality
|
|
||||||
switch lets you trade off compressed file size against quality of the
|
|
||||||
reconstructed image: the higher the quality setting, the larger the JPEG file,
|
|
||||||
and the closer the output image will be to the original input. Normally you
|
|
||||||
want to use the lowest quality setting (smallest file) that decompresses into
|
|
||||||
something visually indistinguishable from the original image. For this
|
|
||||||
purpose the quality setting should be between 50 and 95; the default of 75 is
|
|
||||||
often about right. If you see defects at
|
|
||||||
.B \-quality
|
|
||||||
75, then go up 5 or 10 counts at a time until you are happy with the output
|
|
||||||
image. (The optimal setting will vary from one image to another.)
|
|
||||||
.PP
|
|
||||||
.B \-quality
|
|
||||||
100 will generate a quantization table of all 1's, minimizing loss in the
|
|
||||||
quantization step (but there is still information loss in subsampling, as well
|
|
||||||
as roundoff error). This setting is mainly of interest for experimental
|
|
||||||
purposes. Quality values above about 95 are
|
|
||||||
.B not
|
|
||||||
recommended for normal use; the compressed file size goes up dramatically for
|
|
||||||
hardly any gain in output image quality.
|
|
||||||
.PP
|
|
||||||
In the other direction, quality values below 50 will produce very small files
|
|
||||||
of low image quality. Settings around 5 to 10 might be useful in preparing an
|
|
||||||
index of a large image library, for example. Try
|
|
||||||
.B \-quality
|
|
||||||
2 (or so) for some amusing Cubist effects. (Note: quality
|
|
||||||
values below about 25 generate 2-byte quantization tables, which are
|
|
||||||
considered optional in the JPEG standard.
|
|
||||||
.B cjpeg
|
|
||||||
emits a warning message when you give such a quality value, because some
|
|
||||||
other JPEG programs may be unable to decode the resulting file. Use
|
|
||||||
.B \-baseline
|
|
||||||
if you need to ensure compatibility at low quality values.)
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-quality
|
|
||||||
option has been extended in IJG version 7 for support of separate quality
|
|
||||||
settings for luminance and chrominance (or in general, for every provided
|
|
||||||
quantization table slot). This feature is useful for high-quality
|
|
||||||
applications which cannot accept the damage of color data by coarse
|
|
||||||
subsampling settings. You can now easily reduce the color data amount more
|
|
||||||
smoothly with finer control without separate subsampling. The resulting file
|
|
||||||
is fully compliant with standard JPEG decoders.
|
|
||||||
Note that the
|
|
||||||
.B \-quality
|
|
||||||
ratings refer to the quantization table slots, and that the last value is
|
|
||||||
replicated if there are more q-table slots than parameters. The default
|
|
||||||
q-table slots are 0 for luminance and 1 for chrominance with default tables as
|
|
||||||
given in the JPEG standard. This is compatible with the old 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 tables can be set
|
|
||||||
with
|
|
||||||
.B \-qtables
|
|
||||||
and assigned to components with
|
|
||||||
.B \-qslots
|
|
||||||
parameter (see the "wizard" switches below).
|
|
||||||
.B Caution:
|
|
||||||
You must explicitly add
|
|
||||||
.BI \-sample " 1x1"
|
|
||||||
for efficient separate color
|
|
||||||
quality selection, since the default value used by library is 2x2!
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-progressive
|
|
||||||
switch creates a "progressive JPEG" file. In this type of JPEG file, the data
|
|
||||||
is stored in multiple scans of increasing quality. If the file is being
|
|
||||||
transmitted over a slow communications link, the decoder can use the first
|
|
||||||
scan to display a low-quality image very quickly, and can then improve the
|
|
||||||
display with each subsequent scan. The final image is exactly equivalent to a
|
|
||||||
standard JPEG file of the same quality setting, and the total file size is
|
|
||||||
about the same --- often a little smaller.
|
|
||||||
.PP
|
|
||||||
Switches for advanced users:
|
|
||||||
.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 \-rgb1
|
|
||||||
Create RGB JPEG file with reversible color transform.
|
|
||||||
Works like the
|
|
||||||
.B \-rgb
|
|
||||||
switch (see above) and inserts a simple reversible color transform
|
|
||||||
into the processing which significantly improves the compression.
|
|
||||||
Use this switch in combination with the
|
|
||||||
.BI \-block " N"
|
|
||||||
switch (see above) for lossless JPEG coding.
|
|
||||||
.B Caution:
|
|
||||||
A decoder with inverse color transform support is required for
|
|
||||||
this feature. Reversible color transform support is not yet
|
|
||||||
widely implemented, so many decoders will be unable to view
|
|
||||||
a reversible color transformed JPEG file at all.
|
|
||||||
.TP
|
|
||||||
.B \-bgycc
|
|
||||||
Create big gamut YCC JPEG file.
|
|
||||||
In this type of encoding the color difference components are quantized
|
|
||||||
further by a factor of 2 compared to the normal Cb/Cr values, thus creating
|
|
||||||
space to allow larger color values with higher saturation than the normal
|
|
||||||
gamut limits to be encoded. In order to compensate for the loss of color
|
|
||||||
fidelity compared to a normal YCC encoded file, the color quantization
|
|
||||||
tables can be adjusted accordingly. For example,
|
|
||||||
.B cjpeg \-bgycc \-quality
|
|
||||||
80,90 will give similar results as
|
|
||||||
.B cjpeg \-quality
|
|
||||||
80.
|
|
||||||
.B Caution:
|
|
||||||
For correct decompression a decoder with big gamut YCC support (JFIF
|
|
||||||
version 2) is required. An old decoder may or may not display a big
|
|
||||||
gamut YCC encoded JPEG file, depending on JFIF version check and
|
|
||||||
corresponding warning/error configuration. In case of a granted
|
|
||||||
decompression the old decoder will display the image with half
|
|
||||||
saturated colors.
|
|
||||||
.TP
|
|
||||||
.B \-dct int
|
|
||||||
Use integer DCT method (default).
|
|
||||||
.TP
|
|
||||||
.B \-dct fast
|
|
||||||
Use fast integer DCT (less accurate).
|
|
||||||
.TP
|
|
||||||
.B \-dct float
|
|
||||||
Use floating-point DCT method.
|
|
||||||
The float method is very slightly more accurate than the int method, but is
|
|
||||||
much slower unless your machine has very fast floating-point hardware. Also
|
|
||||||
note that results of the floating-point method may vary slightly across
|
|
||||||
machines, while the integer methods should give the same results everywhere.
|
|
||||||
The fast integer method is much less accurate than the other two.
|
|
||||||
.TP
|
|
||||||
.B \-nosmooth
|
|
||||||
Don't use high-quality downsampling.
|
|
||||||
.TP
|
|
||||||
.BI \-restart " N"
|
|
||||||
Emit a JPEG restart marker every N MCU rows, or every N MCU blocks if "B" is
|
|
||||||
attached to the number.
|
|
||||||
.B \-restart 0
|
|
||||||
(the default) means no restart markers.
|
|
||||||
.TP
|
|
||||||
.BI \-smooth " N"
|
|
||||||
Smooth the input image to eliminate dithering noise. N, ranging from 1 to
|
|
||||||
100, indicates the strength of smoothing. 0 (the default) means no smoothing.
|
|
||||||
.TP
|
|
||||||
.BI \-maxmemory " N"
|
|
||||||
Set limit for amount of memory to use in processing large images. Value is
|
|
||||||
in thousands of bytes, or millions of bytes if "M" is attached to the
|
|
||||||
number. For example,
|
|
||||||
.B \-max 4m
|
|
||||||
selects 4000000 bytes. If more space is needed, temporary files will be used.
|
|
||||||
.TP
|
|
||||||
.BI \-outfile " name"
|
|
||||||
Send output image to the named file, not to standard output.
|
|
||||||
.TP
|
|
||||||
.B \-verbose
|
|
||||||
Enable debug printout. More
|
|
||||||
.BR \-v 's
|
|
||||||
give more output. Also, version information is printed at startup.
|
|
||||||
.TP
|
|
||||||
.B \-debug
|
|
||||||
Same as
|
|
||||||
.BR \-verbose .
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-restart
|
|
||||||
option inserts extra markers that allow a JPEG decoder to resynchronize after
|
|
||||||
a transmission error. Without restart markers, any damage to a compressed
|
|
||||||
file will usually ruin the image from the point of the error to the end of the
|
|
||||||
image; with restart markers, the damage is usually confined to the portion of
|
|
||||||
the image up to the next restart marker. Of course, the restart markers
|
|
||||||
occupy extra space. We recommend
|
|
||||||
.B \-restart 1
|
|
||||||
for images that will be transmitted across unreliable networks such as Usenet.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-smooth
|
|
||||||
option filters the input to eliminate fine-scale noise. This is often useful
|
|
||||||
when converting dithered images to JPEG: a moderate smoothing factor of 10 to
|
|
||||||
50 gets rid of dithering patterns in the input file, resulting in a smaller
|
|
||||||
JPEG file and a better-looking image. Too large a smoothing factor will
|
|
||||||
visibly blur the image, however.
|
|
||||||
.PP
|
|
||||||
Switches for wizards:
|
|
||||||
.TP
|
|
||||||
.B \-baseline
|
|
||||||
Force baseline-compatible quantization tables to be generated. This clamps
|
|
||||||
quantization values to 8 bits even at low quality settings. (This switch is
|
|
||||||
poorly named, since it does not ensure that the output is actually baseline
|
|
||||||
JPEG. For example, you can use
|
|
||||||
.B \-baseline
|
|
||||||
and
|
|
||||||
.B \-progressive
|
|
||||||
together.)
|
|
||||||
.TP
|
|
||||||
.BI \-qtables " file"
|
|
||||||
Use the quantization tables given in the specified text file.
|
|
||||||
.TP
|
|
||||||
.BI \-qslots " N[,...]"
|
|
||||||
Select which quantization table to use for each color component.
|
|
||||||
.TP
|
|
||||||
.BI \-sample " HxV[,...]"
|
|
||||||
Set JPEG sampling factors for each color component.
|
|
||||||
.TP
|
|
||||||
.BI \-scans " file"
|
|
||||||
Use the scan script given in the specified text file.
|
|
||||||
.PP
|
|
||||||
The "wizard" switches are intended for experimentation with JPEG. If you
|
|
||||||
don't know what you are doing, \fBdon't use them\fR. These switches are
|
|
||||||
documented further in the file wizard.txt.
|
|
||||||
.SH EXAMPLES
|
|
||||||
.LP
|
|
||||||
This example compresses the PPM file foo.ppm with a quality factor of
|
|
||||||
60 and saves the output as foo.jpg:
|
|
||||||
.IP
|
|
||||||
.B cjpeg \-quality
|
|
||||||
.I 60 foo.ppm
|
|
||||||
.B >
|
|
||||||
.I foo.jpg
|
|
||||||
.SH HINTS
|
|
||||||
Color GIF files are not the ideal input for JPEG; JPEG is really intended for
|
|
||||||
compressing full-color (24-bit) images. In particular, don't try to convert
|
|
||||||
cartoons, line drawings, and other images that have only a few distinct
|
|
||||||
colors. GIF works great on these, JPEG does not. If you want to convert a
|
|
||||||
GIF to JPEG, you should experiment with
|
|
||||||
.BR cjpeg 's
|
|
||||||
.B \-quality
|
|
||||||
and
|
|
||||||
.B \-smooth
|
|
||||||
options to get a satisfactory conversion.
|
|
||||||
.B \-smooth 10
|
|
||||||
or so is often helpful.
|
|
||||||
.PP
|
|
||||||
Avoid running an image through a series of JPEG compression/decompression
|
|
||||||
cycles. Image quality loss will accumulate; after ten or so cycles the image
|
|
||||||
may be noticeably worse than it was after one cycle. It's best to use a
|
|
||||||
lossless format while manipulating an image, then convert to JPEG format when
|
|
||||||
you are ready to file the image away.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-optimize
|
|
||||||
option to
|
|
||||||
.B cjpeg
|
|
||||||
is worth using when you are making a "final" version for posting or archiving.
|
|
||||||
It's also a win when you are using low quality settings to make very small
|
|
||||||
JPEG files; the percentage improvement is often a lot more than it is on
|
|
||||||
larger files. (At present,
|
|
||||||
.B \-optimize
|
|
||||||
mode is always selected when generating progressive JPEG files.)
|
|
||||||
.SH ENVIRONMENT
|
|
||||||
.TP
|
|
||||||
.B JPEGMEM
|
|
||||||
If this environment variable is set, its value is the default memory limit.
|
|
||||||
The value is specified as described for the
|
|
||||||
.B \-maxmemory
|
|
||||||
switch.
|
|
||||||
.B JPEGMEM
|
|
||||||
overrides the default value specified when the program was compiled, and
|
|
||||||
itself is overridden by an explicit
|
|
||||||
.BR \-maxmemory .
|
|
||||||
.SH SEE ALSO
|
|
||||||
.BR djpeg (1),
|
|
||||||
.BR jpegtran (1),
|
|
||||||
.BR rdjpgcom (1),
|
|
||||||
.BR wrjpgcom (1)
|
|
||||||
.br
|
|
||||||
.BR ppm (5),
|
|
||||||
.BR pgm (5)
|
|
||||||
.br
|
|
||||||
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|
||||||
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
|
||||||
.SH AUTHOR
|
|
||||||
Independent JPEG Group
|
|
||||||
.SH BUGS
|
|
||||||
GIF input files are no longer supported, to avoid the Unisys LZW patent
|
|
||||||
(now expired).
|
|
||||||
(Conversion of GIF files to JPEG is usually a bad idea anyway.)
|
|
||||||
.PP
|
|
||||||
Not all variants of BMP and Targa file formats are supported.
|
|
||||||
.PP
|
|
||||||
The
|
|
||||||
.B \-targa
|
|
||||||
switch is not a bug, it's a feature. (It would be a bug if the Targa format
|
|
||||||
designers had not been clueless.)
|
|
@ -1,664 +0,0 @@
|
|||||||
/*
|
|
||||||
* cjpeg.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains a command-line user interface for the JPEG compressor.
|
|
||||||
* It should work on any system with Unix- or MS-DOS-style command lines.
|
|
||||||
*
|
|
||||||
* Two different command line styles are permitted, depending on the
|
|
||||||
* compile-time switch TWO_FILE_COMMANDLINE:
|
|
||||||
* cjpeg [options] inputfile outputfile
|
|
||||||
* cjpeg [options] [inputfile]
|
|
||||||
* In the second style, output is always to standard output, which you'd
|
|
||||||
* normally redirect to a file or pipe to some other program. Input is
|
|
||||||
* either from a named file or from standard input (typically redirected).
|
|
||||||
* The second style is convenient on Unix but is unhelpful on systems that
|
|
||||||
* don't support pipes. Also, you MUST use the first style if your system
|
|
||||||
* doesn't do binary I/O to stdin/stdout.
|
|
||||||
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
|
||||||
* cjpeg [options] -outfile outputfile inputfile
|
|
||||||
* works regardless of which command line style is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
|
||||||
#include "jversion.h" /* for version message */
|
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
|
||||||
#include <console.h> /* ... and this */
|
|
||||||
#endif
|
|
||||||
#ifdef THINK_C
|
|
||||||
#include <console.h> /* Think declares it here */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
|
||||||
|
|
||||||
#define JMESSAGE(code,string) string ,
|
|
||||||
|
|
||||||
static const char * const cdjpeg_message_table[] = {
|
|
||||||
#include "cderror.h"
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This routine determines what format the input file is,
|
|
||||||
* and selects the appropriate input-reading module.
|
|
||||||
*
|
|
||||||
* To determine which family of input formats the file belongs to,
|
|
||||||
* we may look only at the first byte of the file, since C does not
|
|
||||||
* guarantee that more than one character can be pushed back with ungetc.
|
|
||||||
* Looking at additional bytes would require one of these approaches:
|
|
||||||
* 1) assume we can fseek() the input file (fails for piped input);
|
|
||||||
* 2) assume we can push back more than one character (works in
|
|
||||||
* some C implementations, but unportable);
|
|
||||||
* 3) provide our own buffering (breaks input readers that want to use
|
|
||||||
* stdio directly, such as the RLE library);
|
|
||||||
* or 4) don't put back the data, and modify the input_init methods to assume
|
|
||||||
* they start reading after the start of file (also breaks RLE library).
|
|
||||||
* #1 is attractive for MS-DOS but is untenable on Unix.
|
|
||||||
*
|
|
||||||
* The most portable solution for file types that can't be identified by their
|
|
||||||
* first byte is to make the user tell us what they are. This is also the
|
|
||||||
* only approach for "raw" file types that contain only arbitrary values.
|
|
||||||
* We presently apply this method for Targa files. Most of the time Targa
|
|
||||||
* files start with 0x00, so we recognize that case. Potentially, however,
|
|
||||||
* a Targa file could start with any byte value (byte 0 is the length of the
|
|
||||||
* seldom-used ID field), so we provide a switch to force Targa input mode.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static boolean is_targa; /* records user -targa switch */
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(cjpeg_source_ptr)
|
|
||||||
select_file_type (j_compress_ptr cinfo, FILE * infile)
|
|
||||||
{
|
|
||||||
int c;
|
|
||||||
|
|
||||||
if (is_targa) {
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
return jinit_read_targa(cinfo);
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_TGA_NOTCOMP);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((c = getc(infile)) == EOF)
|
|
||||||
ERREXIT(cinfo, JERR_INPUT_EMPTY);
|
|
||||||
if (ungetc(c, infile) == EOF)
|
|
||||||
ERREXIT(cinfo, JERR_UNGETC_FAILED);
|
|
||||||
|
|
||||||
switch (c) {
|
|
||||||
#ifdef BMP_SUPPORTED
|
|
||||||
case 'B':
|
|
||||||
return jinit_read_bmp(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef GIF_SUPPORTED
|
|
||||||
case 'G':
|
|
||||||
return jinit_read_gif(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef PPM_SUPPORTED
|
|
||||||
case 'P':
|
|
||||||
return jinit_read_ppm(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
case 'R':
|
|
||||||
return jinit_read_rle(cinfo);
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
case 0x00:
|
|
||||||
return jinit_read_targa(cinfo);
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_UNKNOWN_FORMAT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL; /* suppress compiler warnings */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Argument-parsing code.
|
|
||||||
* The switch parser is designed to be useful with DOS-style command line
|
|
||||||
* syntax, ie, intermixed switches and file names, where only the switches
|
|
||||||
* to the left of a given file name affect processing of that file.
|
|
||||||
* The main program in this file doesn't actually use this capability...
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static const char * progname; /* program name for error messages */
|
|
||||||
static char * outfilename; /* for -outfile switch */
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
usage (void)
|
|
||||||
/* complain about bad command line */
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s [switches] ", progname);
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
|
||||||
fprintf(stderr, "inputfile outputfile\n");
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "[inputfile]\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf(stderr, "Switches (names may be abbreviated):\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, " -rgb Create RGB JPEG file\n");
|
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
|
||||||
fprintf(stderr, " -optimize Optimize Huffman table (smaller file, but slow compression)\n");
|
|
||||||
#endif
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
fprintf(stderr, " -progressive Create progressive JPEG file\n");
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
|
||||||
fprintf(stderr, " -scale M/N Scale image by fraction M/N, eg, 1/2\n");
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
fprintf(stderr, " -targa Input file is Targa format (usually not needed)\n");
|
|
||||||
#endif
|
|
||||||
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
|
|
||||||
#if JPEG_LIB_VERSION_MAJOR >= 9
|
|
||||||
fprintf(stderr, " -rgb1 Create RGB JPEG file with reversible color transform\n");
|
|
||||||
fprintf(stderr, " -bgycc Create big gamut YCC JPEG file\n");
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -nosmooth Don't use high-quality downsampling\n");
|
|
||||||
fprintf(stderr, " -restart N Set restart interval in rows, or in blocks with B\n");
|
|
||||||
#ifdef INPUT_SMOOTHING_SUPPORTED
|
|
||||||
fprintf(stderr, " -smooth N Smooth dithered input (N=1..100 is strength)\n");
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
|
||||||
fprintf(stderr, " -outfile name Specify name for output file\n");
|
|
||||||
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
|
||||||
fprintf(stderr, "Switches for wizards:\n");
|
|
||||||
fprintf(stderr, " -baseline Force baseline quantization tables\n");
|
|
||||||
fprintf(stderr, " -qtables file Use quantization tables given in file\n");
|
|
||||||
fprintf(stderr, " -qslots N[,...] Set component quantization tables\n");
|
|
||||||
fprintf(stderr, " -sample HxV[,...] Set component sampling factors\n");
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
fprintf(stderr, " -scans file Create multi-scan JPEG per script file\n");
|
|
||||||
#endif
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(int)
|
|
||||||
parse_switches (j_compress_ptr cinfo, int argc, char **argv,
|
|
||||||
int last_file_arg_seen, boolean for_real)
|
|
||||||
/* Parse optional switches.
|
|
||||||
* Returns argv[] index of first file-name argument (== argc if none).
|
|
||||||
* Any file names with indexes <= last_file_arg_seen are ignored;
|
|
||||||
* they have presumably been processed in a previous iteration.
|
|
||||||
* (Pass 0 for last_file_arg_seen on the first or only iteration.)
|
|
||||||
* for_real is FALSE on the first (dummy) pass; we may skip any expensive
|
|
||||||
* processing.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int argn;
|
|
||||||
char * arg;
|
|
||||||
boolean force_baseline;
|
|
||||||
boolean simple_progressive;
|
|
||||||
char * qualityarg = NULL; /* saves -quality parm if any */
|
|
||||||
char * qtablefile = NULL; /* saves -qtables filename if any */
|
|
||||||
char * qslotsarg = NULL; /* saves -qslots parm if any */
|
|
||||||
char * samplearg = NULL; /* saves -sample parm if any */
|
|
||||||
char * scansarg = NULL; /* saves -scans parm if any */
|
|
||||||
|
|
||||||
/* Set up default JPEG parameters. */
|
|
||||||
|
|
||||||
force_baseline = FALSE; /* by default, allow 16-bit quantizers */
|
|
||||||
simple_progressive = FALSE;
|
|
||||||
is_targa = FALSE;
|
|
||||||
outfilename = NULL;
|
|
||||||
cinfo->err->trace_level = 0;
|
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
|
||||||
|
|
||||||
for (argn = 1; argn < argc; argn++) {
|
|
||||||
arg = argv[argn];
|
|
||||||
if (*arg != '-') {
|
|
||||||
/* Not a switch, must be a file name argument */
|
|
||||||
if (argn <= last_file_arg_seen) {
|
|
||||||
outfilename = NULL; /* -outfile applies to just one input file */
|
|
||||||
continue; /* ignore this name if previously processed */
|
|
||||||
}
|
|
||||||
break; /* else done parsing switches */
|
|
||||||
}
|
|
||||||
arg++; /* advance past switch marker character */
|
|
||||||
|
|
||||||
if (keymatch(arg, "arithmetic", 1)) {
|
|
||||||
/* Use arithmetic coding. */
|
|
||||||
#ifdef C_ARITH_CODING_SUPPORTED
|
|
||||||
cinfo->arith_code = TRUE;
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, arithmetic coding not supported\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "baseline", 2)) {
|
|
||||||
/* Force baseline-compatible output (8-bit quantizer values). */
|
|
||||||
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)) {
|
|
||||||
/* Select DCT algorithm. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (keymatch(argv[argn], "int", 1)) {
|
|
||||||
cinfo->dct_method = JDCT_ISLOW;
|
|
||||||
} else if (keymatch(argv[argn], "fast", 2)) {
|
|
||||||
cinfo->dct_method = JDCT_IFAST;
|
|
||||||
} else if (keymatch(argv[argn], "float", 2)) {
|
|
||||||
cinfo->dct_method = JDCT_FLOAT;
|
|
||||||
} else
|
|
||||||
usage();
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
|
||||||
/* Enable debug printouts. */
|
|
||||||
/* On first -d, print version identification */
|
|
||||||
static boolean printed_version = FALSE;
|
|
||||||
|
|
||||||
if (! printed_version) {
|
|
||||||
fprintf(stderr, "Independent JPEG Group's CJPEG, version %s\n%s\n",
|
|
||||||
JVERSION, JCOPYRIGHT);
|
|
||||||
printed_version = TRUE;
|
|
||||||
}
|
|
||||||
cinfo->err->trace_level++;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) {
|
|
||||||
/* Force a monochrome JPEG file to be generated. */
|
|
||||||
jpeg_set_colorspace(cinfo, JCS_GRAYSCALE);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "rgb", 3) || keymatch(arg, "rgb1", 4)) {
|
|
||||||
/* Force an RGB JPEG file to be generated. */
|
|
||||||
#if JPEG_LIB_VERSION_MAJOR >= 9
|
|
||||||
/* Note: Entropy table assignment in jpeg_set_colorspace depends
|
|
||||||
* on color_transform.
|
|
||||||
*/
|
|
||||||
cinfo->color_transform = arg[3] ? JCT_SUBTRACT_GREEN : JCT_NONE;
|
|
||||||
#endif
|
|
||||||
jpeg_set_colorspace(cinfo, JCS_RGB);
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "bgycc", 5)) {
|
|
||||||
/* Force a big gamut YCC JPEG file to be generated. */
|
|
||||||
#if JPEG_LIB_VERSION_MAJOR >= 9 && \
|
|
||||||
(JPEG_LIB_VERSION_MAJOR > 9 || JPEG_LIB_VERSION_MINOR >= 1)
|
|
||||||
jpeg_set_colorspace(cinfo, JCS_BG_YCC);
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, BG_YCC colorspace not supported\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "maxmemory", 3)) {
|
|
||||||
/* Maximum memory in Kb (or Mb with 'm'). */
|
|
||||||
long lval;
|
|
||||||
char ch = 'x';
|
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
|
||||||
usage();
|
|
||||||
if (ch == 'm' || ch == 'M')
|
|
||||||
lval *= 1000L;
|
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "nosmooth", 3)) {
|
|
||||||
/* Suppress fancy downsampling. */
|
|
||||||
cinfo->do_fancy_downsampling = FALSE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "optimize", 1) || keymatch(arg, "optimise", 1)) {
|
|
||||||
/* Enable entropy parm optimization. */
|
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
|
||||||
cinfo->optimize_coding = TRUE;
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, entropy optimization was not compiled\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "outfile", 4)) {
|
|
||||||
/* Set output file name. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
outfilename = argv[argn]; /* save it away for later use */
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "progressive", 1)) {
|
|
||||||
/* Select simple progressive mode. */
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
simple_progressive = TRUE;
|
|
||||||
/* We must postpone execution until num_components is known. */
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, progressive output was not compiled\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "quality", 1)) {
|
|
||||||
/* Quality ratings (quantization table scaling factors). */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
qualityarg = argv[argn];
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "qslots", 2)) {
|
|
||||||
/* Quantization table slot numbers. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
qslotsarg = argv[argn];
|
|
||||||
/* Must delay setting qslots until after we have processed any
|
|
||||||
* colorspace-determining switches, since jpeg_set_colorspace sets
|
|
||||||
* default quant table numbers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "qtables", 2)) {
|
|
||||||
/* Quantization tables fetched from file. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
qtablefile = argv[argn];
|
|
||||||
/* We postpone actually reading the file in case -quality comes later. */
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "restart", 1)) {
|
|
||||||
/* Restart interval in MCU rows (or in MCUs with 'b'). */
|
|
||||||
long lval;
|
|
||||||
char ch = 'x';
|
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
|
||||||
usage();
|
|
||||||
if (lval < 0 || lval > 65535L)
|
|
||||||
usage();
|
|
||||||
if (ch == 'b' || ch == 'B') {
|
|
||||||
cinfo->restart_interval = (unsigned int) lval;
|
|
||||||
cinfo->restart_in_rows = 0; /* else prior '-restart n' overrides me */
|
|
||||||
} else {
|
|
||||||
cinfo->restart_in_rows = (int) lval;
|
|
||||||
/* restart_interval will be computed during startup */
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "sample", 2)) {
|
|
||||||
/* Set sampling factors. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
samplearg = argv[argn];
|
|
||||||
/* Must delay setting sample factors until after we have processed any
|
|
||||||
* colorspace-determining switches, since jpeg_set_colorspace sets
|
|
||||||
* default sampling factors.
|
|
||||||
*/
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "scale", 4)) {
|
|
||||||
/* Scale the image by a fraction M/N. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%u/%u",
|
|
||||||
&cinfo->scale_num, &cinfo->scale_denom) != 2)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "scans", 4)) {
|
|
||||||
/* Set scan script. */
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
scansarg = argv[argn];
|
|
||||||
/* We must postpone reading the file in case -progressive appears. */
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "%s: sorry, multi-scan output was not compiled\n",
|
|
||||||
progname);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "smooth", 2)) {
|
|
||||||
/* Set input smoothing factor. */
|
|
||||||
int val;
|
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%d", &val) != 1)
|
|
||||||
usage();
|
|
||||||
if (val < 0 || val > 100)
|
|
||||||
usage();
|
|
||||||
cinfo->smoothing_factor = val;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "targa", 1)) {
|
|
||||||
/* Input file is Targa format. */
|
|
||||||
is_targa = TRUE;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
usage(); /* bogus switch */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Post-switch-scanning cleanup */
|
|
||||||
|
|
||||||
if (for_real) {
|
|
||||||
|
|
||||||
/* Set quantization tables for selected quality. */
|
|
||||||
/* Some or all may be overridden if -qtables is present. */
|
|
||||||
if (qualityarg != NULL) /* process -quality if it was present */
|
|
||||||
if (! set_quality_ratings(cinfo, qualityarg, force_baseline))
|
|
||||||
usage();
|
|
||||||
|
|
||||||
if (qtablefile != NULL) /* process -qtables if it was present */
|
|
||||||
if (! read_quant_tables(cinfo, qtablefile, force_baseline))
|
|
||||||
usage();
|
|
||||||
|
|
||||||
if (qslotsarg != NULL) /* process -qslots if it was present */
|
|
||||||
if (! set_quant_slots(cinfo, qslotsarg))
|
|
||||||
usage();
|
|
||||||
|
|
||||||
if (samplearg != NULL) /* process -sample if it was present */
|
|
||||||
if (! set_sample_factors(cinfo, samplearg))
|
|
||||||
usage();
|
|
||||||
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
if (simple_progressive) /* process -progressive; -scans can override */
|
|
||||||
jpeg_simple_progression(cinfo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
if (scansarg != NULL) /* process -scans if it was present */
|
|
||||||
if (! read_scan_script(cinfo, scansarg))
|
|
||||||
usage();
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
return argn; /* return index of next arg (file name) */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The main program.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct jpeg_compress_struct cinfo;
|
|
||||||
struct jpeg_error_mgr jerr;
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
struct cdjpeg_progress_mgr progress;
|
|
||||||
#endif
|
|
||||||
int file_index;
|
|
||||||
cjpeg_source_ptr src_mgr;
|
|
||||||
FILE * input_file;
|
|
||||||
FILE * output_file;
|
|
||||||
JDIMENSION num_scanlines;
|
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
|
||||||
#ifdef USE_CCOMMAND
|
|
||||||
argc = ccommand(&argv);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
progname = argv[0];
|
|
||||||
if (progname == NULL || progname[0] == 0)
|
|
||||||
progname = "cjpeg"; /* in case C library doesn't provide it */
|
|
||||||
|
|
||||||
/* Initialize the JPEG compression object with default error handling. */
|
|
||||||
cinfo.err = jpeg_std_error(&jerr);
|
|
||||||
jpeg_create_compress(&cinfo);
|
|
||||||
/* Add some application-specific error messages (from cderror.h) */
|
|
||||||
jerr.addon_message_table = cdjpeg_message_table;
|
|
||||||
jerr.first_addon_message = JMSG_FIRSTADDONCODE;
|
|
||||||
jerr.last_addon_message = JMSG_LASTADDONCODE;
|
|
||||||
|
|
||||||
/* Now safe to enable signal catcher. */
|
|
||||||
#ifdef NEED_SIGNAL_CATCHER
|
|
||||||
enable_signal_catcher((j_common_ptr) &cinfo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Initialize JPEG parameters.
|
|
||||||
* Much of this may be overridden later.
|
|
||||||
* In particular, we don't yet know the input file's color space,
|
|
||||||
* but we need to provide some value for jpeg_set_defaults() to work.
|
|
||||||
*/
|
|
||||||
|
|
||||||
cinfo.in_color_space = JCS_RGB; /* arbitrary guess */
|
|
||||||
jpeg_set_defaults(&cinfo);
|
|
||||||
|
|
||||||
/* Scan command line to find file names.
|
|
||||||
* It is convenient to use just one switch-parsing routine, but the switch
|
|
||||||
* values read here are ignored; we will rescan the switches after opening
|
|
||||||
* the input file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
|
||||||
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
|
||||||
/* Must have either -outfile switch or explicit output file name */
|
|
||||||
if (outfilename == NULL) {
|
|
||||||
if (file_index != argc-2) {
|
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
|
||||||
progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
outfilename = argv[file_index+1];
|
|
||||||
} else {
|
|
||||||
if (file_index != argc-1) {
|
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
|
||||||
progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Unix style: expect zero or one file name */
|
|
||||||
if (file_index < argc-1) {
|
|
||||||
fprintf(stderr, "%s: only one input file\n", progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
#endif /* TWO_FILE_COMMANDLINE */
|
|
||||||
|
|
||||||
/* Open the input file. */
|
|
||||||
if (file_index < argc) {
|
|
||||||
if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* default input file is stdin */
|
|
||||||
input_file = read_stdin();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the output file. */
|
|
||||||
if (outfilename != NULL) {
|
|
||||||
if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* default output file is stdout */
|
|
||||||
output_file = write_stdout();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
start_progress_monitor((j_common_ptr) &cinfo, &progress);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Figure out the input file format, and set up to read it. */
|
|
||||||
src_mgr = select_file_type(&cinfo, input_file);
|
|
||||||
src_mgr->input_file = input_file;
|
|
||||||
|
|
||||||
/* Read the input file header to obtain file size & colorspace. */
|
|
||||||
(*src_mgr->start_input) (&cinfo, src_mgr);
|
|
||||||
|
|
||||||
/* Now that we know input colorspace, fix colorspace-dependent defaults */
|
|
||||||
jpeg_default_colorspace(&cinfo);
|
|
||||||
|
|
||||||
/* Adjust default compression parameters by re-parsing the options */
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
|
|
||||||
|
|
||||||
/* Specify data destination for compression */
|
|
||||||
jpeg_stdio_dest(&cinfo, output_file);
|
|
||||||
|
|
||||||
/* Start compressor */
|
|
||||||
jpeg_start_compress(&cinfo, TRUE);
|
|
||||||
|
|
||||||
/* Process data */
|
|
||||||
while (cinfo.next_scanline < cinfo.image_height) {
|
|
||||||
num_scanlines = (*src_mgr->get_pixel_rows) (&cinfo, src_mgr);
|
|
||||||
(void) jpeg_write_scanlines(&cinfo, src_mgr->buffer, num_scanlines);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finish compression and release memory */
|
|
||||||
(*src_mgr->finish_input) (&cinfo, src_mgr);
|
|
||||||
jpeg_finish_compress(&cinfo);
|
|
||||||
jpeg_destroy_compress(&cinfo);
|
|
||||||
|
|
||||||
/* Close files, if we opened them */
|
|
||||||
if (input_file != stdin)
|
|
||||||
fclose(input_file);
|
|
||||||
if (output_file != stdout)
|
|
||||||
fclose(output_file);
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
end_progress_monitor((j_common_ptr) &cinfo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* All done. */
|
|
||||||
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
|
||||||
return 0; /* suppress no-return-value warnings */
|
|
||||||
}
|
|
@ -1,402 +0,0 @@
|
|||||||
/*
|
|
||||||
* ckconfig.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1994, Thomas G. Lane.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This program is intended to help you determine how to configure the JPEG
|
|
||||||
* software for installation on a particular system. The idea is to try to
|
|
||||||
* compile and execute this program. If your compiler fails to compile the
|
|
||||||
* program, make changes as indicated in the comments below. Once you can
|
|
||||||
* compile the program, run it, and it will produce a "jconfig.h" file for
|
|
||||||
* your system.
|
|
||||||
*
|
|
||||||
* As a general rule, each time you try to compile this program,
|
|
||||||
* pay attention only to the *first* error message you get from the compiler.
|
|
||||||
* Many C compilers will issue lots of spurious error messages once they
|
|
||||||
* have gotten confused. Go to the line indicated in the first error message,
|
|
||||||
* and read the comments preceding that line to see what to change.
|
|
||||||
*
|
|
||||||
* Almost all of the edits you may need to make to this program consist of
|
|
||||||
* changing a line that reads "#define SOME_SYMBOL" to "#undef SOME_SYMBOL",
|
|
||||||
* or vice versa. This is called defining or undefining that symbol.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/* First we must see if your system has the include files we need.
|
|
||||||
* We start out with the assumption that your system has all the ANSI-standard
|
|
||||||
* include files. If you get any error trying to include one of these files,
|
|
||||||
* undefine the corresponding HAVE_xxx symbol.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_STDDEF_H /* replace 'define' by 'undef' if error here */
|
|
||||||
#ifdef HAVE_STDDEF_H /* next line will be skipped if you undef... */
|
|
||||||
#include <stddef.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define HAVE_STDLIB_H /* same thing for stdlib.h */
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h> /* If you ain't got this, you ain't got C. */
|
|
||||||
|
|
||||||
/* We have to see if your string functions are defined by
|
|
||||||
* strings.h (old BSD convention) or string.h (everybody else).
|
|
||||||
* We try the non-BSD convention first; define NEED_BSD_STRINGS
|
|
||||||
* if the compiler says it can't find string.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
|
|
||||||
#ifdef NEED_BSD_STRINGS
|
|
||||||
#include <strings.h>
|
|
||||||
#else
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* On some systems (especially older Unix machines), type size_t is
|
|
||||||
* defined only in the include file <sys/types.h>. If you get a failure
|
|
||||||
* on the size_t test below, try defining NEED_SYS_TYPES_H.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NEED_SYS_TYPES_H /* start by assuming we don't need it */
|
|
||||||
#ifdef NEED_SYS_TYPES_H
|
|
||||||
#include <sys/types.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Usually type size_t is defined in one of the include files we've included
|
|
||||||
* above. If not, you'll get an error on the "typedef size_t my_size_t;" line.
|
|
||||||
* In that case, first try defining NEED_SYS_TYPES_H just above.
|
|
||||||
* If that doesn't work, you'll have to search through your system library
|
|
||||||
* to figure out which include file defines "size_t". Look for a line that
|
|
||||||
* says "typedef something-or-other size_t;". Then, change the line below
|
|
||||||
* that says "#include <someincludefile.h>" to instead include the file
|
|
||||||
* you found size_t in, and define NEED_SPECIAL_INCLUDE. If you can't find
|
|
||||||
* type size_t anywhere, try replacing "#include <someincludefile.h>" with
|
|
||||||
* "typedef unsigned int size_t;".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NEED_SPECIAL_INCLUDE /* assume we DON'T need it, for starters */
|
|
||||||
|
|
||||||
#ifdef NEED_SPECIAL_INCLUDE
|
|
||||||
#include <someincludefile.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef size_t my_size_t; /* The payoff: do we have size_t now? */
|
|
||||||
|
|
||||||
|
|
||||||
/* The next question is whether your compiler supports ANSI-style function
|
|
||||||
* prototypes. You need to know this in order to choose between using
|
|
||||||
* makefile.ansi and using makefile.unix.
|
|
||||||
* The #define line below is set to assume you have ANSI function prototypes.
|
|
||||||
* If you get an error in this group of lines, undefine HAVE_PROTOTYPES.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int testfunction (int arg1, int * arg2); /* check prototypes */
|
|
||||||
|
|
||||||
struct methods_struct { /* check method-pointer declarations */
|
|
||||||
int (*error_exit) (char *msgtext);
|
|
||||||
int (*trace_message) (char *msgtext);
|
|
||||||
int (*another_method) (void);
|
|
||||||
};
|
|
||||||
|
|
||||||
int testfunction (int arg1, int * arg2) /* check definitions */
|
|
||||||
{
|
|
||||||
return arg2[arg1];
|
|
||||||
}
|
|
||||||
|
|
||||||
int test2function (void) /* check void arg list */
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Now we want to find out if your compiler knows what "unsigned char" means.
|
|
||||||
* If you get an error on the "unsigned char un_char;" line,
|
|
||||||
* then undefine HAVE_UNSIGNED_CHAR.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
unsigned char un_char;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Now we want to find out if your compiler knows what "unsigned short" means.
|
|
||||||
* If you get an error on the "unsigned short un_short;" line,
|
|
||||||
* then undefine HAVE_UNSIGNED_SHORT.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
|
|
||||||
#ifdef HAVE_UNSIGNED_SHORT
|
|
||||||
unsigned short un_short;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Now we want to find out if your compiler understands type "void".
|
|
||||||
* If you get an error anywhere in here, undefine HAVE_VOID.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_VOID
|
|
||||||
|
|
||||||
#ifdef HAVE_VOID
|
|
||||||
/* Caution: a C++ compiler will insist on complete prototypes */
|
|
||||||
typedef void * void_ptr; /* check void * */
|
|
||||||
#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */
|
|
||||||
typedef void (*void_func) (int a, int b);
|
|
||||||
#else
|
|
||||||
typedef void (*void_func) ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES /* check void function result */
|
|
||||||
void test3function (void_ptr arg1, void_func arg2)
|
|
||||||
#else
|
|
||||||
void test3function (arg1, arg2)
|
|
||||||
void_ptr arg1;
|
|
||||||
void_func arg2;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char * locptr = (char *) arg1; /* check casting to and from void * */
|
|
||||||
arg1 = (void *) locptr;
|
|
||||||
(*arg2) (1, 2); /* check call of fcn returning void */
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Now we want to find out if your compiler knows what "const" means.
|
|
||||||
* If you get an error here, undefine HAVE_CONST.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define HAVE_CONST
|
|
||||||
|
|
||||||
#ifdef HAVE_CONST
|
|
||||||
static const int carray[3] = {1, 2, 3};
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int test4function (const int arg1)
|
|
||||||
#else
|
|
||||||
int test4function (arg1)
|
|
||||||
const int arg1;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
return carray[arg1];
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* If you get an error or warning about this structure definition,
|
|
||||||
* define INCOMPLETE_TYPES_BROKEN.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifndef INCOMPLETE_TYPES_BROKEN
|
|
||||||
typedef struct undefined_structure * undef_struct_ptr;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* If you get an error about duplicate names,
|
|
||||||
* define NEED_SHORT_EXTERNAL_NAMES.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
|
|
||||||
#ifndef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
|
|
||||||
int possibly_duplicate_function ()
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int possibly_dupli_function ()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/************************************************************************
|
|
||||||
* OK, that's it. You should not have to change anything beyond this
|
|
||||||
* point in order to compile and execute this program. (You might get
|
|
||||||
* some warnings, but you can ignore them.)
|
|
||||||
* When you run the program, it will make a couple more tests that it
|
|
||||||
* can do automatically, and then it will create jconfig.h and print out
|
|
||||||
* any additional suggestions it has.
|
|
||||||
************************************************************************
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int is_char_signed (int arg)
|
|
||||||
#else
|
|
||||||
int is_char_signed (arg)
|
|
||||||
int arg;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if (arg == 189) { /* expected result for unsigned char */
|
|
||||||
return 0; /* type char is unsigned */
|
|
||||||
}
|
|
||||||
else if (arg != -67) { /* expected result for signed char */
|
|
||||||
printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n");
|
|
||||||
printf("I fear the JPEG software will not work at all.\n\n");
|
|
||||||
}
|
|
||||||
return 1; /* assume char is signed otherwise */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int is_shifting_signed (long arg)
|
|
||||||
#else
|
|
||||||
int is_shifting_signed (arg)
|
|
||||||
long arg;
|
|
||||||
#endif
|
|
||||||
/* See whether right-shift on a long is signed or not. */
|
|
||||||
{
|
|
||||||
long res = arg >> 4;
|
|
||||||
|
|
||||||
if (res == -0x7F7E80CL) { /* expected result for signed shift */
|
|
||||||
return 1; /* right shift is signed */
|
|
||||||
}
|
|
||||||
/* see if unsigned-shift hack will fix it. */
|
|
||||||
/* we can't just test exact value since it depends on width of long... */
|
|
||||||
res |= (~0L) << (32-4);
|
|
||||||
if (res == -0x7F7E80CL) { /* expected result now? */
|
|
||||||
return 0; /* right shift is unsigned */
|
|
||||||
}
|
|
||||||
printf("Right shift isn't acting as I expect it to.\n");
|
|
||||||
printf("I fear the JPEG software will not work at all.\n\n");
|
|
||||||
return 0; /* try it with unsigned anyway */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int main (int argc, char ** argv)
|
|
||||||
#else
|
|
||||||
int main (argc, argv)
|
|
||||||
int argc;
|
|
||||||
char ** argv;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char signed_char_check = (char) (-67);
|
|
||||||
FILE *outfile;
|
|
||||||
|
|
||||||
/* Attempt to write jconfig.h */
|
|
||||||
if ((outfile = fopen("jconfig.h", "w")) == NULL) {
|
|
||||||
printf("Failed to write jconfig.h\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Write out all the info */
|
|
||||||
fprintf(outfile, "/* jconfig.h --- generated by ckconfig.c */\n");
|
|
||||||
fprintf(outfile, "/* see jconfig.txt for explanations */\n\n");
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
fprintf(outfile, "#define HAVE_PROTOTYPES\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef HAVE_PROTOTYPES\n");
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_UNSIGNED_CHAR
|
|
||||||
fprintf(outfile, "#define HAVE_UNSIGNED_CHAR\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef HAVE_UNSIGNED_CHAR\n");
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_UNSIGNED_SHORT
|
|
||||||
fprintf(outfile, "#define HAVE_UNSIGNED_SHORT\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef HAVE_UNSIGNED_SHORT\n");
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_VOID
|
|
||||||
fprintf(outfile, "/* #define void char */\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#define void char\n");
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_CONST
|
|
||||||
fprintf(outfile, "/* #define const */\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#define const\n");
|
|
||||||
#endif
|
|
||||||
if (is_char_signed((int) signed_char_check))
|
|
||||||
fprintf(outfile, "#undef CHAR_IS_UNSIGNED\n");
|
|
||||||
else
|
|
||||||
fprintf(outfile, "#define CHAR_IS_UNSIGNED\n");
|
|
||||||
#ifdef HAVE_STDDEF_H
|
|
||||||
fprintf(outfile, "#define HAVE_STDDEF_H\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef HAVE_STDDEF_H\n");
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
fprintf(outfile, "#define HAVE_STDLIB_H\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef HAVE_STDLIB_H\n");
|
|
||||||
#endif
|
|
||||||
#ifdef NEED_BSD_STRINGS
|
|
||||||
fprintf(outfile, "#define NEED_BSD_STRINGS\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef NEED_BSD_STRINGS\n");
|
|
||||||
#endif
|
|
||||||
#ifdef NEED_SYS_TYPES_H
|
|
||||||
fprintf(outfile, "#define NEED_SYS_TYPES_H\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef NEED_SYS_TYPES_H\n");
|
|
||||||
#endif
|
|
||||||
fprintf(outfile, "#undef NEED_FAR_POINTERS\n");
|
|
||||||
#ifdef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
fprintf(outfile, "#define NEED_SHORT_EXTERNAL_NAMES\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef NEED_SHORT_EXTERNAL_NAMES\n");
|
|
||||||
#endif
|
|
||||||
#ifdef INCOMPLETE_TYPES_BROKEN
|
|
||||||
fprintf(outfile, "#define INCOMPLETE_TYPES_BROKEN\n");
|
|
||||||
#else
|
|
||||||
fprintf(outfile, "#undef INCOMPLETE_TYPES_BROKEN\n");
|
|
||||||
#endif
|
|
||||||
fprintf(outfile, "\n#ifdef JPEG_INTERNALS\n\n");
|
|
||||||
if (is_shifting_signed(-0x7F7E80B1L))
|
|
||||||
fprintf(outfile, "#undef RIGHT_SHIFT_IS_UNSIGNED\n");
|
|
||||||
else
|
|
||||||
fprintf(outfile, "#define RIGHT_SHIFT_IS_UNSIGNED\n");
|
|
||||||
fprintf(outfile, "\n#endif /* JPEG_INTERNALS */\n");
|
|
||||||
fprintf(outfile, "\n#ifdef JPEG_CJPEG_DJPEG\n\n");
|
|
||||||
fprintf(outfile, "#define BMP_SUPPORTED /* BMP image file format */\n");
|
|
||||||
fprintf(outfile, "#define GIF_SUPPORTED /* GIF image file format */\n");
|
|
||||||
fprintf(outfile, "#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */\n");
|
|
||||||
fprintf(outfile, "#undef RLE_SUPPORTED /* Utah RLE image file format */\n");
|
|
||||||
fprintf(outfile, "#define TARGA_SUPPORTED /* Targa image file format */\n\n");
|
|
||||||
fprintf(outfile, "#undef TWO_FILE_COMMANDLINE /* You may need this on non-Unix systems */\n");
|
|
||||||
fprintf(outfile, "#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */\n");
|
|
||||||
fprintf(outfile, "#undef DONT_USE_B_MODE\n");
|
|
||||||
fprintf(outfile, "/* #define PROGRESS_REPORT */ /* optional */\n");
|
|
||||||
fprintf(outfile, "\n#endif /* JPEG_CJPEG_DJPEG */\n");
|
|
||||||
|
|
||||||
/* Close the jconfig.h file */
|
|
||||||
fclose(outfile);
|
|
||||||
|
|
||||||
/* User report */
|
|
||||||
printf("Configuration check for Independent JPEG Group's software done.\n");
|
|
||||||
printf("\nI have written the jconfig.h file for you.\n\n");
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
printf("You should use makefile.ansi as the starting point for your Makefile.\n");
|
|
||||||
#else
|
|
||||||
printf("You should use makefile.unix as the starting point for your Makefile.\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef NEED_SPECIAL_INCLUDE
|
|
||||||
printf("\nYou'll need to change jconfig.h to include the system include file\n");
|
|
||||||
printf("that you found type size_t in, or add a direct definition of type\n");
|
|
||||||
printf("size_t if that's what you used. Just add it to the end.\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
@ -1,118 +0,0 @@
|
|||||||
IJG JPEG LIBRARY: CODING RULES
|
|
||||||
|
|
||||||
Copyright (C) 1991-1996, Thomas G. Lane.
|
|
||||||
This file is part of the Independent JPEG Group's software.
|
|
||||||
For conditions of distribution and use, see the accompanying README file.
|
|
||||||
|
|
||||||
|
|
||||||
Since numerous people will be contributing code and bug fixes, it's important
|
|
||||||
to establish a common coding style. The goal of using similar coding styles
|
|
||||||
is much more important than the details of just what that style is.
|
|
||||||
|
|
||||||
In general we follow the recommendations of "Recommended C Style and Coding
|
|
||||||
Standards" revision 6.1 (Cannon et al. as modified by Spencer, Keppel and
|
|
||||||
Brader). This document is available in the IJG FTP archive (see
|
|
||||||
jpeg/doc/cstyle.ms.tbl.Z, or cstyle.txt.Z for those without nroff/tbl).
|
|
||||||
|
|
||||||
Block comments should be laid out thusly:
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Block comments in this style.
|
|
||||||
*/
|
|
||||||
|
|
||||||
We indent statements in K&R style, e.g.,
|
|
||||||
if (test) {
|
|
||||||
then-part;
|
|
||||||
} else {
|
|
||||||
else-part;
|
|
||||||
}
|
|
||||||
with two spaces per indentation level. (This indentation convention is
|
|
||||||
handled automatically by GNU Emacs and many other text editors.)
|
|
||||||
|
|
||||||
Multi-word names should be written in lower case with underscores, e.g.,
|
|
||||||
multi_word_name (not multiWordName). Preprocessor symbols and enum constants
|
|
||||||
are similar but upper case (MULTI_WORD_NAME). Names should be unique within
|
|
||||||
the first fifteen characters. (On some older systems, global names must be
|
|
||||||
unique within six characters. We accommodate this without cluttering the
|
|
||||||
source code by using macros to substitute shorter names.)
|
|
||||||
|
|
||||||
We use function prototypes everywhere; we rely on automatic source code
|
|
||||||
transformation to feed prototype-less C compilers. Transformation is done
|
|
||||||
by the simple and portable tool 'ansi2knr.c' (courtesy of Ghostscript).
|
|
||||||
ansi2knr is not very bright, so it imposes a format requirement on function
|
|
||||||
declarations: the function name MUST BEGIN IN COLUMN 1. Thus all functions
|
|
||||||
should be written in the following style:
|
|
||||||
|
|
||||||
LOCAL(int *)
|
|
||||||
function_name (int a, char *b)
|
|
||||||
{
|
|
||||||
code...
|
|
||||||
}
|
|
||||||
|
|
||||||
Note that each function definition must begin with GLOBAL(type), LOCAL(type),
|
|
||||||
or METHODDEF(type). These macros expand to "static type" or just "type" as
|
|
||||||
appropriate. They provide a readable indication of the routine's usage and
|
|
||||||
can readily be changed for special needs. (For instance, special linkage
|
|
||||||
keywords can be inserted for use in Windows DLLs.)
|
|
||||||
|
|
||||||
ansi2knr does not transform method declarations (function pointers in
|
|
||||||
structs). We handle these with a macro JMETHOD, defined as
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
#define JMETHOD(type,methodname,arglist) type (*methodname) arglist
|
|
||||||
#else
|
|
||||||
#define JMETHOD(type,methodname,arglist) type (*methodname) ()
|
|
||||||
#endif
|
|
||||||
which is used like this:
|
|
||||||
struct function_pointers {
|
|
||||||
JMETHOD(void, init_entropy_encoder, (int somearg, jparms *jp));
|
|
||||||
JMETHOD(void, term_entropy_encoder, (void));
|
|
||||||
};
|
|
||||||
Note the set of parentheses surrounding the parameter list.
|
|
||||||
|
|
||||||
A similar solution is used for forward and external function declarations
|
|
||||||
(see the EXTERN and JPP macros).
|
|
||||||
|
|
||||||
If the code is to work on non-ANSI compilers, we cannot rely on a prototype
|
|
||||||
declaration to coerce actual parameters into the right types. Therefore, use
|
|
||||||
explicit casts on actual parameters whenever the actual parameter type is not
|
|
||||||
identical to the formal parameter. Beware of implicit conversions to "int".
|
|
||||||
|
|
||||||
It seems there are some non-ANSI compilers in which the sizeof() operator
|
|
||||||
is defined to return int, yet size_t is defined as long. Needless to say,
|
|
||||||
this is brain-damaged. Always use the SIZEOF() macro in place of sizeof(),
|
|
||||||
so that the result is guaranteed to be of type size_t.
|
|
||||||
|
|
||||||
|
|
||||||
The JPEG library is intended to be used within larger programs. Furthermore,
|
|
||||||
we want it to be reentrant so that it can be used by applications that process
|
|
||||||
multiple images concurrently. The following rules support these requirements:
|
|
||||||
|
|
||||||
1. Avoid direct use of file I/O, "malloc", error report printouts, etc;
|
|
||||||
pass these through the common routines provided.
|
|
||||||
|
|
||||||
2. Minimize global namespace pollution. Functions should be declared static
|
|
||||||
wherever possible. (Note that our method-based calling conventions help this
|
|
||||||
a lot: in many modules only the initialization function will ever need to be
|
|
||||||
called directly, so only that function need be externally visible.) All
|
|
||||||
global function names should begin with "jpeg_", and should have an
|
|
||||||
abbreviated name (unique in the first six characters) substituted by macro
|
|
||||||
when NEED_SHORT_EXTERNAL_NAMES is set.
|
|
||||||
|
|
||||||
3. Don't use global variables; anything that must be used in another module
|
|
||||||
should be in the common data structures.
|
|
||||||
|
|
||||||
4. Don't use static variables except for read-only constant tables. Variables
|
|
||||||
that should be private to a module can be placed into private structures (see
|
|
||||||
the system architecture document, structure.txt).
|
|
||||||
|
|
||||||
5. Source file names should begin with "j" for files that are part of the
|
|
||||||
library proper; source files that are not part of the library, such as cjpeg.c
|
|
||||||
and djpeg.c, do not begin with "j". Keep source file names to eight
|
|
||||||
characters (plus ".c" or ".h", etc) to make life easy for MS-DOSers. Keep
|
|
||||||
compression and decompression code in separate source files --- some
|
|
||||||
applications may want only one half of the library.
|
|
||||||
|
|
||||||
Note: these rules (particularly #4) are not followed religiously in the
|
|
||||||
modules that are used in cjpeg/djpeg but are not part of the JPEG library
|
|
||||||
proper. Those modules are not really intended to be used in other
|
|
||||||
applications.
|
|
@ -1,347 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2012-10-14.11; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent tools from complaining about whitespace usage.
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
file_conv=
|
|
||||||
|
|
||||||
# func_file_conv build_file lazy
|
|
||||||
# Convert a $build file to $host form and store it in $file
|
|
||||||
# Currently only supports Windows hosts. If the determined conversion
|
|
||||||
# type is listed in (the comma separated) LAZY, no conversion will
|
|
||||||
# take place.
|
|
||||||
func_file_conv ()
|
|
||||||
{
|
|
||||||
file=$1
|
|
||||||
case $file in
|
|
||||||
/ | /[!/]*) # absolute file, and not a UNC file
|
|
||||||
if test -z "$file_conv"; then
|
|
||||||
# lazily determine how to convert abs files
|
|
||||||
case `uname -s` in
|
|
||||||
MINGW*)
|
|
||||||
file_conv=mingw
|
|
||||||
;;
|
|
||||||
CYGWIN*)
|
|
||||||
file_conv=cygwin
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
file_conv=wine
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
case $file_conv/,$2, in
|
|
||||||
*,$file_conv,*)
|
|
||||||
;;
|
|
||||||
mingw/*)
|
|
||||||
file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
|
|
||||||
;;
|
|
||||||
cygwin/*)
|
|
||||||
file=`cygpath -m "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
wine/*)
|
|
||||||
file=`winepath -w "$file" || echo "$file"`
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashL linkdir
|
|
||||||
# Make cl look for libraries in LINKDIR
|
|
||||||
func_cl_dashL ()
|
|
||||||
{
|
|
||||||
func_file_conv "$1"
|
|
||||||
if test -z "$lib_path"; then
|
|
||||||
lib_path=$file
|
|
||||||
else
|
|
||||||
lib_path="$lib_path;$file"
|
|
||||||
fi
|
|
||||||
linker_opts="$linker_opts -LIBPATH:$file"
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_dashl library
|
|
||||||
# Do a library search-path lookup for cl
|
|
||||||
func_cl_dashl ()
|
|
||||||
{
|
|
||||||
lib=$1
|
|
||||||
found=no
|
|
||||||
save_IFS=$IFS
|
|
||||||
IFS=';'
|
|
||||||
for dir in $lib_path $LIB
|
|
||||||
do
|
|
||||||
IFS=$save_IFS
|
|
||||||
if $shared && test -f "$dir/$lib.dll.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.dll.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/$lib.lib"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/$lib.lib
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
if test -f "$dir/lib$lib.a"; then
|
|
||||||
found=yes
|
|
||||||
lib=$dir/lib$lib.a
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS=$save_IFS
|
|
||||||
|
|
||||||
if test "$found" != yes; then
|
|
||||||
lib=$lib.lib
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# func_cl_wrapper cl arg...
|
|
||||||
# Adjust compile command to suit cl
|
|
||||||
func_cl_wrapper ()
|
|
||||||
{
|
|
||||||
# Assume a capable shell
|
|
||||||
lib_path=
|
|
||||||
shared=:
|
|
||||||
linker_opts=
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.[oO][bB][jJ])
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fo"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
func_file_conv "$2"
|
|
||||||
set x "$@" -Fe"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
-I)
|
|
||||||
eat=1
|
|
||||||
func_file_conv "$2" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-I*)
|
|
||||||
func_file_conv "${1#-I}" mingw
|
|
||||||
set x "$@" -I"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashl "$2"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-l*)
|
|
||||||
func_cl_dashl "${1#-l}"
|
|
||||||
set x "$@" "$lib"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
-L)
|
|
||||||
eat=1
|
|
||||||
func_cl_dashL "$2"
|
|
||||||
;;
|
|
||||||
-L*)
|
|
||||||
func_cl_dashL "${1#-L}"
|
|
||||||
;;
|
|
||||||
-static)
|
|
||||||
shared=false
|
|
||||||
;;
|
|
||||||
-Wl,*)
|
|
||||||
arg=${1#-Wl,}
|
|
||||||
save_ifs="$IFS"; IFS=','
|
|
||||||
for flag in $arg; do
|
|
||||||
IFS="$save_ifs"
|
|
||||||
linker_opts="$linker_opts $flag"
|
|
||||||
done
|
|
||||||
IFS="$save_ifs"
|
|
||||||
;;
|
|
||||||
-Xlinker)
|
|
||||||
eat=1
|
|
||||||
linker_opts="$linker_opts $2"
|
|
||||||
;;
|
|
||||||
-*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)
|
|
||||||
func_file_conv "$1"
|
|
||||||
set x "$@" -Tp"$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])
|
|
||||||
func_file_conv "$1" mingw
|
|
||||||
set x "$@" "$file"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
if test -n "$linker_opts"; then
|
|
||||||
linker_opts="-link$linker_opts"
|
|
||||||
fi
|
|
||||||
exec "$@" $linker_opts
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
eat=
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand '-c -o'.
|
|
||||||
Remove '-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file 'INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
cl | *[/\\]cl | cl.exe | *[/\\]cl.exe )
|
|
||||||
func_cl_wrapper "$@" # Doesn't return...
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as 'compile cc -o foo foo.c'.
|
|
||||||
# So we strip '-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no '-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# '.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use '[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
1568
source/Irrlicht/jpeglib/config.guess
vendored
1568
source/Irrlicht/jpeglib/config.guess
vendored
File diff suppressed because it is too large
Load Diff
1793
source/Irrlicht/jpeglib/config.sub
vendored
1793
source/Irrlicht/jpeglib/config.sub
vendored
File diff suppressed because it is too large
Load Diff
15462
source/Irrlicht/jpeglib/configure
vendored
15462
source/Irrlicht/jpeglib/configure
vendored
File diff suppressed because it is too large
Load Diff
@ -1,365 +0,0 @@
|
|||||||
# IJG auto-configuration source file.
|
|
||||||
# Process this file with autoconf to produce a configure script.
|
|
||||||
|
|
||||||
#
|
|
||||||
# Configure script for IJG libjpeg
|
|
||||||
#
|
|
||||||
|
|
||||||
AC_INIT([libjpeg], [9.1.0])
|
|
||||||
|
|
||||||
# Directory where autotools helper scripts lives.
|
|
||||||
AC_CONFIG_AUX_DIR([.])
|
|
||||||
|
|
||||||
# Generate configuration headers.
|
|
||||||
AC_CONFIG_HEADERS([jconfig.h:jconfig.cfg])
|
|
||||||
|
|
||||||
# Hack: disable autoheader so that it doesn't overwrite our cfg template.
|
|
||||||
AUTOHEADER="echo autoheader ignored"
|
|
||||||
|
|
||||||
# Check system type
|
|
||||||
AC_CANONICAL_TARGET
|
|
||||||
|
|
||||||
# Initialize Automake
|
|
||||||
# Don't require all the GNU mandated files
|
|
||||||
AM_INIT_AUTOMAKE([-Wall -Werror no-dist foreign])
|
|
||||||
|
|
||||||
# Make --enable-silent-rules the default.
|
|
||||||
# To get verbose build output you may configure
|
|
||||||
# with --disable-silent-rules or use "make V=1".
|
|
||||||
AM_SILENT_RULES([yes])
|
|
||||||
|
|
||||||
# Add configure option --enable-maintainer-mode which enables
|
|
||||||
# dependency checking and generation useful to package maintainers.
|
|
||||||
# This is made an option to avoid confusing end users.
|
|
||||||
AM_MAINTAINER_MODE
|
|
||||||
|
|
||||||
# Check for programs
|
|
||||||
AC_PROG_CC
|
|
||||||
AC_PROG_CC_STDC
|
|
||||||
AC_PROG_CPP
|
|
||||||
AC_PROG_INSTALL
|
|
||||||
AC_PROG_MAKE_SET
|
|
||||||
AC_PROG_LN_S
|
|
||||||
AM_PROG_AR
|
|
||||||
|
|
||||||
# Check if LD supports linker scripts,
|
|
||||||
# and define automake conditional HAVE_LD_VERSION_SCRIPT if so.
|
|
||||||
AC_ARG_ENABLE([ld-version-script],
|
|
||||||
AS_HELP_STRING([--enable-ld-version-script],
|
|
||||||
[enable linker version script (default is enabled when possible)]),
|
|
||||||
[have_ld_version_script=$enableval], [])
|
|
||||||
if test -z "$have_ld_version_script"; then
|
|
||||||
AC_MSG_CHECKING([if LD -Wl,--version-script works])
|
|
||||||
save_LDFLAGS="$LDFLAGS"
|
|
||||||
LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
|
|
||||||
cat > conftest.map <<EOF
|
|
||||||
VERS_1 {
|
|
||||||
global: sym;
|
|
||||||
};
|
|
||||||
|
|
||||||
VERS_2 {
|
|
||||||
global: sym;
|
|
||||||
} VERS_1;
|
|
||||||
EOF
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
|
|
||||||
[have_ld_version_script=yes], [have_ld_version_script=no])
|
|
||||||
rm -f conftest.map
|
|
||||||
LDFLAGS="$save_LDFLAGS"
|
|
||||||
AC_MSG_RESULT($have_ld_version_script)
|
|
||||||
fi
|
|
||||||
AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
|
|
||||||
|
|
||||||
# See if compiler supports prototypes.
|
|
||||||
AC_MSG_CHECKING([for function prototypes])
|
|
||||||
AC_CACHE_VAL([ijg_cv_have_prototypes],
|
|
||||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
int testfunction (int arg1, int * arg2); /* check prototypes */
|
|
||||||
struct methods_struct { /* check method-pointer declarations */
|
|
||||||
int (*error_exit) (char *msgtext);
|
|
||||||
int (*trace_message) (char *msgtext);
|
|
||||||
int (*another_method) (void);
|
|
||||||
};
|
|
||||||
int testfunction (int arg1, int * arg2) /* check definitions */
|
|
||||||
{ return arg2[arg1]; }
|
|
||||||
int test2function (void) /* check void arg list */
|
|
||||||
{ return 0; }
|
|
||||||
]])],
|
|
||||||
[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
|
|
||||||
AC_DEFINE([HAVE_PROTOTYPES],[1],[Compiler supports function prototypes.])
|
|
||||||
else
|
|
||||||
AC_MSG_WARN([Your compiler does not seem to know about function prototypes.
|
|
||||||
Perhaps it needs a special switch to enable ANSI C mode.
|
|
||||||
If so, we recommend running configure like this:
|
|
||||||
./configure CC='cc -switch'
|
|
||||||
where -switch is the proper switch.])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check header files
|
|
||||||
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>.])])
|
|
||||||
|
|
||||||
# See whether type size_t is defined in any ANSI-standard places;
|
|
||||||
# if not, perhaps it is defined in <sys/types.h>.
|
|
||||||
AC_MSG_CHECKING([for size_t])
|
|
||||||
AC_TRY_COMPILE([
|
|
||||||
#ifdef HAVE_STDDEF_H
|
|
||||||
#include <stddef.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef NEED_BSD_STRINGS
|
|
||||||
#include <strings.h>
|
|
||||||
#else
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
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"])
|
|
||||||
AC_MSG_RESULT([$ijg_size_t_ok])
|
|
||||||
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_EGREP_CPP([size_t], [#include <sys/types.h>],
|
|
||||||
[ijg_size_t_ok="size_t is in sys/types.h"],
|
|
||||||
[ijg_size_t_ok=no])],
|
|
||||||
[ijg_size_t_ok=no])
|
|
||||||
AC_MSG_RESULT([$ijg_size_t_ok])
|
|
||||||
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
|
|
||||||
|
|
||||||
# Check compiler characteristics
|
|
||||||
AC_MSG_CHECKING([for type unsigned char])
|
|
||||||
AC_TRY_COMPILE([], [ unsigned char un_char; ],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE([HAVE_UNSIGNED_CHAR], [1],
|
|
||||||
[Compiler supports 'unsigned char'.])],
|
|
||||||
[AC_MSG_RESULT(no)])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for type unsigned short])
|
|
||||||
AC_TRY_COMPILE([], [ unsigned short un_short; ],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
AC_DEFINE([HAVE_UNSIGNED_SHORT], [1],
|
|
||||||
[Compiler supports 'unsigned short'.])],
|
|
||||||
[AC_MSG_RESULT(no)])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for type void])
|
|
||||||
AC_TRY_COMPILE([
|
|
||||||
/* Caution: a C++ compiler will insist on valid prototypes */
|
|
||||||
typedef void * void_ptr; /* check void * */
|
|
||||||
#ifdef HAVE_PROTOTYPES /* check ptr to function returning void */
|
|
||||||
typedef void (*void_func) (int a, int b);
|
|
||||||
#else
|
|
||||||
typedef void (*void_func) ();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_PROTOTYPES /* check void function result */
|
|
||||||
void test3function (void_ptr arg1, void_func arg2)
|
|
||||||
#else
|
|
||||||
void test3function (arg1, arg2)
|
|
||||||
void_ptr arg1;
|
|
||||||
void_func arg2;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
char * locptr = (char *) arg1; /* check casting to and from void * */
|
|
||||||
arg1 = (void *) locptr;
|
|
||||||
(*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_C_CONST
|
|
||||||
|
|
||||||
# Check for non-broken inline under various spellings
|
|
||||||
AC_MSG_CHECKING([for inline])
|
|
||||||
ijg_cv_inline=""
|
|
||||||
AC_TRY_COMPILE([], [} __inline__ int foo() { return 0; }
|
|
||||||
int bar() { return foo();], ijg_cv_inline="__inline__",
|
|
||||||
[AC_TRY_COMPILE(, [} __inline int foo() { return 0; }
|
|
||||||
int bar() { return foo();], ijg_cv_inline="__inline",
|
|
||||||
[AC_TRY_COMPILE(, [} inline int foo() { return 0; }
|
|
||||||
int bar() { return foo();], ijg_cv_inline="inline")])])
|
|
||||||
AC_MSG_RESULT($ijg_cv_inline)
|
|
||||||
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
|
|
||||||
AC_MSG_CHECKING([for broken incomplete types])
|
|
||||||
AC_TRY_COMPILE([ typedef struct undefined_structure * undef_struct_ptr; ],
|
|
||||||
[],
|
|
||||||
[AC_MSG_RESULT(ok)],
|
|
||||||
[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
|
|
||||||
AC_MSG_CHECKING([for short external names])
|
|
||||||
AC_TRY_LINK([
|
|
||||||
int possibly_duplicate_function () { return 0; }
|
|
||||||
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.])])
|
|
||||||
|
|
||||||
# Run-time checks
|
|
||||||
AC_MSG_CHECKING([to see if char is signed])
|
|
||||||
AC_TRY_RUN([
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int is_char_signed (int arg)
|
|
||||||
#else
|
|
||||||
int is_char_signed (arg)
|
|
||||||
int arg;
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
if (arg == 189) { /* expected result for unsigned char */
|
|
||||||
return 0; /* type char is unsigned */
|
|
||||||
}
|
|
||||||
else if (arg != -67) { /* expected result for signed char */
|
|
||||||
printf("Hmm, it seems 'char' is not eight bits wide on your machine.\n");
|
|
||||||
printf("I fear the JPEG software will not work at all.\n\n");
|
|
||||||
}
|
|
||||||
return 1; /* assume char is signed otherwise */
|
|
||||||
}
|
|
||||||
char signed_char_check = (char) (-67);
|
|
||||||
int main() {
|
|
||||||
exit(is_char_signed((int) signed_char_check));
|
|
||||||
}], [AC_MSG_RESULT(no)
|
|
||||||
AC_DEFINE([CHAR_IS_UNSIGNED], [1],
|
|
||||||
[Characters are unsigned])],
|
|
||||||
[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.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([to see if right shift is signed])
|
|
||||||
AC_TRY_RUN([
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
#ifdef HAVE_PROTOTYPES
|
|
||||||
int is_shifting_signed (long arg)
|
|
||||||
#else
|
|
||||||
int is_shifting_signed (arg)
|
|
||||||
long arg;
|
|
||||||
#endif
|
|
||||||
/* See whether right-shift on a long is signed or not. */
|
|
||||||
{
|
|
||||||
long res = arg >> 4;
|
|
||||||
|
|
||||||
if (res == -0x7F7E80CL) { /* expected result for signed shift */
|
|
||||||
return 1; /* right shift is signed */
|
|
||||||
}
|
|
||||||
/* see if unsigned-shift hack will fix it. */
|
|
||||||
/* we can't just test exact value since it depends on width of long... */
|
|
||||||
res |= (~0L) << (32-4);
|
|
||||||
if (res == -0x7F7E80CL) { /* expected result now? */
|
|
||||||
return 0; /* right shift is unsigned */
|
|
||||||
}
|
|
||||||
printf("Right shift isn't acting as I expect it to.\n");
|
|
||||||
printf("I fear the JPEG software will not work at all.\n\n");
|
|
||||||
return 0; /* try it with unsigned anyway */
|
|
||||||
}
|
|
||||||
int main() {
|
|
||||||
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(Assuming that right shift is signed on target machine.)])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([to see if fopen accepts b spec])
|
|
||||||
AC_TRY_RUN([
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
#include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
#include <stdio.h>
|
|
||||||
int main() {
|
|
||||||
if (fopen("conftestdata", "wb") != NULL)
|
|
||||||
exit(0);
|
|
||||||
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(Assuming that it does.)])
|
|
||||||
|
|
||||||
# Configure libtool
|
|
||||||
AC_LIBTOOL_WIN32_DLL
|
|
||||||
AC_PROG_LIBTOOL
|
|
||||||
|
|
||||||
# Select memory manager depending on user input.
|
|
||||||
# If no "-enable-maxmem", use jmemnobs
|
|
||||||
MEMORYMGR='jmemnobs'
|
|
||||||
MAXMEM="no"
|
|
||||||
AC_ARG_ENABLE([maxmem],
|
|
||||||
[ --enable-maxmem[=N] enable use of temp files, set max mem usage to N MB],
|
|
||||||
[MAXMEM="$enableval"])
|
|
||||||
dnl [# support --with-maxmem for backwards compatibility with IJG V5.]
|
|
||||||
dnl AC_ARG_WITH(maxmem, , MAXMEM="$withval")
|
|
||||||
if test "x$MAXMEM" = xyes; then
|
|
||||||
MAXMEM=1
|
|
||||||
fi
|
|
||||||
if test "x$MAXMEM" != xno; then
|
|
||||||
if test -n "`echo $MAXMEM | sed 's/[[0-9]]//g'`"; then
|
|
||||||
AC_MSG_ERROR(non-numeric argument to --enable-maxmem)
|
|
||||||
fi
|
|
||||||
DEFAULTMAXMEM=`expr $MAXMEM \* 1048576`
|
|
||||||
AC_DEFINE_UNQUOTED([DEFAULT_MAX_MEM], [${DEFAULTMAXMEM}],
|
|
||||||
[Maximum data space library will allocate.])
|
|
||||||
AC_MSG_CHECKING([for 'tmpfile()'])
|
|
||||||
AC_TRY_LINK([#include <stdio.h>], [ FILE * tfile = tmpfile(); ],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
MEMORYMGR='jmemansi'],
|
|
||||||
[AC_MSG_RESULT(no)
|
|
||||||
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)
|
|
||||||
AC_DEFINE([NEED_SIGNAL_CATCHER], [1],
|
|
||||||
[Need signal handler to clean up temporary files.])
|
|
||||||
AC_MSG_CHECKING([for 'mktemp()'])
|
|
||||||
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
|
|
||||||
AC_SUBST([MEMORYMGR])
|
|
||||||
|
|
||||||
# Extract the library version IDs from jpeglib.h.
|
|
||||||
AC_MSG_CHECKING([libjpeg version number])
|
|
||||||
[major=`sed -ne 's/^#define JPEG_LIB_VERSION_MAJOR *\([0-9][0-9]*\).*$/\1/p' $srcdir/jpeglib.h`
|
|
||||||
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_CONFIG_FILES([Makefile])
|
|
||||||
AC_OUTPUT
|
|
@ -1,791 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2013-05-30.07; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999-2013 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
# 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
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try '$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by 'PROGRAMS ARGS'.
|
|
||||||
object Object file output by 'PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputting dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# Get the directory component of the given path, and save it in the
|
|
||||||
# global variables '$dir'. Note that this directory component will
|
|
||||||
# be either empty or ending with a '/' character. This is deliberate.
|
|
||||||
set_dir_from ()
|
|
||||||
{
|
|
||||||
case $1 in
|
|
||||||
*/*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;;
|
|
||||||
*) dir=;;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Get the suffix-stripped basename of the given path, and save it the
|
|
||||||
# global variable '$base'.
|
|
||||||
set_base_from ()
|
|
||||||
{
|
|
||||||
base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'`
|
|
||||||
}
|
|
||||||
|
|
||||||
# If no dependency file was actually created by the compiler invocation,
|
|
||||||
# we still have to create a dummy depfile, to avoid errors with the
|
|
||||||
# Makefile "include basename.Plo" scheme.
|
|
||||||
make_dummy_depfile ()
|
|
||||||
{
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
}
|
|
||||||
|
|
||||||
# Factor out some common post-processing of the generated depfile.
|
|
||||||
# Requires the auxiliary global variable '$tmpdepfile' to be set.
|
|
||||||
aix_post_process_depfile ()
|
|
||||||
{
|
|
||||||
# If the compiler actually managed to produce a dependency file,
|
|
||||||
# post-process it.
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form 'foo.o: dependency.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# $object: dependency.h
|
|
||||||
# and one to simply output
|
|
||||||
# dependency.h:
|
|
||||||
# which is needed to avoid the deleted-header problem.
|
|
||||||
{ sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile"
|
|
||||||
sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile"
|
|
||||||
} > "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
# A tabulation character.
|
|
||||||
tab=' '
|
|
||||||
# A newline character.
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
# Character ranges might be problematic outside the C locale.
|
|
||||||
# These definitions help.
|
|
||||||
upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
|
||||||
lower=abcdefghijklmnopqrstuvwxyz
|
|
||||||
digits=0123456789
|
|
||||||
alpha=${upper}${lower}
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Avoid interferences from the environment.
|
|
||||||
gccflag= dashmflag=
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp 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=msvisualcpp
|
|
||||||
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
|
|
||||||
|
|
||||||
if test "$depmode" = xlc; then
|
|
||||||
# IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.
|
|
||||||
gccflag=-qmakedep=gcc,-MF
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.
|
|
||||||
## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.
|
|
||||||
## (see the conditional assignment to $gccflag above).
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say). Also, it might not be
|
|
||||||
## supported by the other compilers which use the 'gcc' depmode.
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# The second -e expression handles DOS-style file names with drive
|
|
||||||
# letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the "deleted header file" problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
## 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
|
|
||||||
## 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
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# 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
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like '#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \
|
|
||||||
| tr "$nl" ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
xlc)
|
|
||||||
# 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
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts '$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
tcc)
|
|
||||||
# tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26
|
|
||||||
# FIXME: That version still under development at the moment of writing.
|
|
||||||
# Make that this statement remains true also for stable, released
|
|
||||||
# versions.
|
|
||||||
# It will wrap lines (doesn't matter whether long or short) with a
|
|
||||||
# trailing '\', as in:
|
|
||||||
#
|
|
||||||
# foo.o : \
|
|
||||||
# foo.c \
|
|
||||||
# foo.h \
|
|
||||||
#
|
|
||||||
# It will put a trailing '\' even on the last line, and will use leading
|
|
||||||
# spaces rather than leading tabs (at least since its commit 0394caf7
|
|
||||||
# "Emit spaces for -MD").
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each non-empty line is of the form 'foo.o : \' or ' dep.h \'.
|
|
||||||
# We have to change lines of the first kind to '$object: \'.
|
|
||||||
sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile"
|
|
||||||
# And for each line of the second kind, we have to emit a 'dep.h:'
|
|
||||||
# dummy dependency, to avoid the deleted-header problem.
|
|
||||||
sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
## The order of this option in the case statement is important, since the
|
|
||||||
## shell code in configure will try each of these formats in the order
|
|
||||||
## listed in this file. A plain '-MD' option would be understood by many
|
|
||||||
## compilers, so we must ensure this comes after the gcc and icc options.
|
|
||||||
pgcc)
|
|
||||||
# Portland's C compiler understands '-MD'.
|
|
||||||
# Will always output deps to 'file.d' where file is the root name of the
|
|
||||||
# source file under compilation, even if file resides in a subdirectory.
|
|
||||||
# The object file name does not affect the name of the '.d' file.
|
|
||||||
# pgcc 10.2 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using '\' :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
set_dir_from "$object"
|
|
||||||
# Use the source, not the object, to determine the base name, since
|
|
||||||
# that's sadly what pgcc will do too.
|
|
||||||
set_base_from "$source"
|
|
||||||
tmpdepfile=$base.d
|
|
||||||
|
|
||||||
# For projects that build the same source file twice into different object
|
|
||||||
# files, the pgcc approach of using the *source* file root name can cause
|
|
||||||
# problems in parallel builds. Use a locking strategy to avoid stomping on
|
|
||||||
# the same $tmpdepfile.
|
|
||||||
lockdir=$base.d-lock
|
|
||||||
trap "
|
|
||||||
echo '$0: caught signal, cleaning up...' >&2
|
|
||||||
rmdir '$lockdir'
|
|
||||||
exit 1
|
|
||||||
" 1 2 13 15
|
|
||||||
numtries=100
|
|
||||||
i=$numtries
|
|
||||||
while test $i -gt 0; do
|
|
||||||
# mkdir is a portable test-and-set.
|
|
||||||
if mkdir "$lockdir" 2>/dev/null; then
|
|
||||||
# This process acquired the lock.
|
|
||||||
"$@" -MD
|
|
||||||
stat=$?
|
|
||||||
# Release the lock.
|
|
||||||
rmdir "$lockdir"
|
|
||||||
break
|
|
||||||
else
|
|
||||||
# If the lock is being held by a different process, wait
|
|
||||||
# until the winning process is done or we timeout.
|
|
||||||
while test -d "$lockdir" && test $i -gt 0; do
|
|
||||||
sleep 1
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
i=`expr $i - 1`
|
|
||||||
done
|
|
||||||
trap - 1 2 13 15
|
|
||||||
if test $i -le 0; then
|
|
||||||
echo "$0: failed to acquire lock after $numtries attempts" >&2
|
|
||||||
echo "$0: check lockdir '$lockdir'" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add 'dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
make_dummy_depfile
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in 'foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
set_dir_from "$object"
|
|
||||||
set_base_from "$object"
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# Libtool generates 2 separate objects for the 2 libraries. These
|
|
||||||
# two compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile2=$dir.libs/$base.o.d # Likewise.
|
|
||||||
tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -ne 0; then
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
# Same post-processing that is required for AIX mode.
|
|
||||||
aix_post_process_depfile
|
|
||||||
;;
|
|
||||||
|
|
||||||
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 -ne 0; then
|
|
||||||
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/\(.*\)/'"$tab"'\1 \\/p
|
|
||||||
s/.\(.*\) \\/\1:/
|
|
||||||
H
|
|
||||||
$ {
|
|
||||||
s/.*/'"$tab"'/
|
|
||||||
G
|
|
||||||
p
|
|
||||||
}' >> "$depfile"
|
|
||||||
echo >> "$depfile" # make sure the fragment doesn't end with a backslash
|
|
||||||
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)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for ':'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this sed invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
tr ' ' "$nl" < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$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"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process the last invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed '1,2d' "$tmpdepfile" \
|
|
||||||
| tr ' ' "$nl" \
|
|
||||||
| sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \
|
|
||||||
| sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove '-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E \
|
|
||||||
| sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
| sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile"
|
|
||||||
echo "$tab" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# 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
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
@ -1,252 +0,0 @@
|
|||||||
.TH DJPEG 1 "23 November 2013"
|
|
||||||
.SH NAME
|
|
||||||
djpeg \- decompress a JPEG file to an image file
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.B djpeg
|
|
||||||
[
|
|
||||||
.I options
|
|
||||||
]
|
|
||||||
[
|
|
||||||
.I filename
|
|
||||||
]
|
|
||||||
.LP
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.LP
|
|
||||||
.B djpeg
|
|
||||||
decompresses the named JPEG file, or the standard input if no file is named,
|
|
||||||
and produces an image file on the standard output. PBMPLUS (PPM/PGM), BMP,
|
|
||||||
GIF, Targa, or RLE (Utah Raster Toolkit) output format can be selected.
|
|
||||||
(RLE is supported only if the URT library is available.)
|
|
||||||
.SH OPTIONS
|
|
||||||
All switch names may be abbreviated; for example,
|
|
||||||
.B \-grayscale
|
|
||||||
may be written
|
|
||||||
.B \-gray
|
|
||||||
or
|
|
||||||
.BR \-gr .
|
|
||||||
Most of the "basic" switches can be abbreviated to as little as one letter.
|
|
||||||
Upper and lower case are equivalent (thus
|
|
||||||
.B \-BMP
|
|
||||||
is the same as
|
|
||||||
.BR \-bmp ).
|
|
||||||
British spellings are also accepted (e.g.,
|
|
||||||
.BR \-greyscale ),
|
|
||||||
though for brevity these are not mentioned below.
|
|
||||||
.PP
|
|
||||||
The basic switches are:
|
|
||||||
.TP
|
|
||||||
.BI \-colors " N"
|
|
||||||
Reduce image to at most N colors. This reduces the number of colors used in
|
|
||||||
the output image, so that it can be displayed on a colormapped display or
|
|
||||||
stored in a colormapped file format. For example, if you have an 8-bit
|
|
||||||
display, you'd need to reduce to 256 or fewer colors.
|
|
||||||
.TP
|
|
||||||
.BI \-quantize " N"
|
|
||||||
Same as
|
|
||||||
.BR \-colors .
|
|
||||||
.B \-colors
|
|
||||||
is the recommended name,
|
|
||||||
.B \-quantize
|
|
||||||
is provided only for backwards compatibility.
|
|
||||||
.TP
|
|
||||||
.B \-fast
|
|
||||||
Select recommended processing options for fast, low quality output. (The
|
|
||||||
default options are chosen for highest quality output.) Currently, this is
|
|
||||||
equivalent to \fB\-dct fast \-nosmooth \-onepass \-dither ordered\fR.
|
|
||||||
.TP
|
|
||||||
.B \-grayscale
|
|
||||||
Force gray-scale output even if JPEG file is color. Useful for viewing on
|
|
||||||
monochrome displays; also,
|
|
||||||
.B djpeg
|
|
||||||
runs noticeably faster in this mode.
|
|
||||||
.TP
|
|
||||||
.BI \-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.
|
|
||||||
Scaling is handy if the image is larger than your screen; also,
|
|
||||||
.B djpeg
|
|
||||||
runs much faster when scaling down the output.
|
|
||||||
.TP
|
|
||||||
.B \-bmp
|
|
||||||
Select BMP output format (Windows flavor). 8-bit colormapped format is
|
|
||||||
emitted if
|
|
||||||
.B \-colors
|
|
||||||
or
|
|
||||||
.B \-grayscale
|
|
||||||
is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color
|
|
||||||
format is emitted.
|
|
||||||
.TP
|
|
||||||
.B \-gif
|
|
||||||
Select GIF output format. Since GIF does not support more than 256 colors,
|
|
||||||
.B \-colors 256
|
|
||||||
is assumed (unless you specify a smaller number of colors).
|
|
||||||
.TP
|
|
||||||
.B \-os2
|
|
||||||
Select BMP output format (OS/2 1.x flavor). 8-bit colormapped format is
|
|
||||||
emitted if
|
|
||||||
.B \-colors
|
|
||||||
or
|
|
||||||
.B \-grayscale
|
|
||||||
is specified, or if the JPEG file is gray-scale; otherwise, 24-bit full-color
|
|
||||||
format is emitted.
|
|
||||||
.TP
|
|
||||||
.B \-pnm
|
|
||||||
Select PBMPLUS (PPM/PGM) output format (this is the default format).
|
|
||||||
PGM is emitted if the JPEG file is gray-scale or if
|
|
||||||
.B \-grayscale
|
|
||||||
is specified; otherwise PPM is emitted.
|
|
||||||
.TP
|
|
||||||
.B \-rle
|
|
||||||
Select RLE output format. (Requires URT library.)
|
|
||||||
.TP
|
|
||||||
.B \-targa
|
|
||||||
Select Targa output format. Gray-scale format is emitted if the JPEG file is
|
|
||||||
gray-scale or if
|
|
||||||
.B \-grayscale
|
|
||||||
is specified; otherwise, colormapped format is emitted if
|
|
||||||
.B \-colors
|
|
||||||
is specified; otherwise, 24-bit full-color format is emitted.
|
|
||||||
.PP
|
|
||||||
Switches for advanced users:
|
|
||||||
.TP
|
|
||||||
.B \-dct int
|
|
||||||
Use integer DCT method (default).
|
|
||||||
.TP
|
|
||||||
.B \-dct fast
|
|
||||||
Use fast integer DCT (less accurate).
|
|
||||||
.TP
|
|
||||||
.B \-dct float
|
|
||||||
Use floating-point DCT method.
|
|
||||||
The float method is very slightly more accurate than the int method, but is
|
|
||||||
much slower unless your machine has very fast floating-point hardware. Also
|
|
||||||
note that results of the floating-point method may vary slightly across
|
|
||||||
machines, while the integer methods should give the same results everywhere.
|
|
||||||
The fast integer method is much less accurate than the other two.
|
|
||||||
.TP
|
|
||||||
.B \-dither fs
|
|
||||||
Use Floyd-Steinberg dithering in color quantization.
|
|
||||||
.TP
|
|
||||||
.B \-dither ordered
|
|
||||||
Use ordered dithering in color quantization.
|
|
||||||
.TP
|
|
||||||
.B \-dither none
|
|
||||||
Do not use dithering in color quantization.
|
|
||||||
By default, Floyd-Steinberg dithering is applied when quantizing colors; this
|
|
||||||
is slow but usually produces the best results. Ordered dither is a compromise
|
|
||||||
between speed and quality; no dithering is fast but usually looks awful. Note
|
|
||||||
that these switches have no effect unless color quantization is being done.
|
|
||||||
Ordered dither is only available in
|
|
||||||
.B \-onepass
|
|
||||||
mode.
|
|
||||||
.TP
|
|
||||||
.BI \-map " file"
|
|
||||||
Quantize to the colors used in the specified image file. This is useful for
|
|
||||||
producing multiple files with identical color maps, or for forcing a
|
|
||||||
predefined set of colors to be used. The
|
|
||||||
.I file
|
|
||||||
must be a GIF or PPM file. This option overrides
|
|
||||||
.B \-colors
|
|
||||||
and
|
|
||||||
.BR \-onepass .
|
|
||||||
.TP
|
|
||||||
.B \-nosmooth
|
|
||||||
Don't use high-quality upsampling.
|
|
||||||
.TP
|
|
||||||
.B \-onepass
|
|
||||||
Use one-pass instead of two-pass color quantization. The one-pass method is
|
|
||||||
faster and needs less memory, but it produces a lower-quality image.
|
|
||||||
.B \-onepass
|
|
||||||
is ignored unless you also say
|
|
||||||
.B \-colors
|
|
||||||
.IR N .
|
|
||||||
Also, the one-pass method is always used for gray-scale output (the two-pass
|
|
||||||
method is no improvement then).
|
|
||||||
.TP
|
|
||||||
.BI \-maxmemory " N"
|
|
||||||
Set limit for amount of memory to use in processing large images. Value is
|
|
||||||
in thousands of bytes, or millions of bytes if "M" is attached to the
|
|
||||||
number. For example,
|
|
||||||
.B \-max 4m
|
|
||||||
selects 4000000 bytes. If more space is needed, temporary files will be used.
|
|
||||||
.TP
|
|
||||||
.BI \-outfile " name"
|
|
||||||
Send output image to the named file, not to standard output.
|
|
||||||
.TP
|
|
||||||
.B \-verbose
|
|
||||||
Enable debug printout. More
|
|
||||||
.BR \-v 's
|
|
||||||
give more output. Also, version information is printed at startup.
|
|
||||||
.TP
|
|
||||||
.B \-debug
|
|
||||||
Same as
|
|
||||||
.BR \-verbose .
|
|
||||||
.SH EXAMPLES
|
|
||||||
.LP
|
|
||||||
This example decompresses the JPEG file foo.jpg, quantizes it to
|
|
||||||
256 colors, and saves the output in 8-bit BMP format in foo.bmp:
|
|
||||||
.IP
|
|
||||||
.B djpeg \-colors 256 \-bmp
|
|
||||||
.I foo.jpg
|
|
||||||
.B >
|
|
||||||
.I foo.bmp
|
|
||||||
.SH HINTS
|
|
||||||
To get a quick preview of an image, use the
|
|
||||||
.B \-grayscale
|
|
||||||
and/or
|
|
||||||
.B \-scale
|
|
||||||
switches.
|
|
||||||
.B \-grayscale \-scale 1/8
|
|
||||||
is the fastest case.
|
|
||||||
.PP
|
|
||||||
Several options are available that trade off image quality to gain speed.
|
|
||||||
.B \-fast
|
|
||||||
turns on the recommended settings.
|
|
||||||
.PP
|
|
||||||
.B \-dct fast
|
|
||||||
and/or
|
|
||||||
.B \-nosmooth
|
|
||||||
gain speed at a small sacrifice in quality.
|
|
||||||
When producing a color-quantized image,
|
|
||||||
.B \-onepass \-dither ordered
|
|
||||||
is fast but much lower quality than the default behavior.
|
|
||||||
.B \-dither none
|
|
||||||
may give acceptable results in two-pass mode, but is seldom tolerable in
|
|
||||||
one-pass mode.
|
|
||||||
.PP
|
|
||||||
If you are fortunate enough to have very fast floating point hardware,
|
|
||||||
\fB\-dct float\fR may be even faster than \fB\-dct fast\fR. But on most
|
|
||||||
machines \fB\-dct float\fR is slower than \fB\-dct int\fR; in this case it is
|
|
||||||
not worth using, because its theoretical accuracy advantage is too small to be
|
|
||||||
significant in practice.
|
|
||||||
.SH ENVIRONMENT
|
|
||||||
.TP
|
|
||||||
.B JPEGMEM
|
|
||||||
If this environment variable is set, its value is the default memory limit.
|
|
||||||
The value is specified as described for the
|
|
||||||
.B \-maxmemory
|
|
||||||
switch.
|
|
||||||
.B JPEGMEM
|
|
||||||
overrides the default value specified when the program was compiled, and
|
|
||||||
itself is overridden by an explicit
|
|
||||||
.BR \-maxmemory .
|
|
||||||
.SH SEE ALSO
|
|
||||||
.BR cjpeg (1),
|
|
||||||
.BR jpegtran (1),
|
|
||||||
.BR rdjpgcom (1),
|
|
||||||
.BR wrjpgcom (1)
|
|
||||||
.br
|
|
||||||
.BR ppm (5),
|
|
||||||
.BR pgm (5)
|
|
||||||
.br
|
|
||||||
Wallace, Gregory K. "The JPEG Still Picture Compression Standard",
|
|
||||||
Communications of the ACM, April 1991 (vol. 34, no. 4), pp. 30-44.
|
|
||||||
.SH AUTHOR
|
|
||||||
Independent JPEG Group
|
|
||||||
.SH BUGS
|
|
||||||
To avoid the Unisys LZW patent (now expired),
|
|
||||||
.B djpeg
|
|
||||||
produces uncompressed GIF files. These are larger than they should be, but
|
|
||||||
are readable by standard GIF decoders.
|
|
@ -1,617 +0,0 @@
|
|||||||
/*
|
|
||||||
* djpeg.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
||||||
* Modified 2009-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains a command-line user interface for the JPEG decompressor.
|
|
||||||
* It should work on any system with Unix- or MS-DOS-style command lines.
|
|
||||||
*
|
|
||||||
* Two different command line styles are permitted, depending on the
|
|
||||||
* compile-time switch TWO_FILE_COMMANDLINE:
|
|
||||||
* djpeg [options] inputfile outputfile
|
|
||||||
* djpeg [options] [inputfile]
|
|
||||||
* In the second style, output is always to standard output, which you'd
|
|
||||||
* normally redirect to a file or pipe to some other program. Input is
|
|
||||||
* either from a named file or from standard input (typically redirected).
|
|
||||||
* The second style is convenient on Unix but is unhelpful on systems that
|
|
||||||
* don't support pipes. Also, you MUST use the first style if your system
|
|
||||||
* doesn't do binary I/O to stdin/stdout.
|
|
||||||
* To simplify script writing, the "-outfile" switch is provided. The syntax
|
|
||||||
* djpeg [options] -outfile outputfile inputfile
|
|
||||||
* works regardless of which command line style is used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */
|
|
||||||
#include "jversion.h" /* for version message */
|
|
||||||
|
|
||||||
#include <ctype.h> /* to declare isprint() */
|
|
||||||
|
|
||||||
#ifdef USE_CCOMMAND /* command-line reader for Macintosh */
|
|
||||||
#ifdef __MWERKS__
|
|
||||||
#include <SIOUX.h> /* Metrowerks needs this */
|
|
||||||
#include <console.h> /* ... and this */
|
|
||||||
#endif
|
|
||||||
#ifdef THINK_C
|
|
||||||
#include <console.h> /* Think declares it here */
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Create the add-on message string table. */
|
|
||||||
|
|
||||||
#define JMESSAGE(code,string) string ,
|
|
||||||
|
|
||||||
static const char * const cdjpeg_message_table[] = {
|
|
||||||
#include "cderror.h"
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This list defines the known output image formats
|
|
||||||
* (not all of which need be supported by a given version).
|
|
||||||
* You can change the default output format by defining DEFAULT_FMT;
|
|
||||||
* indeed, you had better do so if you undefine PPM_SUPPORTED.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
FMT_BMP, /* BMP format (Windows flavor) */
|
|
||||||
FMT_GIF, /* GIF format */
|
|
||||||
FMT_OS2, /* BMP format (OS/2 flavor) */
|
|
||||||
FMT_PPM, /* PPM/PGM (PBMPLUS formats) */
|
|
||||||
FMT_RLE, /* RLE format */
|
|
||||||
FMT_TARGA, /* Targa format */
|
|
||||||
FMT_TIFF /* TIFF format */
|
|
||||||
} IMAGE_FORMATS;
|
|
||||||
|
|
||||||
#ifndef DEFAULT_FMT /* so can override from CFLAGS in Makefile */
|
|
||||||
#define DEFAULT_FMT FMT_PPM
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static IMAGE_FORMATS requested_fmt;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Argument-parsing code.
|
|
||||||
* The switch parser is designed to be useful with DOS-style command line
|
|
||||||
* syntax, ie, intermixed switches and file names, where only the switches
|
|
||||||
* to the left of a given file name affect processing of that file.
|
|
||||||
* The main program in this file doesn't actually use this capability...
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
static const char * progname; /* program name for error messages */
|
|
||||||
static char * outfilename; /* for -outfile switch */
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
usage (void)
|
|
||||||
/* complain about bad command line */
|
|
||||||
{
|
|
||||||
fprintf(stderr, "usage: %s [switches] ", progname);
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
|
||||||
fprintf(stderr, "inputfile outputfile\n");
|
|
||||||
#else
|
|
||||||
fprintf(stderr, "[inputfile]\n");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fprintf(stderr, "Switches (names may be abbreviated):\n");
|
|
||||||
fprintf(stderr, " -colors N Reduce image to no more than N colors\n");
|
|
||||||
fprintf(stderr, " -fast Fast, low-quality processing\n");
|
|
||||||
fprintf(stderr, " -grayscale Force grayscale output\n");
|
|
||||||
#ifdef IDCT_SCALING_SUPPORTED
|
|
||||||
fprintf(stderr, " -scale M/N Scale output image by fraction M/N, eg, 1/8\n");
|
|
||||||
#endif
|
|
||||||
#ifdef BMP_SUPPORTED
|
|
||||||
fprintf(stderr, " -bmp Select BMP output format (Windows style)%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_BMP ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef GIF_SUPPORTED
|
|
||||||
fprintf(stderr, " -gif Select GIF output format%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_GIF ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef BMP_SUPPORTED
|
|
||||||
fprintf(stderr, " -os2 Select BMP output format (OS/2 style)%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_OS2 ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef PPM_SUPPORTED
|
|
||||||
fprintf(stderr, " -pnm Select PBMPLUS (PPM/PGM) output format%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_PPM ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
fprintf(stderr, " -rle Select Utah RLE output format%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_RLE ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
fprintf(stderr, " -targa Select Targa output format%s\n",
|
|
||||||
(DEFAULT_FMT == FMT_TARGA ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, "Switches for advanced users:\n");
|
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct int Use integer DCT method%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_ISLOW ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct fast Use fast integer DCT (less accurate)%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_IFAST ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
fprintf(stderr, " -dct float Use floating-point DCT method%s\n",
|
|
||||||
(JDCT_DEFAULT == JDCT_FLOAT ? " (default)" : ""));
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -dither fs Use F-S dithering (default)\n");
|
|
||||||
fprintf(stderr, " -dither none Don't use dithering in quantization\n");
|
|
||||||
fprintf(stderr, " -dither ordered Use ordered dither (medium speed, quality)\n");
|
|
||||||
#ifdef QUANT_2PASS_SUPPORTED
|
|
||||||
fprintf(stderr, " -map FILE Map to colors used in named image file\n");
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -nosmooth Don't use high-quality upsampling\n");
|
|
||||||
#ifdef QUANT_1PASS_SUPPORTED
|
|
||||||
fprintf(stderr, " -onepass Use 1-pass quantization (fast, low quality)\n");
|
|
||||||
#endif
|
|
||||||
fprintf(stderr, " -maxmemory N Maximum memory to use (in kbytes)\n");
|
|
||||||
fprintf(stderr, " -outfile name Specify name for output file\n");
|
|
||||||
fprintf(stderr, " -verbose or -debug Emit debug output\n");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(int)
|
|
||||||
parse_switches (j_decompress_ptr cinfo, int argc, char **argv,
|
|
||||||
int last_file_arg_seen, boolean for_real)
|
|
||||||
/* Parse optional switches.
|
|
||||||
* Returns argv[] index of first file-name argument (== argc if none).
|
|
||||||
* Any file names with indexes <= last_file_arg_seen are ignored;
|
|
||||||
* they have presumably been processed in a previous iteration.
|
|
||||||
* (Pass 0 for last_file_arg_seen on the first or only iteration.)
|
|
||||||
* for_real is FALSE on the first (dummy) pass; we may skip any expensive
|
|
||||||
* processing.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
int argn;
|
|
||||||
char * arg;
|
|
||||||
|
|
||||||
/* Set up default JPEG parameters. */
|
|
||||||
requested_fmt = DEFAULT_FMT; /* set default output file format */
|
|
||||||
outfilename = NULL;
|
|
||||||
cinfo->err->trace_level = 0;
|
|
||||||
|
|
||||||
/* Scan command line options, adjust parameters */
|
|
||||||
|
|
||||||
for (argn = 1; argn < argc; argn++) {
|
|
||||||
arg = argv[argn];
|
|
||||||
if (*arg != '-') {
|
|
||||||
/* Not a switch, must be a file name argument */
|
|
||||||
if (argn <= last_file_arg_seen) {
|
|
||||||
outfilename = NULL; /* -outfile applies to just one input file */
|
|
||||||
continue; /* ignore this name if previously processed */
|
|
||||||
}
|
|
||||||
break; /* else done parsing switches */
|
|
||||||
}
|
|
||||||
arg++; /* advance past switch marker character */
|
|
||||||
|
|
||||||
if (keymatch(arg, "bmp", 1)) {
|
|
||||||
/* BMP output format. */
|
|
||||||
requested_fmt = FMT_BMP;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "colors", 1) || keymatch(arg, "colours", 1) ||
|
|
||||||
keymatch(arg, "quantize", 1) || keymatch(arg, "quantise", 1)) {
|
|
||||||
/* Do color quantization. */
|
|
||||||
int val;
|
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%d", &val) != 1)
|
|
||||||
usage();
|
|
||||||
cinfo->desired_number_of_colors = val;
|
|
||||||
cinfo->quantize_colors = TRUE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "dct", 2)) {
|
|
||||||
/* Select IDCT algorithm. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (keymatch(argv[argn], "int", 1)) {
|
|
||||||
cinfo->dct_method = JDCT_ISLOW;
|
|
||||||
} else if (keymatch(argv[argn], "fast", 2)) {
|
|
||||||
cinfo->dct_method = JDCT_IFAST;
|
|
||||||
} else if (keymatch(argv[argn], "float", 2)) {
|
|
||||||
cinfo->dct_method = JDCT_FLOAT;
|
|
||||||
} else
|
|
||||||
usage();
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "dither", 2)) {
|
|
||||||
/* Select dithering algorithm. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (keymatch(argv[argn], "fs", 2)) {
|
|
||||||
cinfo->dither_mode = JDITHER_FS;
|
|
||||||
} else if (keymatch(argv[argn], "none", 2)) {
|
|
||||||
cinfo->dither_mode = JDITHER_NONE;
|
|
||||||
} else if (keymatch(argv[argn], "ordered", 2)) {
|
|
||||||
cinfo->dither_mode = JDITHER_ORDERED;
|
|
||||||
} else
|
|
||||||
usage();
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "debug", 1) || keymatch(arg, "verbose", 1)) {
|
|
||||||
/* Enable debug printouts. */
|
|
||||||
/* On first -d, print version identification */
|
|
||||||
static boolean printed_version = FALSE;
|
|
||||||
|
|
||||||
if (! printed_version) {
|
|
||||||
fprintf(stderr, "Independent JPEG Group's DJPEG, version %s\n%s\n",
|
|
||||||
JVERSION, JCOPYRIGHT);
|
|
||||||
printed_version = TRUE;
|
|
||||||
}
|
|
||||||
cinfo->err->trace_level++;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "fast", 1)) {
|
|
||||||
/* Select recommended processing options for quick-and-dirty output. */
|
|
||||||
cinfo->two_pass_quantize = FALSE;
|
|
||||||
cinfo->dither_mode = JDITHER_ORDERED;
|
|
||||||
if (! cinfo->quantize_colors) /* don't override an earlier -colors */
|
|
||||||
cinfo->desired_number_of_colors = 216;
|
|
||||||
cinfo->dct_method = JDCT_FASTEST;
|
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "gif", 1)) {
|
|
||||||
/* GIF output format. */
|
|
||||||
requested_fmt = FMT_GIF;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "grayscale", 2) || keymatch(arg, "greyscale",2)) {
|
|
||||||
/* Force monochrome output. */
|
|
||||||
cinfo->out_color_space = JCS_GRAYSCALE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "map", 3)) {
|
|
||||||
/* Quantize to a color map taken from an input file. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (for_real) { /* too expensive to do twice! */
|
|
||||||
#ifdef QUANT_2PASS_SUPPORTED /* otherwise can't quantize to supplied map */
|
|
||||||
FILE * mapfile;
|
|
||||||
|
|
||||||
if ((mapfile = fopen(argv[argn], READ_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, argv[argn]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
read_color_map(cinfo, mapfile);
|
|
||||||
fclose(mapfile);
|
|
||||||
cinfo->quantize_colors = TRUE;
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "maxmemory", 3)) {
|
|
||||||
/* Maximum memory in Kb (or Mb with 'm'). */
|
|
||||||
long lval;
|
|
||||||
char ch = 'x';
|
|
||||||
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%ld%c", &lval, &ch) < 1)
|
|
||||||
usage();
|
|
||||||
if (ch == 'm' || ch == 'M')
|
|
||||||
lval *= 1000L;
|
|
||||||
cinfo->mem->max_memory_to_use = lval * 1000L;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "nosmooth", 3)) {
|
|
||||||
/* Suppress fancy upsampling. */
|
|
||||||
cinfo->do_fancy_upsampling = FALSE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "onepass", 3)) {
|
|
||||||
/* Use fast one-pass quantization. */
|
|
||||||
cinfo->two_pass_quantize = FALSE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "os2", 3)) {
|
|
||||||
/* BMP output format (OS/2 flavor). */
|
|
||||||
requested_fmt = FMT_OS2;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "outfile", 4)) {
|
|
||||||
/* Set output file name. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
outfilename = argv[argn]; /* save it away for later use */
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "pnm", 1) || keymatch(arg, "ppm", 1)) {
|
|
||||||
/* PPM/PGM output format. */
|
|
||||||
requested_fmt = FMT_PPM;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "rle", 1)) {
|
|
||||||
/* RLE output format. */
|
|
||||||
requested_fmt = FMT_RLE;
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "scale", 1)) {
|
|
||||||
/* Scale the output image by a fraction M/N. */
|
|
||||||
if (++argn >= argc) /* advance to next argument */
|
|
||||||
usage();
|
|
||||||
if (sscanf(argv[argn], "%u/%u",
|
|
||||||
&cinfo->scale_num, &cinfo->scale_denom) < 1)
|
|
||||||
usage();
|
|
||||||
|
|
||||||
} else if (keymatch(arg, "targa", 1)) {
|
|
||||||
/* Targa output format. */
|
|
||||||
requested_fmt = FMT_TARGA;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
usage(); /* bogus switch */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return argn; /* return index of next arg (file name) */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Marker processor for COM and interesting APPn markers.
|
|
||||||
* This replaces the library's built-in processor, which just skips the marker.
|
|
||||||
* We want to print out the marker as text, to the extent possible.
|
|
||||||
* Note this code relies on a non-suspending data source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LOCAL(unsigned int)
|
|
||||||
jpeg_getc (j_decompress_ptr cinfo)
|
|
||||||
/* Read next byte */
|
|
||||||
{
|
|
||||||
struct jpeg_source_mgr * datasrc = cinfo->src;
|
|
||||||
|
|
||||||
if (datasrc->bytes_in_buffer == 0) {
|
|
||||||
if (! (*datasrc->fill_input_buffer) (cinfo))
|
|
||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
|
||||||
}
|
|
||||||
datasrc->bytes_in_buffer--;
|
|
||||||
return GETJOCTET(*datasrc->next_input_byte++);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
print_text_marker (j_decompress_ptr cinfo)
|
|
||||||
{
|
|
||||||
boolean traceit = (cinfo->err->trace_level >= 1);
|
|
||||||
INT32 length;
|
|
||||||
unsigned int ch;
|
|
||||||
unsigned int lastch = 0;
|
|
||||||
|
|
||||||
length = jpeg_getc(cinfo) << 8;
|
|
||||||
length += jpeg_getc(cinfo);
|
|
||||||
length -= 2; /* discount the length word itself */
|
|
||||||
|
|
||||||
if (traceit) {
|
|
||||||
if (cinfo->unread_marker == JPEG_COM)
|
|
||||||
fprintf(stderr, "Comment, length %ld:\n", (long) length);
|
|
||||||
else /* assume it is an APPn otherwise */
|
|
||||||
fprintf(stderr, "APP%d, length %ld:\n",
|
|
||||||
cinfo->unread_marker - JPEG_APP0, (long) length);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (--length >= 0) {
|
|
||||||
ch = jpeg_getc(cinfo);
|
|
||||||
if (traceit) {
|
|
||||||
/* Emit the character in a readable form.
|
|
||||||
* Nonprintables are converted to \nnn form,
|
|
||||||
* while \ is converted to \\.
|
|
||||||
* Newlines in CR, CR/LF, or LF form will be printed as one newline.
|
|
||||||
*/
|
|
||||||
if (ch == '\r') {
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
} else if (ch == '\n') {
|
|
||||||
if (lastch != '\r')
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
} else if (ch == '\\') {
|
|
||||||
fprintf(stderr, "\\\\");
|
|
||||||
} else if (isprint(ch)) {
|
|
||||||
putc(ch, stderr);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "\\%03o", ch);
|
|
||||||
}
|
|
||||||
lastch = ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (traceit)
|
|
||||||
fprintf(stderr, "\n");
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The main program.
|
|
||||||
*/
|
|
||||||
|
|
||||||
int
|
|
||||||
main (int argc, char **argv)
|
|
||||||
{
|
|
||||||
struct jpeg_decompress_struct cinfo;
|
|
||||||
struct jpeg_error_mgr jerr;
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
struct cdjpeg_progress_mgr progress;
|
|
||||||
#endif
|
|
||||||
int file_index;
|
|
||||||
djpeg_dest_ptr dest_mgr = NULL;
|
|
||||||
FILE * input_file;
|
|
||||||
FILE * output_file;
|
|
||||||
JDIMENSION num_scanlines;
|
|
||||||
|
|
||||||
/* On Mac, fetch a command line. */
|
|
||||||
#ifdef USE_CCOMMAND
|
|
||||||
argc = ccommand(&argv);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
progname = argv[0];
|
|
||||||
if (progname == NULL || progname[0] == 0)
|
|
||||||
progname = "djpeg"; /* in case C library doesn't provide it */
|
|
||||||
|
|
||||||
/* Initialize the JPEG decompression object with default error handling. */
|
|
||||||
cinfo.err = jpeg_std_error(&jerr);
|
|
||||||
jpeg_create_decompress(&cinfo);
|
|
||||||
/* Add some application-specific error messages (from cderror.h) */
|
|
||||||
jerr.addon_message_table = cdjpeg_message_table;
|
|
||||||
jerr.first_addon_message = JMSG_FIRSTADDONCODE;
|
|
||||||
jerr.last_addon_message = JMSG_LASTADDONCODE;
|
|
||||||
|
|
||||||
/* Insert custom marker processor for COM and APP12.
|
|
||||||
* APP12 is used by some digital camera makers for textual info,
|
|
||||||
* so we provide the ability to display it as text.
|
|
||||||
* If you like, additional APPn marker types can be selected for display,
|
|
||||||
* but don't try to override APP0 or APP14 this way (see libjpeg.doc).
|
|
||||||
*/
|
|
||||||
jpeg_set_marker_processor(&cinfo, JPEG_COM, print_text_marker);
|
|
||||||
jpeg_set_marker_processor(&cinfo, JPEG_APP0+12, print_text_marker);
|
|
||||||
|
|
||||||
/* Now safe to enable signal catcher. */
|
|
||||||
#ifdef NEED_SIGNAL_CATCHER
|
|
||||||
enable_signal_catcher((j_common_ptr) &cinfo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Scan command line to find file names. */
|
|
||||||
/* It is convenient to use just one switch-parsing routine, but the switch
|
|
||||||
* values read here are ignored; we will rescan the switches after opening
|
|
||||||
* the input file.
|
|
||||||
* (Exception: tracing level set here controls verbosity for COM markers
|
|
||||||
* found during jpeg_read_header...)
|
|
||||||
*/
|
|
||||||
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, FALSE);
|
|
||||||
|
|
||||||
#ifdef TWO_FILE_COMMANDLINE
|
|
||||||
/* Must have either -outfile switch or explicit output file name */
|
|
||||||
if (outfilename == NULL) {
|
|
||||||
if (file_index != argc-2) {
|
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
|
||||||
progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
outfilename = argv[file_index+1];
|
|
||||||
} else {
|
|
||||||
if (file_index != argc-1) {
|
|
||||||
fprintf(stderr, "%s: must name one input and one output file\n",
|
|
||||||
progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/* Unix style: expect zero or one file name */
|
|
||||||
if (file_index < argc-1) {
|
|
||||||
fprintf(stderr, "%s: only one input file\n", progname);
|
|
||||||
usage();
|
|
||||||
}
|
|
||||||
#endif /* TWO_FILE_COMMANDLINE */
|
|
||||||
|
|
||||||
/* Open the input file. */
|
|
||||||
if (file_index < argc) {
|
|
||||||
if ((input_file = fopen(argv[file_index], READ_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, argv[file_index]);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* default input file is stdin */
|
|
||||||
input_file = read_stdin();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Open the output file. */
|
|
||||||
if (outfilename != NULL) {
|
|
||||||
if ((output_file = fopen(outfilename, WRITE_BINARY)) == NULL) {
|
|
||||||
fprintf(stderr, "%s: can't open %s\n", progname, outfilename);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* default output file is stdout */
|
|
||||||
output_file = write_stdout();
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
start_progress_monitor((j_common_ptr) &cinfo, &progress);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Specify data source for decompression */
|
|
||||||
jpeg_stdio_src(&cinfo, input_file);
|
|
||||||
|
|
||||||
/* Read file header, set default decompression parameters */
|
|
||||||
(void) jpeg_read_header(&cinfo, TRUE);
|
|
||||||
|
|
||||||
/* Adjust default decompression parameters by re-parsing the options */
|
|
||||||
file_index = parse_switches(&cinfo, argc, argv, 0, TRUE);
|
|
||||||
|
|
||||||
/* Initialize the output module now to let it override any crucial
|
|
||||||
* option settings (for instance, GIF wants to force color quantization).
|
|
||||||
*/
|
|
||||||
switch (requested_fmt) {
|
|
||||||
#ifdef BMP_SUPPORTED
|
|
||||||
case FMT_BMP:
|
|
||||||
dest_mgr = jinit_write_bmp(&cinfo, FALSE);
|
|
||||||
break;
|
|
||||||
case FMT_OS2:
|
|
||||||
dest_mgr = jinit_write_bmp(&cinfo, TRUE);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef GIF_SUPPORTED
|
|
||||||
case FMT_GIF:
|
|
||||||
dest_mgr = jinit_write_gif(&cinfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef PPM_SUPPORTED
|
|
||||||
case FMT_PPM:
|
|
||||||
dest_mgr = jinit_write_ppm(&cinfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef RLE_SUPPORTED
|
|
||||||
case FMT_RLE:
|
|
||||||
dest_mgr = jinit_write_rle(&cinfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef TARGA_SUPPORTED
|
|
||||||
case FMT_TARGA:
|
|
||||||
dest_mgr = jinit_write_targa(&cinfo);
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(&cinfo, JERR_UNSUPPORTED_FORMAT);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
dest_mgr->output_file = output_file;
|
|
||||||
|
|
||||||
/* Start decompressor */
|
|
||||||
(void) jpeg_start_decompress(&cinfo);
|
|
||||||
|
|
||||||
/* Write output file header */
|
|
||||||
(*dest_mgr->start_output) (&cinfo, dest_mgr);
|
|
||||||
|
|
||||||
/* Process data */
|
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
|
||||||
num_scanlines = jpeg_read_scanlines(&cinfo, dest_mgr->buffer,
|
|
||||||
dest_mgr->buffer_height);
|
|
||||||
(*dest_mgr->put_pixel_rows) (&cinfo, dest_mgr, num_scanlines);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
/* Hack: count final pass as done in case finish_output does an extra pass.
|
|
||||||
* The library won't have updated completed_passes.
|
|
||||||
*/
|
|
||||||
progress.pub.completed_passes = progress.pub.total_passes;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Finish decompression and release memory.
|
|
||||||
* I must do it in this order because output module has allocated memory
|
|
||||||
* of lifespan JPOOL_IMAGE; it needs to finish before releasing memory.
|
|
||||||
*/
|
|
||||||
(*dest_mgr->finish_output) (&cinfo, dest_mgr);
|
|
||||||
(void) jpeg_finish_decompress(&cinfo);
|
|
||||||
jpeg_destroy_decompress(&cinfo);
|
|
||||||
|
|
||||||
/* Close files, if we opened them */
|
|
||||||
if (input_file != stdin)
|
|
||||||
fclose(input_file);
|
|
||||||
if (output_file != stdout)
|
|
||||||
fclose(output_file);
|
|
||||||
|
|
||||||
#ifdef PROGRESS_REPORT
|
|
||||||
end_progress_monitor((j_common_ptr) &cinfo);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* All done. */
|
|
||||||
exit(jerr.num_warnings ? EXIT_WARNING : EXIT_SUCCESS);
|
|
||||||
return 0; /* suppress no-return-value warnings */
|
|
||||||
}
|
|
@ -1,433 +0,0 @@
|
|||||||
/*
|
|
||||||
* example.c
|
|
||||||
*
|
|
||||||
* This file illustrates how to use the IJG code as a subroutine library
|
|
||||||
* to read or write JPEG image files. You should look at this code in
|
|
||||||
* conjunction with the documentation file libjpeg.txt.
|
|
||||||
*
|
|
||||||
* This code will not do anything useful as-is, but it may be helpful as a
|
|
||||||
* skeleton for constructing routines that call the JPEG library.
|
|
||||||
*
|
|
||||||
* We present these routines in the same coding style used in the JPEG code
|
|
||||||
* (ANSI function definitions, etc); but you are of course free to code your
|
|
||||||
* routines in a different style if you prefer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Include file for users of JPEG library.
|
|
||||||
* You will need to have included system headers that define at least
|
|
||||||
* the typedefs FILE and size_t before you can include jpeglib.h.
|
|
||||||
* (stdio.h is sufficient on ANSI-conforming systems.)
|
|
||||||
* You may also wish to include "jerror.h".
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
* <setjmp.h> is used for the optional error recovery mechanism shown in
|
|
||||||
* the second part of the example.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <setjmp.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************** JPEG COMPRESSION SAMPLE INTERFACE *******************/
|
|
||||||
|
|
||||||
/* This half of the example shows how to feed data into the JPEG compressor.
|
|
||||||
* We present a minimal version that does not worry about refinements such
|
|
||||||
* as error recovery (the JPEG code will just exit() if it gets an error).
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* IMAGE DATA FORMATS:
|
|
||||||
*
|
|
||||||
* The standard input image format is a rectangular array of pixels, with
|
|
||||||
* each pixel having the same number of "component" values (color channels).
|
|
||||||
* Each pixel row is an array of JSAMPLEs (which typically are unsigned chars).
|
|
||||||
* If you are working with color data, then the color values for each pixel
|
|
||||||
* must be adjacent in the row; for example, R,G,B,R,G,B,R,G,B,... for 24-bit
|
|
||||||
* RGB color.
|
|
||||||
*
|
|
||||||
* For this example, we'll assume that this data structure matches the way
|
|
||||||
* our application has stored the image in memory, so we can just pass a
|
|
||||||
* pointer to our image buffer. In particular, let's say that the image is
|
|
||||||
* RGB color and is described by:
|
|
||||||
*/
|
|
||||||
|
|
||||||
extern JSAMPLE * image_buffer; /* Points to large array of R,G,B-order data */
|
|
||||||
extern int image_height; /* Number of rows in image */
|
|
||||||
extern int image_width; /* Number of columns in image */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sample routine for JPEG compression. We assume that the target file name
|
|
||||||
* and a compression quality factor are passed in.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
write_JPEG_file (char * filename, int quality)
|
|
||||||
{
|
|
||||||
/* This struct contains the JPEG compression parameters and pointers to
|
|
||||||
* working space (which is allocated as needed by the JPEG library).
|
|
||||||
* It is possible to have several such structures, representing multiple
|
|
||||||
* compression/decompression processes, in existence at once. We refer
|
|
||||||
* to any one struct (and its associated working data) as a "JPEG object".
|
|
||||||
*/
|
|
||||||
struct jpeg_compress_struct cinfo;
|
|
||||||
/* This struct represents a JPEG error handler. It is declared separately
|
|
||||||
* because applications often want to supply a specialized error handler
|
|
||||||
* (see the second half of this file for an example). But here we just
|
|
||||||
* take the easy way out and use the standard error handler, which will
|
|
||||||
* print a message on stderr and call exit() if compression fails.
|
|
||||||
* Note that this struct must live as long as the main JPEG parameter
|
|
||||||
* struct, to avoid dangling-pointer problems.
|
|
||||||
*/
|
|
||||||
struct jpeg_error_mgr jerr;
|
|
||||||
/* More stuff */
|
|
||||||
FILE * outfile; /* target file */
|
|
||||||
JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */
|
|
||||||
int row_stride; /* physical row width in image buffer */
|
|
||||||
|
|
||||||
/* Step 1: allocate and initialize JPEG compression object */
|
|
||||||
|
|
||||||
/* We have to set up the error handler first, in case the initialization
|
|
||||||
* step fails. (Unlikely, but it could happen if you are out of memory.)
|
|
||||||
* This routine fills in the contents of struct jerr, and returns jerr's
|
|
||||||
* address which we place into the link field in cinfo.
|
|
||||||
*/
|
|
||||||
cinfo.err = jpeg_std_error(&jerr);
|
|
||||||
/* Now we can initialize the JPEG compression object. */
|
|
||||||
jpeg_create_compress(&cinfo);
|
|
||||||
|
|
||||||
/* Step 2: specify data destination (eg, a file) */
|
|
||||||
/* Note: steps 2 and 3 can be done in either order. */
|
|
||||||
|
|
||||||
/* Here we use the library-supplied code to send compressed data to a
|
|
||||||
* stdio stream. You can also write your own code to do something else.
|
|
||||||
* VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
|
|
||||||
* requires it in order to write binary files.
|
|
||||||
*/
|
|
||||||
if ((outfile = fopen(filename, "wb")) == NULL) {
|
|
||||||
fprintf(stderr, "can't open %s\n", filename);
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
jpeg_stdio_dest(&cinfo, outfile);
|
|
||||||
|
|
||||||
/* Step 3: set parameters for compression */
|
|
||||||
|
|
||||||
/* First we supply a description of the input image.
|
|
||||||
* Four fields of the cinfo struct must be filled in:
|
|
||||||
*/
|
|
||||||
cinfo.image_width = image_width; /* image width and height, in pixels */
|
|
||||||
cinfo.image_height = image_height;
|
|
||||||
cinfo.input_components = 3; /* # of color components per pixel */
|
|
||||||
cinfo.in_color_space = JCS_RGB; /* colorspace of input image */
|
|
||||||
/* Now use the library's routine to set default compression parameters.
|
|
||||||
* (You must set at least cinfo.in_color_space before calling this,
|
|
||||||
* since the defaults depend on the source color space.)
|
|
||||||
*/
|
|
||||||
jpeg_set_defaults(&cinfo);
|
|
||||||
/* Now you can set any non-default parameters you wish to.
|
|
||||||
* Here we just illustrate the use of quality (quantization table) scaling:
|
|
||||||
*/
|
|
||||||
jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);
|
|
||||||
|
|
||||||
/* Step 4: Start compressor */
|
|
||||||
|
|
||||||
/* TRUE ensures that we will write a complete interchange-JPEG file.
|
|
||||||
* Pass TRUE unless you are very sure of what you're doing.
|
|
||||||
*/
|
|
||||||
jpeg_start_compress(&cinfo, TRUE);
|
|
||||||
|
|
||||||
/* Step 5: while (scan lines remain to be written) */
|
|
||||||
/* jpeg_write_scanlines(...); */
|
|
||||||
|
|
||||||
/* Here we use the library's state variable cinfo.next_scanline as the
|
|
||||||
* loop counter, so that we don't have to keep track ourselves.
|
|
||||||
* To keep things simple, we pass one scanline per call; you can pass
|
|
||||||
* more if you wish, though.
|
|
||||||
*/
|
|
||||||
row_stride = image_width * 3; /* JSAMPLEs per row in image_buffer */
|
|
||||||
|
|
||||||
while (cinfo.next_scanline < cinfo.image_height) {
|
|
||||||
/* jpeg_write_scanlines expects an array of pointers to scanlines.
|
|
||||||
* Here the array is only one element long, but you could pass
|
|
||||||
* more than one scanline at a time if that's more convenient.
|
|
||||||
*/
|
|
||||||
row_pointer[0] = & image_buffer[cinfo.next_scanline * row_stride];
|
|
||||||
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step 6: Finish compression */
|
|
||||||
|
|
||||||
jpeg_finish_compress(&cinfo);
|
|
||||||
/* After finish_compress, we can close the output file. */
|
|
||||||
fclose(outfile);
|
|
||||||
|
|
||||||
/* Step 7: release JPEG compression object */
|
|
||||||
|
|
||||||
/* This is an important step since it will release a good deal of memory. */
|
|
||||||
jpeg_destroy_compress(&cinfo);
|
|
||||||
|
|
||||||
/* And we're done! */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SOME FINE POINTS:
|
|
||||||
*
|
|
||||||
* In the above loop, we ignored the return value of jpeg_write_scanlines,
|
|
||||||
* which is the number of scanlines actually written. We could get away
|
|
||||||
* with this because we were only relying on the value of cinfo.next_scanline,
|
|
||||||
* which will be incremented correctly. If you maintain additional loop
|
|
||||||
* variables then you should be careful to increment them properly.
|
|
||||||
* Actually, for output to a stdio stream you needn't worry, because
|
|
||||||
* then jpeg_write_scanlines will write all the lines passed (or else exit
|
|
||||||
* with a fatal error). Partial writes can only occur if you use a data
|
|
||||||
* destination module that can demand suspension of the compressor.
|
|
||||||
* (If you don't know what that's for, you don't need it.)
|
|
||||||
*
|
|
||||||
* If the compressor requires full-image buffers (for entropy-coding
|
|
||||||
* optimization or a multi-scan JPEG file), it will create temporary
|
|
||||||
* files for anything that doesn't fit within the maximum-memory setting.
|
|
||||||
* (Note that temp files are NOT needed if you use the default parameters.)
|
|
||||||
* On some systems you may need to set up a signal handler to ensure that
|
|
||||||
* temporary files are deleted if the program is interrupted. See libjpeg.txt.
|
|
||||||
*
|
|
||||||
* Scanlines MUST be supplied in top-to-bottom order if you want your JPEG
|
|
||||||
* files to be compatible with everyone else's. If you cannot readily read
|
|
||||||
* your data in that order, you'll need an intermediate array to hold the
|
|
||||||
* image. See rdtarga.c or rdbmp.c for examples of handling bottom-to-top
|
|
||||||
* source data using the JPEG code's internal virtual-array mechanisms.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/******************** JPEG DECOMPRESSION SAMPLE INTERFACE *******************/
|
|
||||||
|
|
||||||
/* This half of the example shows how to read data from the JPEG decompressor.
|
|
||||||
* It's a bit more refined than the above, in that we show:
|
|
||||||
* (a) how to modify the JPEG library's standard error-reporting behavior;
|
|
||||||
* (b) how to allocate workspace using the library's memory manager.
|
|
||||||
*
|
|
||||||
* Just to make this example a little different from the first one, we'll
|
|
||||||
* assume that we do not intend to put the whole image into an in-memory
|
|
||||||
* buffer, but to send it line-by-line someplace else. We need a one-
|
|
||||||
* scanline-high JSAMPLE array as a work buffer, and we will let the JPEG
|
|
||||||
* memory manager allocate it for us. This approach is actually quite useful
|
|
||||||
* because we don't need to remember to deallocate the buffer separately: it
|
|
||||||
* will go away automatically when the JPEG object is cleaned up.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ERROR HANDLING:
|
|
||||||
*
|
|
||||||
* The JPEG library's standard error handler (jerror.c) is divided into
|
|
||||||
* several "methods" which you can override individually. This lets you
|
|
||||||
* adjust the behavior without duplicating a lot of code, which you might
|
|
||||||
* have to update with each future release.
|
|
||||||
*
|
|
||||||
* Our example here shows how to override the "error_exit" method so that
|
|
||||||
* control is returned to the library's caller when a fatal error occurs,
|
|
||||||
* rather than calling exit() as the standard error_exit method does.
|
|
||||||
*
|
|
||||||
* We use C's setjmp/longjmp facility to return control. This means that the
|
|
||||||
* routine which calls the JPEG library must first execute a setjmp() call to
|
|
||||||
* establish the return point. We want the replacement error_exit to do a
|
|
||||||
* longjmp(). But we need to make the setjmp buffer accessible to the
|
|
||||||
* error_exit routine. To do this, we make a private extension of the
|
|
||||||
* standard JPEG error handler object. (If we were using C++, we'd say we
|
|
||||||
* were making a subclass of the regular error handler.)
|
|
||||||
*
|
|
||||||
* Here's the extended error handler struct:
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct my_error_mgr {
|
|
||||||
struct jpeg_error_mgr pub; /* "public" fields */
|
|
||||||
|
|
||||||
jmp_buf setjmp_buffer; /* for return to caller */
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct my_error_mgr * my_error_ptr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Here's the routine that will replace the standard error_exit method:
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
my_error_exit (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
/* cinfo->err really points to a my_error_mgr struct, so coerce pointer */
|
|
||||||
my_error_ptr myerr = (my_error_ptr) cinfo->err;
|
|
||||||
|
|
||||||
/* Always display the message. */
|
|
||||||
/* We could postpone this until after returning, if we chose. */
|
|
||||||
(*cinfo->err->output_message) (cinfo);
|
|
||||||
|
|
||||||
/* Return control to the setjmp point */
|
|
||||||
longjmp(myerr->setjmp_buffer, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sample routine for JPEG decompression. We assume that the source file name
|
|
||||||
* is passed in. We want to return 1 on success, 0 on error.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(int)
|
|
||||||
read_JPEG_file (char * filename)
|
|
||||||
{
|
|
||||||
/* This struct contains the JPEG decompression parameters and pointers to
|
|
||||||
* working space (which is allocated as needed by the JPEG library).
|
|
||||||
*/
|
|
||||||
struct jpeg_decompress_struct cinfo;
|
|
||||||
/* We use our private extension JPEG error handler.
|
|
||||||
* Note that this struct must live as long as the main JPEG parameter
|
|
||||||
* struct, to avoid dangling-pointer problems.
|
|
||||||
*/
|
|
||||||
struct my_error_mgr jerr;
|
|
||||||
/* More stuff */
|
|
||||||
FILE * infile; /* source file */
|
|
||||||
JSAMPARRAY buffer; /* Output row buffer */
|
|
||||||
int row_stride; /* physical row width in output buffer */
|
|
||||||
|
|
||||||
/* In this example we want to open the input file before doing anything else,
|
|
||||||
* so that the setjmp() error recovery below can assume the file is open.
|
|
||||||
* VERY IMPORTANT: use "b" option to fopen() if you are on a machine that
|
|
||||||
* requires it in order to read binary files.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((infile = fopen(filename, "rb")) == NULL) {
|
|
||||||
fprintf(stderr, "can't open %s\n", filename);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step 1: allocate and initialize JPEG decompression object */
|
|
||||||
|
|
||||||
/* We set up the normal JPEG error routines, then override error_exit. */
|
|
||||||
cinfo.err = jpeg_std_error(&jerr.pub);
|
|
||||||
jerr.pub.error_exit = my_error_exit;
|
|
||||||
/* Establish the setjmp return context for my_error_exit to use. */
|
|
||||||
if (setjmp(jerr.setjmp_buffer)) {
|
|
||||||
/* If we get here, the JPEG code has signaled an error.
|
|
||||||
* We need to clean up the JPEG object, close the input file, and return.
|
|
||||||
*/
|
|
||||||
jpeg_destroy_decompress(&cinfo);
|
|
||||||
fclose(infile);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* Now we can initialize the JPEG decompression object. */
|
|
||||||
jpeg_create_decompress(&cinfo);
|
|
||||||
|
|
||||||
/* Step 2: specify data source (eg, a file) */
|
|
||||||
|
|
||||||
jpeg_stdio_src(&cinfo, infile);
|
|
||||||
|
|
||||||
/* Step 3: read file parameters with jpeg_read_header() */
|
|
||||||
|
|
||||||
(void) jpeg_read_header(&cinfo, TRUE);
|
|
||||||
/* We can ignore the return value from jpeg_read_header since
|
|
||||||
* (a) suspension is not possible with the stdio data source, and
|
|
||||||
* (b) we passed TRUE to reject a tables-only JPEG file as an error.
|
|
||||||
* See libjpeg.txt for more info.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Step 4: set parameters for decompression */
|
|
||||||
|
|
||||||
/* In this example, we don't need to change any of the defaults set by
|
|
||||||
* jpeg_read_header(), so we do nothing here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Step 5: Start decompressor */
|
|
||||||
|
|
||||||
(void) jpeg_start_decompress(&cinfo);
|
|
||||||
/* We can ignore the return value since suspension is not possible
|
|
||||||
* with the stdio data source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* We may need to do some setup of our own at this point before reading
|
|
||||||
* the data. After jpeg_start_decompress() we have the correct scaled
|
|
||||||
* output image dimensions available, as well as the output colormap
|
|
||||||
* if we asked for color quantization.
|
|
||||||
* In this example, we need to make an output work buffer of the right size.
|
|
||||||
*/
|
|
||||||
/* JSAMPLEs per row in output buffer */
|
|
||||||
row_stride = cinfo.output_width * cinfo.output_components;
|
|
||||||
/* Make a one-row-high sample array that will go away when done with image */
|
|
||||||
buffer = (*cinfo.mem->alloc_sarray)
|
|
||||||
((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
|
|
||||||
|
|
||||||
/* Step 6: while (scan lines remain to be read) */
|
|
||||||
/* jpeg_read_scanlines(...); */
|
|
||||||
|
|
||||||
/* Here we use the library's state variable cinfo.output_scanline as the
|
|
||||||
* loop counter, so that we don't have to keep track ourselves.
|
|
||||||
*/
|
|
||||||
while (cinfo.output_scanline < cinfo.output_height) {
|
|
||||||
/* jpeg_read_scanlines expects an array of pointers to scanlines.
|
|
||||||
* Here the array is only one element long, but you could ask for
|
|
||||||
* more than one scanline at a time if that's more convenient.
|
|
||||||
*/
|
|
||||||
(void) jpeg_read_scanlines(&cinfo, buffer, 1);
|
|
||||||
/* Assume put_scanline_someplace wants a pointer and sample count. */
|
|
||||||
put_scanline_someplace(buffer[0], row_stride);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Step 7: Finish decompression */
|
|
||||||
|
|
||||||
(void) jpeg_finish_decompress(&cinfo);
|
|
||||||
/* We can ignore the return value since suspension is not possible
|
|
||||||
* with the stdio data source.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Step 8: Release JPEG decompression object */
|
|
||||||
|
|
||||||
/* This is an important step since it will release a good deal of memory. */
|
|
||||||
jpeg_destroy_decompress(&cinfo);
|
|
||||||
|
|
||||||
/* After finish_decompress, we can close the input file.
|
|
||||||
* Here we postpone it until after no more JPEG errors are possible,
|
|
||||||
* so as to simplify the setjmp error logic above. (Actually, I don't
|
|
||||||
* think that jpeg_destroy can do an error exit, but why assume anything...)
|
|
||||||
*/
|
|
||||||
fclose(infile);
|
|
||||||
|
|
||||||
/* At this point you may want to check to see whether any corrupt-data
|
|
||||||
* warnings occurred (test whether jerr.pub.num_warnings is nonzero).
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* And we're done! */
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* SOME FINE POINTS:
|
|
||||||
*
|
|
||||||
* In the above code, we ignored the return value of jpeg_read_scanlines,
|
|
||||||
* which is the number of scanlines actually read. We could get away with
|
|
||||||
* this because we asked for only one line at a time and we weren't using
|
|
||||||
* a suspending data source. See libjpeg.txt for more info.
|
|
||||||
*
|
|
||||||
* We cheated a bit by calling alloc_sarray() after jpeg_start_decompress();
|
|
||||||
* we should have done it beforehand to ensure that the space would be
|
|
||||||
* counted against the JPEG max_memory setting. In some systems the above
|
|
||||||
* code would risk an out-of-memory error. However, in general we don't
|
|
||||||
* know the output image dimensions before jpeg_start_decompress(), unless we
|
|
||||||
* call jpeg_calc_output_dimensions(). See libjpeg.txt for more about this.
|
|
||||||
*
|
|
||||||
* Scanlines are returned in the same order as they appear in the JPEG file,
|
|
||||||
* which is standardly top-to-bottom. If you must emit data bottom-to-top,
|
|
||||||
* you can use one of the virtual arrays provided by the JPEG memory manager
|
|
||||||
* to invert the data. See wrbmp.c for an example.
|
|
||||||
*
|
|
||||||
* As with compression, some operating modes may require temporary files.
|
|
||||||
* On some systems you may need to set up a signal handler to ensure that
|
|
||||||
* temporary files are deleted if the program is interrupted. See libjpeg.txt.
|
|
||||||
*/
|
|
@ -1,215 +0,0 @@
|
|||||||
IJG JPEG LIBRARY: FILE LIST
|
|
||||||
|
|
||||||
Copyright (C) 1994-2013, Thomas G. Lane, Guido Vollbeding.
|
|
||||||
This file is part of the Independent JPEG Group's software.
|
|
||||||
For conditions of distribution and use, see the accompanying README file.
|
|
||||||
|
|
||||||
|
|
||||||
Here is a road map to the files in the IJG JPEG distribution. The
|
|
||||||
distribution includes the JPEG library proper, plus two application
|
|
||||||
programs ("cjpeg" and "djpeg") which use the library to convert JPEG
|
|
||||||
files to and from some other popular image formats. A third application
|
|
||||||
"jpegtran" uses the library to do lossless conversion between different
|
|
||||||
variants of JPEG. There are also two stand-alone applications,
|
|
||||||
"rdjpgcom" and "wrjpgcom".
|
|
||||||
|
|
||||||
|
|
||||||
THE JPEG LIBRARY
|
|
||||||
================
|
|
||||||
|
|
||||||
Include files:
|
|
||||||
|
|
||||||
jpeglib.h JPEG library's exported data and function declarations.
|
|
||||||
jconfig.h Configuration declarations. Note: this file is not present
|
|
||||||
in the distribution; it is generated during installation.
|
|
||||||
jmorecfg.h Additional configuration declarations; need not be changed
|
|
||||||
for a standard installation.
|
|
||||||
jerror.h Declares JPEG library's error and trace message codes.
|
|
||||||
jinclude.h Central include file used by all IJG .c files to reference
|
|
||||||
system include files.
|
|
||||||
jpegint.h JPEG library's internal data structures.
|
|
||||||
jdct.h Private declarations for forward & reverse DCT subsystems.
|
|
||||||
jmemsys.h Private declarations for memory management subsystem.
|
|
||||||
jversion.h Version information.
|
|
||||||
|
|
||||||
Applications using the library should include jpeglib.h (which in turn
|
|
||||||
includes jconfig.h and jmorecfg.h). Optionally, jerror.h may be included
|
|
||||||
if the application needs to reference individual JPEG error codes. The
|
|
||||||
other include files are intended for internal use and would not normally
|
|
||||||
be included by an application program. (cjpeg/djpeg/etc do use jinclude.h,
|
|
||||||
since its function is to improve portability of the whole IJG distribution.
|
|
||||||
Most other applications will directly include the system include files they
|
|
||||||
want, and hence won't need jinclude.h.)
|
|
||||||
|
|
||||||
|
|
||||||
C source code files:
|
|
||||||
|
|
||||||
These files contain most of the functions intended to be called directly by
|
|
||||||
an application program:
|
|
||||||
|
|
||||||
jcapimin.c Application program interface: core routines for compression.
|
|
||||||
jcapistd.c Application program interface: standard compression.
|
|
||||||
jdapimin.c Application program interface: core routines for decompression.
|
|
||||||
jdapistd.c Application program interface: standard decompression.
|
|
||||||
jcomapi.c Application program interface routines common to compression
|
|
||||||
and decompression.
|
|
||||||
jcparam.c Compression parameter setting helper routines.
|
|
||||||
jctrans.c API and library routines for transcoding compression.
|
|
||||||
jdtrans.c API and library routines for transcoding decompression.
|
|
||||||
|
|
||||||
Compression side of the library:
|
|
||||||
|
|
||||||
jcinit.c Initialization: determines which other modules to use.
|
|
||||||
jcmaster.c Master control: setup and inter-pass sequencing logic.
|
|
||||||
jcmainct.c Main buffer controller (preprocessor => JPEG compressor).
|
|
||||||
jcprepct.c Preprocessor buffer controller.
|
|
||||||
jccoefct.c Buffer controller for DCT coefficient buffer.
|
|
||||||
jccolor.c Color space conversion.
|
|
||||||
jcsample.c Downsampling.
|
|
||||||
jcdctmgr.c DCT manager (DCT implementation selection & control).
|
|
||||||
jfdctint.c Forward DCT using slow-but-accurate integer method.
|
|
||||||
jfdctfst.c Forward DCT using faster, less accurate integer method.
|
|
||||||
jfdctflt.c Forward DCT using floating-point arithmetic.
|
|
||||||
jchuff.c Huffman entropy coding.
|
|
||||||
jcarith.c Arithmetic entropy coding.
|
|
||||||
jcmarker.c JPEG marker writing.
|
|
||||||
jdatadst.c Data destination managers for memory and stdio output.
|
|
||||||
|
|
||||||
Decompression side of the library:
|
|
||||||
|
|
||||||
jdmaster.c Master control: determines which other modules to use.
|
|
||||||
jdinput.c Input controller: controls input processing modules.
|
|
||||||
jdmainct.c Main buffer controller (JPEG decompressor => postprocessor).
|
|
||||||
jdcoefct.c Buffer controller for DCT coefficient buffer.
|
|
||||||
jdpostct.c Postprocessor buffer controller.
|
|
||||||
jdmarker.c JPEG marker reading.
|
|
||||||
jdhuff.c Huffman entropy decoding.
|
|
||||||
jdarith.c Arithmetic entropy decoding.
|
|
||||||
jddctmgr.c IDCT manager (IDCT implementation selection & control).
|
|
||||||
jidctint.c Inverse DCT using slow-but-accurate integer method.
|
|
||||||
jidctfst.c Inverse DCT using faster, less accurate integer method.
|
|
||||||
jidctflt.c Inverse DCT using floating-point arithmetic.
|
|
||||||
jdsample.c Upsampling.
|
|
||||||
jdcolor.c Color space conversion.
|
|
||||||
jdmerge.c Merged upsampling/color conversion (faster, lower quality).
|
|
||||||
jquant1.c One-pass color quantization using a fixed-spacing colormap.
|
|
||||||
jquant2.c Two-pass color quantization using a custom-generated colormap.
|
|
||||||
Also handles one-pass quantization to an externally given map.
|
|
||||||
jdatasrc.c Data source managers for memory and stdio input.
|
|
||||||
|
|
||||||
Support files for both compression and decompression:
|
|
||||||
|
|
||||||
jaricom.c Tables for common use in arithmetic entropy encoding and
|
|
||||||
decoding routines.
|
|
||||||
jerror.c Standard error handling routines (application replaceable).
|
|
||||||
jmemmgr.c System-independent (more or less) memory management code.
|
|
||||||
jutils.c Miscellaneous utility routines.
|
|
||||||
|
|
||||||
jmemmgr.c relies on a system-dependent memory management module. The IJG
|
|
||||||
distribution includes the following implementations of the system-dependent
|
|
||||||
module:
|
|
||||||
|
|
||||||
jmemnobs.c "No backing store": assumes adequate virtual memory exists.
|
|
||||||
jmemansi.c Makes temporary files with ANSI-standard routine tmpfile().
|
|
||||||
jmemname.c Makes temporary files with program-generated file names.
|
|
||||||
jmemdos.c Custom implementation for MS-DOS (16-bit environment only):
|
|
||||||
can use extended and expanded memory as well as temp files.
|
|
||||||
jmemmac.c Custom implementation for Apple Macintosh.
|
|
||||||
|
|
||||||
Exactly one of the system-dependent modules should be configured into an
|
|
||||||
installed JPEG library (see install.txt for hints about which one to use).
|
|
||||||
On unusual systems you may find it worthwhile to make a special
|
|
||||||
system-dependent memory manager.
|
|
||||||
|
|
||||||
|
|
||||||
Non-C source code files:
|
|
||||||
|
|
||||||
jmemdosa.asm 80x86 assembly code support for jmemdos.c; used only in
|
|
||||||
MS-DOS-specific configurations of the JPEG library.
|
|
||||||
|
|
||||||
|
|
||||||
CJPEG/DJPEG/JPEGTRAN
|
|
||||||
====================
|
|
||||||
|
|
||||||
Include files:
|
|
||||||
|
|
||||||
cdjpeg.h Declarations shared by cjpeg/djpeg/jpegtran modules.
|
|
||||||
cderror.h Additional error and trace message codes for cjpeg et al.
|
|
||||||
transupp.h Declarations for jpegtran support routines in transupp.c.
|
|
||||||
|
|
||||||
C source code files:
|
|
||||||
|
|
||||||
cjpeg.c Main program for cjpeg.
|
|
||||||
djpeg.c Main program for djpeg.
|
|
||||||
jpegtran.c Main program for jpegtran.
|
|
||||||
cdjpeg.c Utility routines used by all three programs.
|
|
||||||
rdcolmap.c Code to read a colormap file for djpeg's "-map" switch.
|
|
||||||
rdswitch.c Code to process some of cjpeg's more complex switches.
|
|
||||||
Also used by jpegtran.
|
|
||||||
transupp.c Support code for jpegtran: lossless image manipulations.
|
|
||||||
|
|
||||||
Image file reader modules for cjpeg:
|
|
||||||
|
|
||||||
rdbmp.c BMP file input.
|
|
||||||
rdgif.c GIF file input (now just a stub).
|
|
||||||
rdppm.c PPM/PGM file input.
|
|
||||||
rdrle.c Utah RLE file input.
|
|
||||||
rdtarga.c Targa file input.
|
|
||||||
|
|
||||||
Image file writer modules for djpeg:
|
|
||||||
|
|
||||||
wrbmp.c BMP file output.
|
|
||||||
wrgif.c GIF file output (a mere shadow of its former self).
|
|
||||||
wrppm.c PPM/PGM file output.
|
|
||||||
wrrle.c Utah RLE file output.
|
|
||||||
wrtarga.c Targa file output.
|
|
||||||
|
|
||||||
|
|
||||||
RDJPGCOM/WRJPGCOM
|
|
||||||
=================
|
|
||||||
|
|
||||||
C source code files:
|
|
||||||
|
|
||||||
rdjpgcom.c Stand-alone rdjpgcom application.
|
|
||||||
wrjpgcom.c Stand-alone wrjpgcom application.
|
|
||||||
|
|
||||||
These programs do not depend on the IJG library. They do use
|
|
||||||
jconfig.h and jinclude.h, only to improve portability.
|
|
||||||
|
|
||||||
|
|
||||||
ADDITIONAL FILES
|
|
||||||
================
|
|
||||||
|
|
||||||
Documentation (see README for a guide to the documentation files):
|
|
||||||
|
|
||||||
README Master documentation file.
|
|
||||||
*.txt Other documentation files.
|
|
||||||
*.1 Documentation in Unix man page format.
|
|
||||||
change.log Version-to-version change highlights.
|
|
||||||
example.c Sample code for calling JPEG library.
|
|
||||||
|
|
||||||
Configuration/installation files and programs (see install.txt for more info):
|
|
||||||
|
|
||||||
configure Unix shell script to perform automatic configuration.
|
|
||||||
configure.ac Source file for use with Autoconf to generate configure.
|
|
||||||
ltmain.sh Support scripts for configure (from GNU libtool).
|
|
||||||
config.guess
|
|
||||||
config.sub
|
|
||||||
depcomp
|
|
||||||
missing
|
|
||||||
ar-lib
|
|
||||||
compile
|
|
||||||
install-sh Install shell script for those Unix systems lacking one.
|
|
||||||
Makefile.in Makefile input for configure.
|
|
||||||
Makefile.am Source file for use with Automake to generate Makefile.in.
|
|
||||||
ckconfig.c Program to generate jconfig.h on non-Unix systems.
|
|
||||||
jconfig.txt Template for making jconfig.h by hand.
|
|
||||||
mak*.* Sample makefiles for particular systems.
|
|
||||||
jconfig.* Sample jconfig.h for particular systems.
|
|
||||||
libjpeg.map Script to generate shared library with versioned symbols.
|
|
||||||
aclocal.m4 M4 macro definitions for use with Autoconf.
|
|
||||||
|
|
||||||
Test files (see install.txt for test procedure):
|
|
||||||
|
|
||||||
test*.* Source and comparison files for confidence test.
|
|
||||||
These are binary image files, NOT text files.
|
|
@ -1,527 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2011-11-20.07; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# 'make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
if test -z "$doit"; then
|
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *' '* | *'
|
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t) dst_arg=$2
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $dst_arg in
|
|
||||||
-* | [=\(\)!]) dst_arg=./$dst_arg;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call 'install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
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.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names problematic for 'test' and other utilities.
|
|
||||||
case $src in
|
|
||||||
-* | [=\(\)!]) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dst=$dst_arg
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
[-=\(\)!]*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
$posix_glob set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
$posix_glob set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test X"$d" = X && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
$posix_glob set +f &&
|
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
@ -1,153 +0,0 @@
|
|||||||
/*
|
|
||||||
* jaricom.c
|
|
||||||
*
|
|
||||||
* Developed 1997-2011 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains probability estimation tables for common use in
|
|
||||||
* arithmetic entropy encoding and decoding routines.
|
|
||||||
*
|
|
||||||
* This data represents Table D.3 in the JPEG spec (D.2 in the draft),
|
|
||||||
* ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81, and Table 24
|
|
||||||
* in the JBIG spec, ISO/IEC IS 11544 and CCITT Recommendation ITU-T T.82.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
/* The following #define specifies the packing of the four components
|
|
||||||
* into the compact INT32 representation.
|
|
||||||
* Note that this formula must match the actual arithmetic encoder
|
|
||||||
* and decoder implementation. The implementation has to be changed
|
|
||||||
* if this formula is changed.
|
|
||||||
* The current organization is leaned on Markus Kuhn's JBIG
|
|
||||||
* implementation (jbig_tab.c).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define V(i,a,b,c,d) (((INT32)a << 16) | ((INT32)c << 8) | ((INT32)d << 7) | b)
|
|
||||||
|
|
||||||
const INT32 jpeg_aritab[113+1] = {
|
|
||||||
/*
|
|
||||||
* Index, Qe_Value, Next_Index_LPS, Next_Index_MPS, Switch_MPS
|
|
||||||
*/
|
|
||||||
V( 0, 0x5a1d, 1, 1, 1 ),
|
|
||||||
V( 1, 0x2586, 14, 2, 0 ),
|
|
||||||
V( 2, 0x1114, 16, 3, 0 ),
|
|
||||||
V( 3, 0x080b, 18, 4, 0 ),
|
|
||||||
V( 4, 0x03d8, 20, 5, 0 ),
|
|
||||||
V( 5, 0x01da, 23, 6, 0 ),
|
|
||||||
V( 6, 0x00e5, 25, 7, 0 ),
|
|
||||||
V( 7, 0x006f, 28, 8, 0 ),
|
|
||||||
V( 8, 0x0036, 30, 9, 0 ),
|
|
||||||
V( 9, 0x001a, 33, 10, 0 ),
|
|
||||||
V( 10, 0x000d, 35, 11, 0 ),
|
|
||||||
V( 11, 0x0006, 9, 12, 0 ),
|
|
||||||
V( 12, 0x0003, 10, 13, 0 ),
|
|
||||||
V( 13, 0x0001, 12, 13, 0 ),
|
|
||||||
V( 14, 0x5a7f, 15, 15, 1 ),
|
|
||||||
V( 15, 0x3f25, 36, 16, 0 ),
|
|
||||||
V( 16, 0x2cf2, 38, 17, 0 ),
|
|
||||||
V( 17, 0x207c, 39, 18, 0 ),
|
|
||||||
V( 18, 0x17b9, 40, 19, 0 ),
|
|
||||||
V( 19, 0x1182, 42, 20, 0 ),
|
|
||||||
V( 20, 0x0cef, 43, 21, 0 ),
|
|
||||||
V( 21, 0x09a1, 45, 22, 0 ),
|
|
||||||
V( 22, 0x072f, 46, 23, 0 ),
|
|
||||||
V( 23, 0x055c, 48, 24, 0 ),
|
|
||||||
V( 24, 0x0406, 49, 25, 0 ),
|
|
||||||
V( 25, 0x0303, 51, 26, 0 ),
|
|
||||||
V( 26, 0x0240, 52, 27, 0 ),
|
|
||||||
V( 27, 0x01b1, 54, 28, 0 ),
|
|
||||||
V( 28, 0x0144, 56, 29, 0 ),
|
|
||||||
V( 29, 0x00f5, 57, 30, 0 ),
|
|
||||||
V( 30, 0x00b7, 59, 31, 0 ),
|
|
||||||
V( 31, 0x008a, 60, 32, 0 ),
|
|
||||||
V( 32, 0x0068, 62, 33, 0 ),
|
|
||||||
V( 33, 0x004e, 63, 34, 0 ),
|
|
||||||
V( 34, 0x003b, 32, 35, 0 ),
|
|
||||||
V( 35, 0x002c, 33, 9, 0 ),
|
|
||||||
V( 36, 0x5ae1, 37, 37, 1 ),
|
|
||||||
V( 37, 0x484c, 64, 38, 0 ),
|
|
||||||
V( 38, 0x3a0d, 65, 39, 0 ),
|
|
||||||
V( 39, 0x2ef1, 67, 40, 0 ),
|
|
||||||
V( 40, 0x261f, 68, 41, 0 ),
|
|
||||||
V( 41, 0x1f33, 69, 42, 0 ),
|
|
||||||
V( 42, 0x19a8, 70, 43, 0 ),
|
|
||||||
V( 43, 0x1518, 72, 44, 0 ),
|
|
||||||
V( 44, 0x1177, 73, 45, 0 ),
|
|
||||||
V( 45, 0x0e74, 74, 46, 0 ),
|
|
||||||
V( 46, 0x0bfb, 75, 47, 0 ),
|
|
||||||
V( 47, 0x09f8, 77, 48, 0 ),
|
|
||||||
V( 48, 0x0861, 78, 49, 0 ),
|
|
||||||
V( 49, 0x0706, 79, 50, 0 ),
|
|
||||||
V( 50, 0x05cd, 48, 51, 0 ),
|
|
||||||
V( 51, 0x04de, 50, 52, 0 ),
|
|
||||||
V( 52, 0x040f, 50, 53, 0 ),
|
|
||||||
V( 53, 0x0363, 51, 54, 0 ),
|
|
||||||
V( 54, 0x02d4, 52, 55, 0 ),
|
|
||||||
V( 55, 0x025c, 53, 56, 0 ),
|
|
||||||
V( 56, 0x01f8, 54, 57, 0 ),
|
|
||||||
V( 57, 0x01a4, 55, 58, 0 ),
|
|
||||||
V( 58, 0x0160, 56, 59, 0 ),
|
|
||||||
V( 59, 0x0125, 57, 60, 0 ),
|
|
||||||
V( 60, 0x00f6, 58, 61, 0 ),
|
|
||||||
V( 61, 0x00cb, 59, 62, 0 ),
|
|
||||||
V( 62, 0x00ab, 61, 63, 0 ),
|
|
||||||
V( 63, 0x008f, 61, 32, 0 ),
|
|
||||||
V( 64, 0x5b12, 65, 65, 1 ),
|
|
||||||
V( 65, 0x4d04, 80, 66, 0 ),
|
|
||||||
V( 66, 0x412c, 81, 67, 0 ),
|
|
||||||
V( 67, 0x37d8, 82, 68, 0 ),
|
|
||||||
V( 68, 0x2fe8, 83, 69, 0 ),
|
|
||||||
V( 69, 0x293c, 84, 70, 0 ),
|
|
||||||
V( 70, 0x2379, 86, 71, 0 ),
|
|
||||||
V( 71, 0x1edf, 87, 72, 0 ),
|
|
||||||
V( 72, 0x1aa9, 87, 73, 0 ),
|
|
||||||
V( 73, 0x174e, 72, 74, 0 ),
|
|
||||||
V( 74, 0x1424, 72, 75, 0 ),
|
|
||||||
V( 75, 0x119c, 74, 76, 0 ),
|
|
||||||
V( 76, 0x0f6b, 74, 77, 0 ),
|
|
||||||
V( 77, 0x0d51, 75, 78, 0 ),
|
|
||||||
V( 78, 0x0bb6, 77, 79, 0 ),
|
|
||||||
V( 79, 0x0a40, 77, 48, 0 ),
|
|
||||||
V( 80, 0x5832, 80, 81, 1 ),
|
|
||||||
V( 81, 0x4d1c, 88, 82, 0 ),
|
|
||||||
V( 82, 0x438e, 89, 83, 0 ),
|
|
||||||
V( 83, 0x3bdd, 90, 84, 0 ),
|
|
||||||
V( 84, 0x34ee, 91, 85, 0 ),
|
|
||||||
V( 85, 0x2eae, 92, 86, 0 ),
|
|
||||||
V( 86, 0x299a, 93, 87, 0 ),
|
|
||||||
V( 87, 0x2516, 86, 71, 0 ),
|
|
||||||
V( 88, 0x5570, 88, 89, 1 ),
|
|
||||||
V( 89, 0x4ca9, 95, 90, 0 ),
|
|
||||||
V( 90, 0x44d9, 96, 91, 0 ),
|
|
||||||
V( 91, 0x3e22, 97, 92, 0 ),
|
|
||||||
V( 92, 0x3824, 99, 93, 0 ),
|
|
||||||
V( 93, 0x32b4, 99, 94, 0 ),
|
|
||||||
V( 94, 0x2e17, 93, 86, 0 ),
|
|
||||||
V( 95, 0x56a8, 95, 96, 1 ),
|
|
||||||
V( 96, 0x4f46, 101, 97, 0 ),
|
|
||||||
V( 97, 0x47e5, 102, 98, 0 ),
|
|
||||||
V( 98, 0x41cf, 103, 99, 0 ),
|
|
||||||
V( 99, 0x3c3d, 104, 100, 0 ),
|
|
||||||
V( 100, 0x375e, 99, 93, 0 ),
|
|
||||||
V( 101, 0x5231, 105, 102, 0 ),
|
|
||||||
V( 102, 0x4c0f, 106, 103, 0 ),
|
|
||||||
V( 103, 0x4639, 107, 104, 0 ),
|
|
||||||
V( 104, 0x415e, 103, 99, 0 ),
|
|
||||||
V( 105, 0x5627, 105, 106, 1 ),
|
|
||||||
V( 106, 0x50e7, 108, 107, 0 ),
|
|
||||||
V( 107, 0x4b85, 109, 103, 0 ),
|
|
||||||
V( 108, 0x5597, 110, 109, 0 ),
|
|
||||||
V( 109, 0x504f, 111, 107, 0 ),
|
|
||||||
V( 110, 0x5a10, 110, 111, 1 ),
|
|
||||||
V( 111, 0x5522, 112, 109, 0 ),
|
|
||||||
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 )
|
|
||||||
};
|
|
@ -1,288 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcapimin.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1998, Thomas G. Lane.
|
|
||||||
* Modified 2003-2010 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains application interface code for the compression half
|
|
||||||
* of the JPEG library. These are the "minimum" API routines that may be
|
|
||||||
* needed in either the normal full-compression case or the transcoding-only
|
|
||||||
* case.
|
|
||||||
*
|
|
||||||
* Most of the routines intended to be called directly by an application
|
|
||||||
* are in this file or in jcapistd.c. But also see jcparam.c for
|
|
||||||
* parameter-setup helper routines, jcomapi.c for routines shared by
|
|
||||||
* compression and decompression, and jctrans.c for the transcoding case.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialization of a JPEG compression object.
|
|
||||||
* The error manager must already be set up (in case memory manager fails).
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Guard against version mismatches between library and caller. */
|
|
||||||
cinfo->mem = NULL; /* so jpeg_destroy knows mem mgr not called */
|
|
||||||
if (version != JPEG_LIB_VERSION)
|
|
||||||
ERREXIT2(cinfo, JERR_BAD_LIB_VERSION, JPEG_LIB_VERSION, version);
|
|
||||||
if (structsize != SIZEOF(struct jpeg_compress_struct))
|
|
||||||
ERREXIT2(cinfo, JERR_BAD_STRUCT_SIZE,
|
|
||||||
(int) SIZEOF(struct jpeg_compress_struct), (int) structsize);
|
|
||||||
|
|
||||||
/* For debugging purposes, we zero the whole master structure.
|
|
||||||
* But the application has already set the err pointer, and may have set
|
|
||||||
* client_data, so we have to save and restore those fields.
|
|
||||||
* Note: if application hasn't set client_data, tools like Purify may
|
|
||||||
* complain here.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
struct jpeg_error_mgr * err = cinfo->err;
|
|
||||||
void * client_data = cinfo->client_data; /* ignore Purify complaint here */
|
|
||||||
MEMZERO(cinfo, SIZEOF(struct jpeg_compress_struct));
|
|
||||||
cinfo->err = err;
|
|
||||||
cinfo->client_data = client_data;
|
|
||||||
}
|
|
||||||
cinfo->is_decompressor = FALSE;
|
|
||||||
|
|
||||||
/* Initialize a memory manager instance for this object */
|
|
||||||
jinit_memory_mgr((j_common_ptr) cinfo);
|
|
||||||
|
|
||||||
/* Zero out pointers to permanent structures. */
|
|
||||||
cinfo->progress = NULL;
|
|
||||||
cinfo->dest = NULL;
|
|
||||||
|
|
||||||
cinfo->comp_info = NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_QUANT_TBLS; i++) {
|
|
||||||
cinfo->quant_tbl_ptrs[i] = NULL;
|
|
||||||
cinfo->q_scale_factor[i] = 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
|
||||||
cinfo->dc_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->input_gamma = 1.0; /* in case application forgets */
|
|
||||||
|
|
||||||
/* OK, I'm ready */
|
|
||||||
cinfo->global_state = CSTATE_START;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destruction of a JPEG compression object
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_destroy_compress (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
jpeg_destroy((j_common_ptr) cinfo); /* use common routine */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Abort processing of a JPEG compression operation,
|
|
||||||
* but don't destroy the object itself.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_abort_compress (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
jpeg_abort((j_common_ptr) cinfo); /* use common routine */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Forcibly suppress or un-suppress all quantization and Huffman tables.
|
|
||||||
* Marks all currently defined tables as already written (if suppress)
|
|
||||||
* or not written (if !suppress). This will control whether they get emitted
|
|
||||||
* by a subsequent jpeg_start_compress call.
|
|
||||||
*
|
|
||||||
* This routine is exported for use by applications that want to produce
|
|
||||||
* abbreviated JPEG datastreams. It logically belongs in jcparam.c, but
|
|
||||||
* since it is called by jpeg_start_compress, we put it here --- otherwise
|
|
||||||
* jcparam.o would be linked whether the application used it or not.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_suppress_tables (j_compress_ptr cinfo, boolean suppress)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
JQUANT_TBL * qtbl;
|
|
||||||
JHUFF_TBL * htbl;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_QUANT_TBLS; i++) {
|
|
||||||
if ((qtbl = cinfo->quant_tbl_ptrs[i]) != NULL)
|
|
||||||
qtbl->sent_table = suppress;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
|
||||||
if ((htbl = cinfo->dc_huff_tbl_ptrs[i]) != NULL)
|
|
||||||
htbl->sent_table = suppress;
|
|
||||||
if ((htbl = cinfo->ac_huff_tbl_ptrs[i]) != NULL)
|
|
||||||
htbl->sent_table = suppress;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finish JPEG compression.
|
|
||||||
*
|
|
||||||
* If a multipass operating mode was selected, this may do a great deal of
|
|
||||||
* work including most of the actual output.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_finish_compress (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
JDIMENSION iMCU_row;
|
|
||||||
|
|
||||||
if (cinfo->global_state == CSTATE_SCANNING ||
|
|
||||||
cinfo->global_state == CSTATE_RAW_OK) {
|
|
||||||
/* Terminate first pass */
|
|
||||||
if (cinfo->next_scanline < cinfo->image_height)
|
|
||||||
ERREXIT(cinfo, JERR_TOO_LITTLE_DATA);
|
|
||||||
(*cinfo->master->finish_pass) (cinfo);
|
|
||||||
} else if (cinfo->global_state != CSTATE_WRCOEFS)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
/* Perform any remaining passes */
|
|
||||||
while (! cinfo->master->is_last_pass) {
|
|
||||||
(*cinfo->master->prepare_for_pass) (cinfo);
|
|
||||||
for (iMCU_row = 0; iMCU_row < cinfo->total_iMCU_rows; iMCU_row++) {
|
|
||||||
if (cinfo->progress != NULL) {
|
|
||||||
cinfo->progress->pass_counter = (long) iMCU_row;
|
|
||||||
cinfo->progress->pass_limit = (long) cinfo->total_iMCU_rows;
|
|
||||||
(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
|
|
||||||
}
|
|
||||||
/* We bypass the main controller and invoke coef controller directly;
|
|
||||||
* all work is being done from the coefficient buffer.
|
|
||||||
*/
|
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, (JSAMPIMAGE) NULL))
|
|
||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
|
||||||
}
|
|
||||||
(*cinfo->master->finish_pass) (cinfo);
|
|
||||||
}
|
|
||||||
/* Write EOI, do final cleanup */
|
|
||||||
(*cinfo->marker->write_file_trailer) (cinfo);
|
|
||||||
(*cinfo->dest->term_destination) (cinfo);
|
|
||||||
/* We can use jpeg_abort to release memory and reset global_state */
|
|
||||||
jpeg_abort((j_common_ptr) cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write a special marker.
|
|
||||||
* This is only recommended for writing COM or APPn markers.
|
|
||||||
* Must be called after jpeg_start_compress() and before
|
|
||||||
* first call to jpeg_write_scanlines() or jpeg_write_raw_data().
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_write_marker (j_compress_ptr cinfo, int marker,
|
|
||||||
const JOCTET *dataptr, unsigned int datalen)
|
|
||||||
{
|
|
||||||
JMETHOD(void, write_marker_byte, (j_compress_ptr info, int val));
|
|
||||||
|
|
||||||
if (cinfo->next_scanline != 0 ||
|
|
||||||
(cinfo->global_state != CSTATE_SCANNING &&
|
|
||||||
cinfo->global_state != CSTATE_RAW_OK &&
|
|
||||||
cinfo->global_state != CSTATE_WRCOEFS))
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
|
|
||||||
(*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
|
|
||||||
write_marker_byte = cinfo->marker->write_marker_byte; /* copy for speed */
|
|
||||||
while (datalen--) {
|
|
||||||
(*write_marker_byte) (cinfo, *dataptr);
|
|
||||||
dataptr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Same, but piecemeal. */
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_write_m_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
|
|
||||||
{
|
|
||||||
if (cinfo->next_scanline != 0 ||
|
|
||||||
(cinfo->global_state != CSTATE_SCANNING &&
|
|
||||||
cinfo->global_state != CSTATE_RAW_OK &&
|
|
||||||
cinfo->global_state != CSTATE_WRCOEFS))
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
|
|
||||||
(*cinfo->marker->write_marker_header) (cinfo, marker, datalen);
|
|
||||||
}
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_write_m_byte (j_compress_ptr cinfo, int val)
|
|
||||||
{
|
|
||||||
(*cinfo->marker->write_marker_byte) (cinfo, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Alternate compression function: just write an abbreviated table file.
|
|
||||||
* Before calling this, all parameters and a data destination must be set up.
|
|
||||||
*
|
|
||||||
* To produce a pair of files containing abbreviated tables and abbreviated
|
|
||||||
* image data, one would proceed as follows:
|
|
||||||
*
|
|
||||||
* initialize JPEG object
|
|
||||||
* set JPEG parameters
|
|
||||||
* set destination to table file
|
|
||||||
* jpeg_write_tables(cinfo);
|
|
||||||
* set destination to image file
|
|
||||||
* jpeg_start_compress(cinfo, FALSE);
|
|
||||||
* write data...
|
|
||||||
* jpeg_finish_compress(cinfo);
|
|
||||||
*
|
|
||||||
* jpeg_write_tables has the side effect of marking all tables written
|
|
||||||
* (same as jpeg_suppress_tables(..., TRUE)). Thus a subsequent start_compress
|
|
||||||
* will not re-emit the tables unless it is passed write_all_tables=TRUE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_write_tables (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
if (cinfo->global_state != CSTATE_START)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
|
|
||||||
/* (Re)initialize error mgr and destination modules */
|
|
||||||
(*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
|
|
||||||
(*cinfo->dest->init_destination) (cinfo);
|
|
||||||
/* Initialize the marker writer ... bit of a crock to do it here. */
|
|
||||||
jinit_marker_writer(cinfo);
|
|
||||||
/* Write them tables! */
|
|
||||||
(*cinfo->marker->write_tables_only) (cinfo);
|
|
||||||
/* And clean up. */
|
|
||||||
(*cinfo->dest->term_destination) (cinfo);
|
|
||||||
/*
|
|
||||||
* In library releases up through v6a, we called jpeg_abort() here to free
|
|
||||||
* any working memory allocated by the destination manager and marker
|
|
||||||
* writer. Some applications had a problem with that: they allocated space
|
|
||||||
* of their own from the library memory manager, and didn't want it to go
|
|
||||||
* away during write_tables. So now we do nothing. This will cause a
|
|
||||||
* memory leak if an app calls write_tables repeatedly without doing a full
|
|
||||||
* compression cycle or otherwise resetting the JPEG object. However, that
|
|
||||||
* seems less bad than unexpectedly freeing memory in the normal case.
|
|
||||||
* An app that prefers the old behavior can call jpeg_abort for itself after
|
|
||||||
* each call to jpeg_write_tables().
|
|
||||||
*/
|
|
||||||
}
|
|
@ -1,162 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcapistd.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
|
||||||
* Modified 2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains application interface code for the compression half
|
|
||||||
* of the JPEG library. These are the "standard" API routines that are
|
|
||||||
* used in the normal full-compression case. They are not used by a
|
|
||||||
* transcoding-only application. Note that if an application links in
|
|
||||||
* jpeg_start_compress, it will end up linking in the entire compressor.
|
|
||||||
* We thus must separate this file from jcapimin.c to avoid linking the
|
|
||||||
* whole compression library into a transcoder.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compression initialization.
|
|
||||||
* Before calling this, all parameters and a data destination must be set up.
|
|
||||||
*
|
|
||||||
* We require a write_all_tables parameter as a failsafe check when writing
|
|
||||||
* multiple datastreams from the same compression object. Since prior runs
|
|
||||||
* will have left all the tables marked sent_table=TRUE, a subsequent run
|
|
||||||
* would emit an abbreviated stream (no tables) by default. This may be what
|
|
||||||
* is wanted, but for safety's sake it should not be the default behavior:
|
|
||||||
* programmers should have to make a deliberate choice to emit abbreviated
|
|
||||||
* images. Therefore the documentation and examples should encourage people
|
|
||||||
* to pass write_all_tables=TRUE; then it will take active thought to do the
|
|
||||||
* wrong thing.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_start_compress (j_compress_ptr cinfo, boolean write_all_tables)
|
|
||||||
{
|
|
||||||
if (cinfo->global_state != CSTATE_START)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
|
|
||||||
if (write_all_tables)
|
|
||||||
jpeg_suppress_tables(cinfo, FALSE); /* mark all tables to be written */
|
|
||||||
|
|
||||||
/* (Re)initialize error mgr and destination modules */
|
|
||||||
(*cinfo->err->reset_error_mgr) ((j_common_ptr) cinfo);
|
|
||||||
(*cinfo->dest->init_destination) (cinfo);
|
|
||||||
/* Perform master selection of active modules */
|
|
||||||
jinit_compress_master(cinfo);
|
|
||||||
/* Set up for the first pass */
|
|
||||||
(*cinfo->master->prepare_for_pass) (cinfo);
|
|
||||||
/* Ready for application to drive first pass through jpeg_write_scanlines
|
|
||||||
* or jpeg_write_raw_data.
|
|
||||||
*/
|
|
||||||
cinfo->next_scanline = 0;
|
|
||||||
cinfo->global_state = (cinfo->raw_data_in ? CSTATE_RAW_OK : CSTATE_SCANNING);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write some scanlines of data to the JPEG compressor.
|
|
||||||
*
|
|
||||||
* The return value will be the number of lines actually written.
|
|
||||||
* This should be less than the supplied num_lines only in case that
|
|
||||||
* the data destination module has requested suspension of the compressor,
|
|
||||||
* or if more than image_height scanlines are passed in.
|
|
||||||
*
|
|
||||||
* Note: we warn about excess calls to jpeg_write_scanlines() since
|
|
||||||
* this likely signals an application programmer error. However,
|
|
||||||
* excess scanlines passed in the last valid call are *silently* ignored,
|
|
||||||
* so that the application need not adjust num_lines for end-of-image
|
|
||||||
* when using a multiple-scanline buffer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(JDIMENSION)
|
|
||||||
jpeg_write_scanlines (j_compress_ptr cinfo, JSAMPARRAY scanlines,
|
|
||||||
JDIMENSION num_lines)
|
|
||||||
{
|
|
||||||
JDIMENSION row_ctr, rows_left;
|
|
||||||
|
|
||||||
if (cinfo->global_state != CSTATE_SCANNING)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
if (cinfo->next_scanline >= cinfo->image_height)
|
|
||||||
WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
|
|
||||||
|
|
||||||
/* Call progress monitor hook if present */
|
|
||||||
if (cinfo->progress != NULL) {
|
|
||||||
cinfo->progress->pass_counter = (long) cinfo->next_scanline;
|
|
||||||
cinfo->progress->pass_limit = (long) cinfo->image_height;
|
|
||||||
(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Give master control module another chance if this is first call to
|
|
||||||
* jpeg_write_scanlines. This lets output of the frame/scan headers be
|
|
||||||
* delayed so that application can write COM, etc, markers between
|
|
||||||
* jpeg_start_compress and jpeg_write_scanlines.
|
|
||||||
*/
|
|
||||||
if (cinfo->master->call_pass_startup)
|
|
||||||
(*cinfo->master->pass_startup) (cinfo);
|
|
||||||
|
|
||||||
/* Ignore any extra scanlines at bottom of image. */
|
|
||||||
rows_left = cinfo->image_height - cinfo->next_scanline;
|
|
||||||
if (num_lines > rows_left)
|
|
||||||
num_lines = rows_left;
|
|
||||||
|
|
||||||
row_ctr = 0;
|
|
||||||
(*cinfo->main->process_data) (cinfo, scanlines, &row_ctr, num_lines);
|
|
||||||
cinfo->next_scanline += row_ctr;
|
|
||||||
return row_ctr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Alternate entry point to write raw data.
|
|
||||||
* Processes exactly one iMCU row per call, unless suspended.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(JDIMENSION)
|
|
||||||
jpeg_write_raw_data (j_compress_ptr cinfo, JSAMPIMAGE data,
|
|
||||||
JDIMENSION num_lines)
|
|
||||||
{
|
|
||||||
JDIMENSION lines_per_iMCU_row;
|
|
||||||
|
|
||||||
if (cinfo->global_state != CSTATE_RAW_OK)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_STATE, cinfo->global_state);
|
|
||||||
if (cinfo->next_scanline >= cinfo->image_height) {
|
|
||||||
WARNMS(cinfo, JWRN_TOO_MUCH_DATA);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Call progress monitor hook if present */
|
|
||||||
if (cinfo->progress != NULL) {
|
|
||||||
cinfo->progress->pass_counter = (long) cinfo->next_scanline;
|
|
||||||
cinfo->progress->pass_limit = (long) cinfo->image_height;
|
|
||||||
(*cinfo->progress->progress_monitor) ((j_common_ptr) cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Give master control module another chance if this is first call to
|
|
||||||
* jpeg_write_raw_data. This lets output of the frame/scan headers be
|
|
||||||
* delayed so that application can write COM, etc, markers between
|
|
||||||
* jpeg_start_compress and jpeg_write_raw_data.
|
|
||||||
*/
|
|
||||||
if (cinfo->master->call_pass_startup)
|
|
||||||
(*cinfo->master->pass_startup) (cinfo);
|
|
||||||
|
|
||||||
/* Verify that at least one iMCU row has been passed. */
|
|
||||||
lines_per_iMCU_row = cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size;
|
|
||||||
if (num_lines < lines_per_iMCU_row)
|
|
||||||
ERREXIT(cinfo, JERR_BUFFER_SIZE);
|
|
||||||
|
|
||||||
/* Directly compress the row. */
|
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, data)) {
|
|
||||||
/* If compressor did not consume the whole row, suspend processing. */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* OK, we processed one iMCU row. */
|
|
||||||
cinfo->next_scanline += lines_per_iMCU_row;
|
|
||||||
return lines_per_iMCU_row;
|
|
||||||
}
|
|
@ -1,944 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcarith.c
|
|
||||||
*
|
|
||||||
* Developed 1997-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains portable arithmetic entropy encoding routines for JPEG
|
|
||||||
* (implementing the ISO/IEC IS 10918-1 and CCITT Recommendation ITU-T T.81).
|
|
||||||
*
|
|
||||||
* Both sequential and progressive modes are supported in this single module.
|
|
||||||
*
|
|
||||||
* Suspension is not currently supported in this module.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Expanded entropy encoder object for arithmetic encoding. */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_entropy_encoder pub; /* public fields */
|
|
||||||
|
|
||||||
INT32 c; /* C register, base of coding interval, layout as in sec. D.1.3 */
|
|
||||||
INT32 a; /* A register, normalized size of coding interval */
|
|
||||||
INT32 sc; /* counter for stacked 0xFF values which might overflow */
|
|
||||||
INT32 zc; /* counter for pending 0x00 output values which might *
|
|
||||||
* be discarded at the end ("Pacman" termination) */
|
|
||||||
int ct; /* bit shift counter, determines when next byte will be written */
|
|
||||||
int buffer; /* buffer for most recent output byte != 0xFF */
|
|
||||||
|
|
||||||
int last_dc_val[MAX_COMPS_IN_SCAN]; /* last DC coef for each component */
|
|
||||||
int dc_context[MAX_COMPS_IN_SCAN]; /* context index for DC conditioning */
|
|
||||||
|
|
||||||
unsigned int restarts_to_go; /* MCUs left in this restart interval */
|
|
||||||
int next_restart_num; /* next restart number to write (0-7) */
|
|
||||||
|
|
||||||
/* Pointers to statistics areas (these workspaces have image lifespan) */
|
|
||||||
unsigned char * dc_stats[NUM_ARITH_TBLS];
|
|
||||||
unsigned char * ac_stats[NUM_ARITH_TBLS];
|
|
||||||
|
|
||||||
/* Statistics bin for coding with fixed probability 0.5 */
|
|
||||||
unsigned char fixed_bin[4];
|
|
||||||
} arith_entropy_encoder;
|
|
||||||
|
|
||||||
typedef arith_entropy_encoder * arith_entropy_ptr;
|
|
||||||
|
|
||||||
/* The following two definitions specify the allocation chunk size
|
|
||||||
* for the statistics area.
|
|
||||||
* According to sections F.1.4.4.1.3 and F.1.4.4.2, we need at least
|
|
||||||
* 49 statistics bins for DC, and 245 statistics bins for AC coding.
|
|
||||||
*
|
|
||||||
* We use a compact representation with 1 byte per statistics bin,
|
|
||||||
* thus the numbers directly represent byte sizes.
|
|
||||||
* This 1 byte per statistics bin contains the meaning of the MPS
|
|
||||||
* (more probable symbol) in the highest bit (mask 0x80), and the
|
|
||||||
* index into the probability estimation state machine table
|
|
||||||
* in the lower bits (mask 0x7F).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define DC_STAT_BINS 64
|
|
||||||
#define AC_STAT_BINS 256
|
|
||||||
|
|
||||||
/* NOTE: Uncomment the following #define if you want to use the
|
|
||||||
* given formula for calculating the AC conditioning parameter Kx
|
|
||||||
* for spectral selection progressive coding in section G.1.3.2
|
|
||||||
* of the spec (Kx = Kmin + SRL (8 + Se - Kmin) 4).
|
|
||||||
* Although the spec and P&M authors claim that this "has proven
|
|
||||||
* to give good results for 8 bit precision samples", I'm not
|
|
||||||
* convinced yet that this is really beneficial.
|
|
||||||
* Early tests gave only very marginal compression enhancements
|
|
||||||
* (a few - around 5 or so - bytes even for very large files),
|
|
||||||
* which would turn out rather negative if we'd suppress the
|
|
||||||
* DAC (Define Arithmetic Conditioning) marker segments for
|
|
||||||
* the default parameters in the future.
|
|
||||||
* Note that currently the marker writing module emits 12-byte
|
|
||||||
* DAC segments for a full-component scan in a color image.
|
|
||||||
* This is not worth worrying about IMHO. However, since the
|
|
||||||
* spec defines the default values to be used if the tables
|
|
||||||
* are omitted (unlike Huffman tables, which are required
|
|
||||||
* anyway), one might optimize this behaviour in the future,
|
|
||||||
* and then it would be disadvantageous to use custom tables if
|
|
||||||
* they don't provide sufficient gain to exceed the DAC size.
|
|
||||||
*
|
|
||||||
* On the other hand, I'd consider it as a reasonable result
|
|
||||||
* that the conditioning has no significant influence on the
|
|
||||||
* compression performance. This means that the basic
|
|
||||||
* statistical model is already rather stable.
|
|
||||||
*
|
|
||||||
* Thus, at the moment, we use the default conditioning values
|
|
||||||
* anyway, and do not use the custom formula.
|
|
||||||
*
|
|
||||||
#define CALCULATE_SPECTRAL_CONDITIONING
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* IRIGHT_SHIFT is like RIGHT_SHIFT, but works on int rather than INT32.
|
|
||||||
* We assume that int right shift is unsigned if INT32 right shift is,
|
|
||||||
* which should be safe.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
#define ISHIFT_TEMPS int ishift_temp;
|
|
||||||
#define IRIGHT_SHIFT(x,shft) \
|
|
||||||
((ishift_temp = (x)) < 0 ? \
|
|
||||||
(ishift_temp >> (shft)) | ((~0) << (16-(shft))) : \
|
|
||||||
(ishift_temp >> (shft)))
|
|
||||||
#else
|
|
||||||
#define ISHIFT_TEMPS
|
|
||||||
#define IRIGHT_SHIFT(x,shft) ((x) >> (shft))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_byte (int val, j_compress_ptr cinfo)
|
|
||||||
/* Write next output byte; we do not support suspension in this module. */
|
|
||||||
{
|
|
||||||
struct jpeg_destination_mgr * dest = cinfo->dest;
|
|
||||||
|
|
||||||
*dest->next_output_byte++ = (JOCTET) val;
|
|
||||||
if (--dest->free_in_buffer == 0)
|
|
||||||
if (! (*dest->empty_output_buffer) (cinfo))
|
|
||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finish up at the end of an arithmetic-compressed scan.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
finish_pass (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
INT32 temp;
|
|
||||||
|
|
||||||
/* Section D.1.8: Termination of encoding */
|
|
||||||
|
|
||||||
/* Find the e->c in the coding interval with the largest
|
|
||||||
* number of trailing zero bits */
|
|
||||||
if ((temp = (e->a - 1 + e->c) & 0xFFFF0000L) < e->c)
|
|
||||||
e->c = temp + 0x8000L;
|
|
||||||
else
|
|
||||||
e->c = temp;
|
|
||||||
/* Send remaining bytes to output */
|
|
||||||
e->c <<= e->ct;
|
|
||||||
if (e->c & 0xF8000000L) {
|
|
||||||
/* One final overflow has to be handled */
|
|
||||||
if (e->buffer >= 0) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
emit_byte(e->buffer + 1, cinfo);
|
|
||||||
if (e->buffer + 1 == 0xFF)
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
}
|
|
||||||
e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
|
|
||||||
e->sc = 0;
|
|
||||||
} else {
|
|
||||||
if (e->buffer == 0)
|
|
||||||
++e->zc;
|
|
||||||
else if (e->buffer >= 0) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
emit_byte(e->buffer, cinfo);
|
|
||||||
}
|
|
||||||
if (e->sc) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
do {
|
|
||||||
emit_byte(0xFF, cinfo);
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
} while (--e->sc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Output final bytes only if they are not 0x00 */
|
|
||||||
if (e->c & 0x7FFF800L) {
|
|
||||||
if (e->zc) /* output final pending zero bytes */
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
emit_byte((e->c >> 19) & 0xFF, cinfo);
|
|
||||||
if (((e->c >> 19) & 0xFF) == 0xFF)
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
if (e->c & 0x7F800L) {
|
|
||||||
emit_byte((e->c >> 11) & 0xFF, cinfo);
|
|
||||||
if (((e->c >> 11) & 0xFF) == 0xFF)
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The core arithmetic encoding routine (common in JPEG and JBIG).
|
|
||||||
* This needs to go as fast as possible.
|
|
||||||
* Machine-dependent optimization facilities
|
|
||||||
* are not utilized in this portable implementation.
|
|
||||||
* However, this code should be fairly efficient and
|
|
||||||
* may be a good base for further optimizations anyway.
|
|
||||||
*
|
|
||||||
* Parameter 'val' to be encoded may be 0 or 1 (binary decision).
|
|
||||||
*
|
|
||||||
* Note: I've added full "Pacman" termination support to the
|
|
||||||
* byte output routines, which is equivalent to the optional
|
|
||||||
* Discard_final_zeros procedure (Figure D.15) in the spec.
|
|
||||||
* Thus, we always produce the shortest possible output
|
|
||||||
* stream compliant to the spec (no trailing zero bytes,
|
|
||||||
* except for FF stuffing).
|
|
||||||
*
|
|
||||||
* I've also introduced a new scheme for accessing
|
|
||||||
* the probability estimation state machine table,
|
|
||||||
* derived from Markus Kuhn's JBIG implementation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
arith_encode (j_compress_ptr cinfo, unsigned char *st, int val)
|
|
||||||
{
|
|
||||||
register arith_entropy_ptr e = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
register unsigned char nl, nm;
|
|
||||||
register INT32 qe, temp;
|
|
||||||
register int sv;
|
|
||||||
|
|
||||||
/* Fetch values from our compact representation of Table D.3(D.2):
|
|
||||||
* Qe values and probability estimation state machine
|
|
||||||
*/
|
|
||||||
sv = *st;
|
|
||||||
qe = jpeg_aritab[sv & 0x7F]; /* => Qe_Value */
|
|
||||||
nl = qe & 0xFF; qe >>= 8; /* Next_Index_LPS + Switch_MPS */
|
|
||||||
nm = qe & 0xFF; qe >>= 8; /* Next_Index_MPS */
|
|
||||||
|
|
||||||
/* Encode & estimation procedures per sections D.1.4 & D.1.5 */
|
|
||||||
e->a -= qe;
|
|
||||||
if (val != (sv >> 7)) {
|
|
||||||
/* Encode the less probable symbol */
|
|
||||||
if (e->a >= qe) {
|
|
||||||
/* If the interval size (qe) for the less probable symbol (LPS)
|
|
||||||
* is larger than the interval size for the MPS, then exchange
|
|
||||||
* the two symbols for coding efficiency, otherwise code the LPS
|
|
||||||
* as usual: */
|
|
||||||
e->c += e->a;
|
|
||||||
e->a = qe;
|
|
||||||
}
|
|
||||||
*st = (sv & 0x80) ^ nl; /* Estimate_after_LPS */
|
|
||||||
} else {
|
|
||||||
/* Encode the more probable symbol */
|
|
||||||
if (e->a >= 0x8000L)
|
|
||||||
return; /* A >= 0x8000 -> ready, no renormalization required */
|
|
||||||
if (e->a < qe) {
|
|
||||||
/* If the interval size (qe) for the less probable symbol (LPS)
|
|
||||||
* is larger than the interval size for the MPS, then exchange
|
|
||||||
* the two symbols for coding efficiency: */
|
|
||||||
e->c += e->a;
|
|
||||||
e->a = qe;
|
|
||||||
}
|
|
||||||
*st = (sv & 0x80) ^ nm; /* Estimate_after_MPS */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Renormalization & data output per section D.1.6 */
|
|
||||||
do {
|
|
||||||
e->a <<= 1;
|
|
||||||
e->c <<= 1;
|
|
||||||
if (--e->ct == 0) {
|
|
||||||
/* Another byte is ready for output */
|
|
||||||
temp = e->c >> 19;
|
|
||||||
if (temp > 0xFF) {
|
|
||||||
/* Handle overflow over all stacked 0xFF bytes */
|
|
||||||
if (e->buffer >= 0) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
emit_byte(e->buffer + 1, cinfo);
|
|
||||||
if (e->buffer + 1 == 0xFF)
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
}
|
|
||||||
e->zc += e->sc; /* carry-over converts stacked 0xFF bytes to 0x00 */
|
|
||||||
e->sc = 0;
|
|
||||||
/* Note: The 3 spacer bits in the C register guarantee
|
|
||||||
* that the new buffer byte can't be 0xFF here
|
|
||||||
* (see page 160 in the P&M JPEG book). */
|
|
||||||
e->buffer = temp & 0xFF; /* new output byte, might overflow later */
|
|
||||||
} else if (temp == 0xFF) {
|
|
||||||
++e->sc; /* stack 0xFF byte (which might overflow later) */
|
|
||||||
} else {
|
|
||||||
/* Output all stacked 0xFF bytes, they will not overflow any more */
|
|
||||||
if (e->buffer == 0)
|
|
||||||
++e->zc;
|
|
||||||
else if (e->buffer >= 0) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
emit_byte(e->buffer, cinfo);
|
|
||||||
}
|
|
||||||
if (e->sc) {
|
|
||||||
if (e->zc)
|
|
||||||
do emit_byte(0x00, cinfo);
|
|
||||||
while (--e->zc);
|
|
||||||
do {
|
|
||||||
emit_byte(0xFF, cinfo);
|
|
||||||
emit_byte(0x00, cinfo);
|
|
||||||
} while (--e->sc);
|
|
||||||
}
|
|
||||||
e->buffer = temp & 0xFF; /* new output byte (can still overflow) */
|
|
||||||
}
|
|
||||||
e->c &= 0x7FFFFL;
|
|
||||||
e->ct += 8;
|
|
||||||
}
|
|
||||||
} while (e->a < 0x8000L);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Emit a restart marker & resynchronize predictions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_restart (j_compress_ptr cinfo, int restart_num)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info * compptr;
|
|
||||||
|
|
||||||
finish_pass(cinfo);
|
|
||||||
|
|
||||||
emit_byte(0xFF, cinfo);
|
|
||||||
emit_byte(JPEG_RST0 + restart_num, cinfo);
|
|
||||||
|
|
||||||
/* Re-initialize statistics areas */
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
/* DC needs no table for refinement scan */
|
|
||||||
if (cinfo->Ss == 0 && cinfo->Ah == 0) {
|
|
||||||
MEMZERO(entropy->dc_stats[compptr->dc_tbl_no], DC_STAT_BINS);
|
|
||||||
/* Reset DC predictions to 0 */
|
|
||||||
entropy->last_dc_val[ci] = 0;
|
|
||||||
entropy->dc_context[ci] = 0;
|
|
||||||
}
|
|
||||||
/* AC needs no table when not present */
|
|
||||||
if (cinfo->Se) {
|
|
||||||
MEMZERO(entropy->ac_stats[compptr->ac_tbl_no], AC_STAT_BINS);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reset arithmetic encoding variables */
|
|
||||||
entropy->c = 0;
|
|
||||||
entropy->a = 0x10000L;
|
|
||||||
entropy->sc = 0;
|
|
||||||
entropy->zc = 0;
|
|
||||||
entropy->ct = 11;
|
|
||||||
entropy->buffer = -1; /* empty */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCU encoding for DC initial scan (either spectral selection,
|
|
||||||
* or first pass of successive approximation).
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
encode_mcu_DC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
unsigned char *st;
|
|
||||||
int blkn, ci, tbl;
|
|
||||||
int v, v2, m;
|
|
||||||
ISHIFT_TEMPS
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
|
||||||
if (cinfo->restart_interval) {
|
|
||||||
if (entropy->restarts_to_go == 0) {
|
|
||||||
emit_restart(cinfo, entropy->next_restart_num);
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num++;
|
|
||||||
entropy->next_restart_num &= 7;
|
|
||||||
}
|
|
||||||
entropy->restarts_to_go--;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
|
||||||
ci = cinfo->MCU_membership[blkn];
|
|
||||||
tbl = cinfo->cur_comp_info[ci]->dc_tbl_no;
|
|
||||||
|
|
||||||
/* Compute the DC value after the required point transform by Al.
|
|
||||||
* This is simply an arithmetic right shift.
|
|
||||||
*/
|
|
||||||
m = IRIGHT_SHIFT((int) (MCU_data[blkn][0][0]), cinfo->Al);
|
|
||||||
|
|
||||||
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
|
||||||
|
|
||||||
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
|
||||||
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
|
||||||
|
|
||||||
/* Figure F.4: Encode_DC_DIFF */
|
|
||||||
if ((v = m - entropy->last_dc_val[ci]) == 0) {
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
entropy->dc_context[ci] = 0; /* zero diff category */
|
|
||||||
} else {
|
|
||||||
entropy->last_dc_val[ci] = m;
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
/* Figure F.6: Encoding nonzero value v */
|
|
||||||
/* Figure F.7: Encoding the sign of v */
|
|
||||||
if (v > 0) {
|
|
||||||
arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
|
|
||||||
st += 2; /* Table F.4: SP = S0 + 2 */
|
|
||||||
entropy->dc_context[ci] = 4; /* small positive diff category */
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
|
|
||||||
st += 3; /* Table F.4: SN = S0 + 3 */
|
|
||||||
entropy->dc_context[ci] = 8; /* small negative diff category */
|
|
||||||
}
|
|
||||||
/* Figure F.8: Encoding the magnitude category of v */
|
|
||||||
m = 0;
|
|
||||||
if (v -= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m = 1;
|
|
||||||
v2 = v;
|
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
|
||||||
while (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
|
||||||
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
|
||||||
entropy->dc_context[ci] = 0; /* zero diff category */
|
|
||||||
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
|
||||||
entropy->dc_context[ci] += 8; /* large diff category */
|
|
||||||
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
|
||||||
st += 14;
|
|
||||||
while (m >>= 1)
|
|
||||||
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCU encoding for AC initial scan (either spectral selection,
|
|
||||||
* or first pass of successive approximation).
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
encode_mcu_AC_first (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
const int * natural_order;
|
|
||||||
JBLOCKROW block;
|
|
||||||
unsigned char *st;
|
|
||||||
int tbl, k, ke;
|
|
||||||
int v, v2, m;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
|
||||||
if (cinfo->restart_interval) {
|
|
||||||
if (entropy->restarts_to_go == 0) {
|
|
||||||
emit_restart(cinfo, entropy->next_restart_num);
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num++;
|
|
||||||
entropy->next_restart_num &= 7;
|
|
||||||
}
|
|
||||||
entropy->restarts_to_go--;
|
|
||||||
}
|
|
||||||
|
|
||||||
natural_order = cinfo->natural_order;
|
|
||||||
|
|
||||||
/* Encode the MCU data block */
|
|
||||||
block = MCU_data[0];
|
|
||||||
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
|
||||||
|
|
||||||
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
|
||||||
|
|
||||||
/* Establish EOB (end-of-block) index */
|
|
||||||
ke = cinfo->Se;
|
|
||||||
do {
|
|
||||||
/* We must apply the point transform by Al. For AC coefficients this
|
|
||||||
* is an integer division with rounding towards 0. To do this portably
|
|
||||||
* in C, we shift after obtaining the absolute value.
|
|
||||||
*/
|
|
||||||
if ((v = (*block)[natural_order[ke]]) >= 0) {
|
|
||||||
if (v >>= cinfo->Al) break;
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
if (v >>= cinfo->Al) break;
|
|
||||||
}
|
|
||||||
} while (--ke);
|
|
||||||
|
|
||||||
/* Figure F.5: Encode_AC_Coefficients */
|
|
||||||
for (k = cinfo->Ss - 1; k < ke;) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
arith_encode(cinfo, st, 0); /* EOB decision */
|
|
||||||
for (;;) {
|
|
||||||
if ((v = (*block)[natural_order[++k]]) >= 0) {
|
|
||||||
if (v >>= cinfo->Al) {
|
|
||||||
arith_encode(cinfo, st + 1, 1);
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
if (v >>= cinfo->Al) {
|
|
||||||
arith_encode(cinfo, st + 1, 1);
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st + 1, 0);
|
|
||||||
st += 3;
|
|
||||||
}
|
|
||||||
st += 2;
|
|
||||||
/* Figure F.8: Encoding the magnitude category of v */
|
|
||||||
m = 0;
|
|
||||||
if (v -= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m = 1;
|
|
||||||
v2 = v;
|
|
||||||
if (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st = entropy->ac_stats[tbl] +
|
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
|
||||||
while (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
|
||||||
st += 14;
|
|
||||||
while (m >>= 1)
|
|
||||||
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
|
||||||
}
|
|
||||||
/* Encode EOB decision only if k < cinfo->Se */
|
|
||||||
if (k < cinfo->Se) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCU encoding for DC successive approximation refinement scan.
|
|
||||||
* Note: we assume such scans can be multi-component,
|
|
||||||
* although the spec is not very clear on the point.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
encode_mcu_DC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
unsigned char *st;
|
|
||||||
int Al, blkn;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
|
||||||
if (cinfo->restart_interval) {
|
|
||||||
if (entropy->restarts_to_go == 0) {
|
|
||||||
emit_restart(cinfo, entropy->next_restart_num);
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num++;
|
|
||||||
entropy->next_restart_num &= 7;
|
|
||||||
}
|
|
||||||
entropy->restarts_to_go--;
|
|
||||||
}
|
|
||||||
|
|
||||||
st = entropy->fixed_bin; /* use fixed probability estimation */
|
|
||||||
Al = cinfo->Al;
|
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
|
||||||
/* We simply emit the Al'th bit of the DC coefficient value. */
|
|
||||||
arith_encode(cinfo, st, (MCU_data[blkn][0][0] >> Al) & 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* MCU encoding for AC successive approximation refinement scan.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
encode_mcu_AC_refine (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
const int * natural_order;
|
|
||||||
JBLOCKROW block;
|
|
||||||
unsigned char *st;
|
|
||||||
int tbl, k, ke, kex;
|
|
||||||
int v;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
|
||||||
if (cinfo->restart_interval) {
|
|
||||||
if (entropy->restarts_to_go == 0) {
|
|
||||||
emit_restart(cinfo, entropy->next_restart_num);
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num++;
|
|
||||||
entropy->next_restart_num &= 7;
|
|
||||||
}
|
|
||||||
entropy->restarts_to_go--;
|
|
||||||
}
|
|
||||||
|
|
||||||
natural_order = cinfo->natural_order;
|
|
||||||
|
|
||||||
/* Encode the MCU data block */
|
|
||||||
block = MCU_data[0];
|
|
||||||
tbl = cinfo->cur_comp_info[0]->ac_tbl_no;
|
|
||||||
|
|
||||||
/* Section G.1.3.3: Encoding of AC coefficients */
|
|
||||||
|
|
||||||
/* Establish EOB (end-of-block) index */
|
|
||||||
ke = cinfo->Se;
|
|
||||||
do {
|
|
||||||
/* We must apply the point transform by Al. For AC coefficients this
|
|
||||||
* is an integer division with rounding towards 0. To do this portably
|
|
||||||
* in C, we shift after obtaining the absolute value.
|
|
||||||
*/
|
|
||||||
if ((v = (*block)[natural_order[ke]]) >= 0) {
|
|
||||||
if (v >>= cinfo->Al) break;
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
if (v >>= cinfo->Al) break;
|
|
||||||
}
|
|
||||||
} while (--ke);
|
|
||||||
|
|
||||||
/* Establish EOBx (previous stage end-of-block) index */
|
|
||||||
for (kex = ke; kex > 0; kex--)
|
|
||||||
if ((v = (*block)[natural_order[kex]]) >= 0) {
|
|
||||||
if (v >>= cinfo->Ah) break;
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
if (v >>= cinfo->Ah) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Figure G.10: Encode_AC_Coefficients_SA */
|
|
||||||
for (k = cinfo->Ss - 1; k < ke;) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
if (k >= kex)
|
|
||||||
arith_encode(cinfo, st, 0); /* EOB decision */
|
|
||||||
for (;;) {
|
|
||||||
if ((v = (*block)[natural_order[++k]]) >= 0) {
|
|
||||||
if (v >>= cinfo->Al) {
|
|
||||||
if (v >> 1) /* previously nonzero coef */
|
|
||||||
arith_encode(cinfo, st + 2, (v & 1));
|
|
||||||
else { /* newly nonzero coef */
|
|
||||||
arith_encode(cinfo, st + 1, 1);
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
if (v >>= cinfo->Al) {
|
|
||||||
if (v >> 1) /* previously nonzero coef */
|
|
||||||
arith_encode(cinfo, st + 2, (v & 1));
|
|
||||||
else { /* newly nonzero coef */
|
|
||||||
arith_encode(cinfo, st + 1, 1);
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st + 1, 0);
|
|
||||||
st += 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Encode EOB decision only if k < cinfo->Se */
|
|
||||||
if (k < cinfo->Se) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Encode and output one MCU's worth of arithmetic-compressed coefficients.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
encode_mcu (j_compress_ptr cinfo, JBLOCKROW *MCU_data)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
const int * natural_order;
|
|
||||||
JBLOCKROW block;
|
|
||||||
unsigned char *st;
|
|
||||||
int tbl, k, ke;
|
|
||||||
int v, v2, m;
|
|
||||||
int blkn, ci;
|
|
||||||
jpeg_component_info * compptr;
|
|
||||||
|
|
||||||
/* Emit restart marker if needed */
|
|
||||||
if (cinfo->restart_interval) {
|
|
||||||
if (entropy->restarts_to_go == 0) {
|
|
||||||
emit_restart(cinfo, entropy->next_restart_num);
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num++;
|
|
||||||
entropy->next_restart_num &= 7;
|
|
||||||
}
|
|
||||||
entropy->restarts_to_go--;
|
|
||||||
}
|
|
||||||
|
|
||||||
natural_order = cinfo->natural_order;
|
|
||||||
|
|
||||||
/* Encode the MCU data blocks */
|
|
||||||
for (blkn = 0; blkn < cinfo->blocks_in_MCU; blkn++) {
|
|
||||||
block = MCU_data[blkn];
|
|
||||||
ci = cinfo->MCU_membership[blkn];
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
|
|
||||||
/* Sections F.1.4.1 & F.1.4.4.1: Encoding of DC coefficients */
|
|
||||||
|
|
||||||
tbl = compptr->dc_tbl_no;
|
|
||||||
|
|
||||||
/* Table F.4: Point to statistics bin S0 for DC coefficient coding */
|
|
||||||
st = entropy->dc_stats[tbl] + entropy->dc_context[ci];
|
|
||||||
|
|
||||||
/* Figure F.4: Encode_DC_DIFF */
|
|
||||||
if ((v = (*block)[0] - entropy->last_dc_val[ci]) == 0) {
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
entropy->dc_context[ci] = 0; /* zero diff category */
|
|
||||||
} else {
|
|
||||||
entropy->last_dc_val[ci] = (*block)[0];
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
/* Figure F.6: Encoding nonzero value v */
|
|
||||||
/* Figure F.7: Encoding the sign of v */
|
|
||||||
if (v > 0) {
|
|
||||||
arith_encode(cinfo, st + 1, 0); /* Table F.4: SS = S0 + 1 */
|
|
||||||
st += 2; /* Table F.4: SP = S0 + 2 */
|
|
||||||
entropy->dc_context[ci] = 4; /* small positive diff category */
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
arith_encode(cinfo, st + 1, 1); /* Table F.4: SS = S0 + 1 */
|
|
||||||
st += 3; /* Table F.4: SN = S0 + 3 */
|
|
||||||
entropy->dc_context[ci] = 8; /* small negative diff category */
|
|
||||||
}
|
|
||||||
/* Figure F.8: Encoding the magnitude category of v */
|
|
||||||
m = 0;
|
|
||||||
if (v -= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m = 1;
|
|
||||||
v2 = v;
|
|
||||||
st = entropy->dc_stats[tbl] + 20; /* Table F.4: X1 = 20 */
|
|
||||||
while (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
/* Section F.1.4.4.1.2: Establish dc_context conditioning category */
|
|
||||||
if (m < (int) ((1L << cinfo->arith_dc_L[tbl]) >> 1))
|
|
||||||
entropy->dc_context[ci] = 0; /* zero diff category */
|
|
||||||
else if (m > (int) ((1L << cinfo->arith_dc_U[tbl]) >> 1))
|
|
||||||
entropy->dc_context[ci] += 8; /* large diff category */
|
|
||||||
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
|
||||||
st += 14;
|
|
||||||
while (m >>= 1)
|
|
||||||
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Sections F.1.4.2 & F.1.4.4.2: Encoding of AC coefficients */
|
|
||||||
|
|
||||||
if ((ke = cinfo->lim_Se) == 0) continue;
|
|
||||||
tbl = compptr->ac_tbl_no;
|
|
||||||
|
|
||||||
/* Establish EOB (end-of-block) index */
|
|
||||||
do {
|
|
||||||
if ((*block)[natural_order[ke]]) break;
|
|
||||||
} while (--ke);
|
|
||||||
|
|
||||||
/* Figure F.5: Encode_AC_Coefficients */
|
|
||||||
for (k = 0; k < ke;) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
arith_encode(cinfo, st, 0); /* EOB decision */
|
|
||||||
while ((v = (*block)[natural_order[++k]]) == 0) {
|
|
||||||
arith_encode(cinfo, st + 1, 0);
|
|
||||||
st += 3;
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st + 1, 1);
|
|
||||||
/* Figure F.6: Encoding nonzero value v */
|
|
||||||
/* Figure F.7: Encoding the sign of v */
|
|
||||||
if (v > 0) {
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 0);
|
|
||||||
} else {
|
|
||||||
v = -v;
|
|
||||||
arith_encode(cinfo, entropy->fixed_bin, 1);
|
|
||||||
}
|
|
||||||
st += 2;
|
|
||||||
/* Figure F.8: Encoding the magnitude category of v */
|
|
||||||
m = 0;
|
|
||||||
if (v -= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m = 1;
|
|
||||||
v2 = v;
|
|
||||||
if (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st = entropy->ac_stats[tbl] +
|
|
||||||
(k <= cinfo->arith_ac_K[tbl] ? 189 : 217);
|
|
||||||
while (v2 >>= 1) {
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
m <<= 1;
|
|
||||||
st += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
arith_encode(cinfo, st, 0);
|
|
||||||
/* Figure F.9: Encoding the magnitude bit pattern of v */
|
|
||||||
st += 14;
|
|
||||||
while (m >>= 1)
|
|
||||||
arith_encode(cinfo, st, (m & v) ? 1 : 0);
|
|
||||||
}
|
|
||||||
/* Encode EOB decision only if k < cinfo->lim_Se */
|
|
||||||
if (k < cinfo->lim_Se) {
|
|
||||||
st = entropy->ac_stats[tbl] + 3 * k;
|
|
||||||
arith_encode(cinfo, st, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize for an arithmetic-compressed scan.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
start_pass (j_compress_ptr cinfo, boolean gather_statistics)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy = (arith_entropy_ptr) cinfo->entropy;
|
|
||||||
int ci, tbl;
|
|
||||||
jpeg_component_info * compptr;
|
|
||||||
|
|
||||||
if (gather_statistics)
|
|
||||||
/* Make sure to avoid that in the master control logic!
|
|
||||||
* We are fully adaptive here and need no extra
|
|
||||||
* statistics gathering pass!
|
|
||||||
*/
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
|
|
||||||
/* We assume jcmaster.c already validated the progressive scan parameters. */
|
|
||||||
|
|
||||||
/* Select execution routines */
|
|
||||||
if (cinfo->progressive_mode) {
|
|
||||||
if (cinfo->Ah == 0) {
|
|
||||||
if (cinfo->Ss == 0)
|
|
||||||
entropy->pub.encode_mcu = encode_mcu_DC_first;
|
|
||||||
else
|
|
||||||
entropy->pub.encode_mcu = encode_mcu_AC_first;
|
|
||||||
} else {
|
|
||||||
if (cinfo->Ss == 0)
|
|
||||||
entropy->pub.encode_mcu = encode_mcu_DC_refine;
|
|
||||||
else
|
|
||||||
entropy->pub.encode_mcu = encode_mcu_AC_refine;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
entropy->pub.encode_mcu = encode_mcu;
|
|
||||||
|
|
||||||
/* Allocate & initialize requested statistics areas */
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
/* DC needs no table for refinement scan */
|
|
||||||
if (cinfo->Ss == 0 && cinfo->Ah == 0) {
|
|
||||||
tbl = compptr->dc_tbl_no;
|
|
||||||
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
|
||||||
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
|
||||||
if (entropy->dc_stats[tbl] == NULL)
|
|
||||||
entropy->dc_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, DC_STAT_BINS);
|
|
||||||
MEMZERO(entropy->dc_stats[tbl], DC_STAT_BINS);
|
|
||||||
/* Initialize DC predictions to 0 */
|
|
||||||
entropy->last_dc_val[ci] = 0;
|
|
||||||
entropy->dc_context[ci] = 0;
|
|
||||||
}
|
|
||||||
/* AC needs no table when not present */
|
|
||||||
if (cinfo->Se) {
|
|
||||||
tbl = compptr->ac_tbl_no;
|
|
||||||
if (tbl < 0 || tbl >= NUM_ARITH_TBLS)
|
|
||||||
ERREXIT1(cinfo, JERR_NO_ARITH_TABLE, tbl);
|
|
||||||
if (entropy->ac_stats[tbl] == NULL)
|
|
||||||
entropy->ac_stats[tbl] = (unsigned char *) (*cinfo->mem->alloc_small)
|
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, AC_STAT_BINS);
|
|
||||||
MEMZERO(entropy->ac_stats[tbl], AC_STAT_BINS);
|
|
||||||
#ifdef CALCULATE_SPECTRAL_CONDITIONING
|
|
||||||
if (cinfo->progressive_mode)
|
|
||||||
/* Section G.1.3.2: Set appropriate arithmetic conditioning value Kx */
|
|
||||||
cinfo->arith_ac_K[tbl] = cinfo->Ss + ((8 + cinfo->Se - cinfo->Ss) >> 4);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize arithmetic encoding variables */
|
|
||||||
entropy->c = 0;
|
|
||||||
entropy->a = 0x10000L;
|
|
||||||
entropy->sc = 0;
|
|
||||||
entropy->zc = 0;
|
|
||||||
entropy->ct = 11;
|
|
||||||
entropy->buffer = -1; /* empty */
|
|
||||||
|
|
||||||
/* Initialize restart stuff */
|
|
||||||
entropy->restarts_to_go = cinfo->restart_interval;
|
|
||||||
entropy->next_restart_num = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Module initialization routine for arithmetic entropy encoding.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_arith_encoder (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
arith_entropy_ptr entropy;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
entropy = (arith_entropy_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(arith_entropy_encoder));
|
|
||||||
cinfo->entropy = &entropy->pub;
|
|
||||||
entropy->pub.start_pass = start_pass;
|
|
||||||
entropy->pub.finish_pass = finish_pass;
|
|
||||||
|
|
||||||
/* Mark tables unallocated */
|
|
||||||
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
|
||||||
entropy->dc_stats[i] = NULL;
|
|
||||||
entropy->ac_stats[i] = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize index for fixed probability estimation */
|
|
||||||
entropy->fixed_bin[0] = 113;
|
|
||||||
}
|
|
@ -1,454 +0,0 @@
|
|||||||
/*
|
|
||||||
* jccoefct.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
|
||||||
* Modified 2003-2011 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains the coefficient buffer controller for compression.
|
|
||||||
* This controller is the top level of the JPEG compressor proper.
|
|
||||||
* The coefficient buffer lies between forward-DCT and entropy encoding steps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* We use a full-image coefficient buffer when doing Huffman optimization,
|
|
||||||
* and also for writing multiple-scan JPEG files. In all cases, the DCT
|
|
||||||
* step is run during the first pass, and subsequent passes need only read
|
|
||||||
* the buffered coefficients.
|
|
||||||
*/
|
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
|
||||||
#define FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
#else
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
#define FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Private buffer controller object */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_c_coef_controller pub; /* public fields */
|
|
||||||
|
|
||||||
JDIMENSION iMCU_row_num; /* iMCU row # within image */
|
|
||||||
JDIMENSION mcu_ctr; /* counts MCUs processed in current row */
|
|
||||||
int MCU_vert_offset; /* counts MCU rows within iMCU row */
|
|
||||||
int MCU_rows_per_iMCU_row; /* number of such rows needed */
|
|
||||||
|
|
||||||
/* For single-pass compression, it's sufficient to buffer just one MCU
|
|
||||||
* (although this may prove a bit slow in practice). We allocate a
|
|
||||||
* workspace of C_MAX_BLOCKS_IN_MCU coefficient blocks, and reuse it for each
|
|
||||||
* MCU constructed and sent. (On 80x86, the workspace is FAR even though
|
|
||||||
* it's not really very big; this is to keep the module interfaces unchanged
|
|
||||||
* when a large coefficient buffer is necessary.)
|
|
||||||
* In multi-pass modes, this array points to the current MCU's blocks
|
|
||||||
* within the virtual arrays.
|
|
||||||
*/
|
|
||||||
JBLOCKROW MCU_buffer[C_MAX_BLOCKS_IN_MCU];
|
|
||||||
|
|
||||||
/* In multi-pass modes, we need a virtual block array for each component. */
|
|
||||||
jvirt_barray_ptr whole_image[MAX_COMPONENTS];
|
|
||||||
} my_coef_controller;
|
|
||||||
|
|
||||||
typedef my_coef_controller * my_coef_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
|
||||||
METHODDEF(boolean) compress_data
|
|
||||||
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
|
|
||||||
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
METHODDEF(boolean) compress_first_pass
|
|
||||||
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
|
|
||||||
METHODDEF(boolean) compress_output
|
|
||||||
JPP((j_compress_ptr cinfo, JSAMPIMAGE input_buf));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
start_iMCU_row (j_compress_ptr cinfo)
|
|
||||||
/* Reset within-iMCU-row counters for a new row */
|
|
||||||
{
|
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
|
||||||
|
|
||||||
/* In an interleaved scan, an MCU row is the same as an iMCU row.
|
|
||||||
* In a noninterleaved scan, an iMCU row has v_samp_factor MCU rows.
|
|
||||||
* But at the bottom of the image, process only what's left.
|
|
||||||
*/
|
|
||||||
if (cinfo->comps_in_scan > 1) {
|
|
||||||
coef->MCU_rows_per_iMCU_row = 1;
|
|
||||||
} else {
|
|
||||||
if (coef->iMCU_row_num < (cinfo->total_iMCU_rows-1))
|
|
||||||
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->v_samp_factor;
|
|
||||||
else
|
|
||||||
coef->MCU_rows_per_iMCU_row = cinfo->cur_comp_info[0]->last_row_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
coef->mcu_ctr = 0;
|
|
||||||
coef->MCU_vert_offset = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize for a processing pass.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
start_pass_coef (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
|
|
||||||
{
|
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
|
||||||
|
|
||||||
coef->iMCU_row_num = 0;
|
|
||||||
start_iMCU_row(cinfo);
|
|
||||||
|
|
||||||
switch (pass_mode) {
|
|
||||||
case JBUF_PASS_THRU:
|
|
||||||
if (coef->whole_image[0] != NULL)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
coef->pub.compress_data = compress_data;
|
|
||||||
break;
|
|
||||||
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
case JBUF_SAVE_AND_PASS:
|
|
||||||
if (coef->whole_image[0] == NULL)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
coef->pub.compress_data = compress_first_pass;
|
|
||||||
break;
|
|
||||||
case JBUF_CRANK_DEST:
|
|
||||||
if (coef->whole_image[0] == NULL)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
coef->pub.compress_data = compress_output;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process some data in the single-pass case.
|
|
||||||
* We process the equivalent of one fully interleaved MCU row ("iMCU" row)
|
|
||||||
* per call, ie, v_samp_factor block rows for each component in the image.
|
|
||||||
* Returns TRUE if the iMCU row is completed, FALSE if suspended.
|
|
||||||
*
|
|
||||||
* NB: input_buf contains a plane for each component in image,
|
|
||||||
* which we index according to the component's SOF position.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
compress_data (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
|
||||||
{
|
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
|
||||||
JDIMENSION last_MCU_col = cinfo->MCUs_per_row - 1;
|
|
||||||
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
|
||||||
int blkn, bi, ci, yindex, yoffset, blockcnt;
|
|
||||||
JDIMENSION ypos, xpos;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
forward_DCT_ptr forward_DCT;
|
|
||||||
|
|
||||||
/* Loop to write as much as one whole iMCU row */
|
|
||||||
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
|
||||||
yoffset++) {
|
|
||||||
for (MCU_col_num = coef->mcu_ctr; MCU_col_num <= last_MCU_col;
|
|
||||||
MCU_col_num++) {
|
|
||||||
/* Determine where data comes from in input_buf and do the DCT thing.
|
|
||||||
* Each call on forward_DCT processes a horizontal row of DCT blocks
|
|
||||||
* as wide as an MCU; we rely on having allocated the MCU_buffer[] blocks
|
|
||||||
* sequentially. Dummy blocks at the right or bottom edge are filled in
|
|
||||||
* specially. The data in them does not matter for image reconstruction,
|
|
||||||
* so we fill them with values that will encode to the smallest amount of
|
|
||||||
* data, viz: all zeroes in the AC entries, DC entries equal to previous
|
|
||||||
* block's DC value. (Thanks to Thomas Kinsman for this idea.)
|
|
||||||
*/
|
|
||||||
blkn = 0;
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
forward_DCT = cinfo->fdct->forward_DCT[compptr->component_index];
|
|
||||||
blockcnt = (MCU_col_num < last_MCU_col) ? compptr->MCU_width
|
|
||||||
: compptr->last_col_width;
|
|
||||||
xpos = MCU_col_num * compptr->MCU_sample_width;
|
|
||||||
ypos = yoffset * compptr->DCT_v_scaled_size;
|
|
||||||
/* ypos == (yoffset+yindex) * DCTSIZE */
|
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
|
||||||
if (coef->iMCU_row_num < last_iMCU_row ||
|
|
||||||
yoffset+yindex < compptr->last_row_height) {
|
|
||||||
(*forward_DCT) (cinfo, compptr,
|
|
||||||
input_buf[compptr->component_index],
|
|
||||||
coef->MCU_buffer[blkn],
|
|
||||||
ypos, xpos, (JDIMENSION) blockcnt);
|
|
||||||
if (blockcnt < compptr->MCU_width) {
|
|
||||||
/* Create some dummy blocks at the right edge of the image. */
|
|
||||||
FMEMZERO((void FAR *) coef->MCU_buffer[blkn + blockcnt],
|
|
||||||
(compptr->MCU_width - blockcnt) * SIZEOF(JBLOCK));
|
|
||||||
for (bi = blockcnt; bi < compptr->MCU_width; bi++) {
|
|
||||||
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn+bi-1][0][0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* Create a row of dummy blocks at the bottom of the image. */
|
|
||||||
FMEMZERO((void FAR *) coef->MCU_buffer[blkn],
|
|
||||||
compptr->MCU_width * SIZEOF(JBLOCK));
|
|
||||||
for (bi = 0; bi < compptr->MCU_width; bi++) {
|
|
||||||
coef->MCU_buffer[blkn+bi][0][0] = coef->MCU_buffer[blkn-1][0][0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
blkn += compptr->MCU_width;
|
|
||||||
ypos += compptr->DCT_v_scaled_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Try to write the MCU. In event of a suspension failure, we will
|
|
||||||
* re-DCT the MCU on restart (a bit inefficient, could be fixed...)
|
|
||||||
*/
|
|
||||||
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
|
||||||
/* Suspension forced; update state counters and exit */
|
|
||||||
coef->MCU_vert_offset = yoffset;
|
|
||||||
coef->mcu_ctr = MCU_col_num;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Completed an MCU row, but perhaps not an iMCU row */
|
|
||||||
coef->mcu_ctr = 0;
|
|
||||||
}
|
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
|
||||||
coef->iMCU_row_num++;
|
|
||||||
start_iMCU_row(cinfo);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process some data in the first pass of a multi-pass case.
|
|
||||||
* We process the equivalent of one fully interleaved MCU row ("iMCU" row)
|
|
||||||
* per call, ie, v_samp_factor block rows for each component in the image.
|
|
||||||
* This amount of data is read from the source buffer, DCT'd and quantized,
|
|
||||||
* and saved into the virtual arrays. We also generate suitable dummy blocks
|
|
||||||
* as needed at the right and lower edges. (The dummy blocks are constructed
|
|
||||||
* in the virtual arrays, which have been padded appropriately.) This makes
|
|
||||||
* it possible for subsequent passes not to worry about real vs. dummy blocks.
|
|
||||||
*
|
|
||||||
* We must also emit the data to the entropy encoder. This is conveniently
|
|
||||||
* done by calling compress_output() after we've loaded the current strip
|
|
||||||
* of the virtual arrays.
|
|
||||||
*
|
|
||||||
* NB: input_buf contains a plane for each component in image. All
|
|
||||||
* components are DCT'd and loaded into the virtual arrays in this pass.
|
|
||||||
* However, it may be that only a subset of the components are emitted to
|
|
||||||
* the entropy encoder during this first pass; be careful about looking
|
|
||||||
* at the scan-dependent variables (MCU dimensions, etc).
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
compress_first_pass (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
|
||||||
{
|
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
|
||||||
JDIMENSION last_iMCU_row = cinfo->total_iMCU_rows - 1;
|
|
||||||
JDIMENSION blocks_across, MCUs_across, MCUindex;
|
|
||||||
int bi, ci, h_samp_factor, block_row, block_rows, ndummy;
|
|
||||||
JCOEF lastDC;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
JBLOCKARRAY buffer;
|
|
||||||
JBLOCKROW thisblockrow, lastblockrow;
|
|
||||||
forward_DCT_ptr forward_DCT;
|
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Align the virtual buffer for this component. */
|
|
||||||
buffer = (*cinfo->mem->access_virt_barray)
|
|
||||||
((j_common_ptr) cinfo, coef->whole_image[ci],
|
|
||||||
coef->iMCU_row_num * compptr->v_samp_factor,
|
|
||||||
(JDIMENSION) compptr->v_samp_factor, TRUE);
|
|
||||||
/* Count non-dummy DCT block rows in this iMCU row. */
|
|
||||||
if (coef->iMCU_row_num < last_iMCU_row)
|
|
||||||
block_rows = compptr->v_samp_factor;
|
|
||||||
else {
|
|
||||||
/* NB: can't use last_row_height here, since may not be set! */
|
|
||||||
block_rows = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
|
||||||
if (block_rows == 0) block_rows = compptr->v_samp_factor;
|
|
||||||
}
|
|
||||||
blocks_across = compptr->width_in_blocks;
|
|
||||||
h_samp_factor = compptr->h_samp_factor;
|
|
||||||
/* Count number of dummy blocks to be added at the right margin. */
|
|
||||||
ndummy = (int) (blocks_across % h_samp_factor);
|
|
||||||
if (ndummy > 0)
|
|
||||||
ndummy = h_samp_factor - ndummy;
|
|
||||||
forward_DCT = cinfo->fdct->forward_DCT[ci];
|
|
||||||
/* Perform DCT for all non-dummy blocks in this iMCU row. Each call
|
|
||||||
* on forward_DCT processes a complete horizontal row of DCT blocks.
|
|
||||||
*/
|
|
||||||
for (block_row = 0; block_row < block_rows; block_row++) {
|
|
||||||
thisblockrow = buffer[block_row];
|
|
||||||
(*forward_DCT) (cinfo, compptr, input_buf[ci], thisblockrow,
|
|
||||||
(JDIMENSION) (block_row * compptr->DCT_v_scaled_size),
|
|
||||||
(JDIMENSION) 0, blocks_across);
|
|
||||||
if (ndummy > 0) {
|
|
||||||
/* Create dummy blocks at the right edge of the image. */
|
|
||||||
thisblockrow += blocks_across; /* => first dummy block */
|
|
||||||
FMEMZERO((void FAR *) thisblockrow, ndummy * SIZEOF(JBLOCK));
|
|
||||||
lastDC = thisblockrow[-1][0];
|
|
||||||
for (bi = 0; bi < ndummy; bi++) {
|
|
||||||
thisblockrow[bi][0] = lastDC;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* If at end of image, create dummy block rows as needed.
|
|
||||||
* The tricky part here is that within each MCU, we want the DC values
|
|
||||||
* of the dummy blocks to match the last real block's DC value.
|
|
||||||
* This squeezes a few more bytes out of the resulting file...
|
|
||||||
*/
|
|
||||||
if (coef->iMCU_row_num == last_iMCU_row) {
|
|
||||||
blocks_across += ndummy; /* include lower right corner */
|
|
||||||
MCUs_across = blocks_across / h_samp_factor;
|
|
||||||
for (block_row = block_rows; block_row < compptr->v_samp_factor;
|
|
||||||
block_row++) {
|
|
||||||
thisblockrow = buffer[block_row];
|
|
||||||
lastblockrow = buffer[block_row-1];
|
|
||||||
FMEMZERO((void FAR *) thisblockrow,
|
|
||||||
(size_t) (blocks_across * SIZEOF(JBLOCK)));
|
|
||||||
for (MCUindex = 0; MCUindex < MCUs_across; MCUindex++) {
|
|
||||||
lastDC = lastblockrow[h_samp_factor-1][0];
|
|
||||||
for (bi = 0; bi < h_samp_factor; bi++) {
|
|
||||||
thisblockrow[bi][0] = lastDC;
|
|
||||||
}
|
|
||||||
thisblockrow += h_samp_factor; /* advance to next MCU in row */
|
|
||||||
lastblockrow += h_samp_factor;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* NB: compress_output will increment iMCU_row_num if successful.
|
|
||||||
* A suspension return will result in redoing all the work above next time.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Emit data to the entropy encoder, sharing code with subsequent passes */
|
|
||||||
return compress_output(cinfo, input_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process some data in subsequent passes of a multi-pass case.
|
|
||||||
* We process the equivalent of one fully interleaved MCU row ("iMCU" row)
|
|
||||||
* per call, ie, v_samp_factor block rows for each component in the scan.
|
|
||||||
* The data is obtained from the virtual arrays and fed to the entropy coder.
|
|
||||||
* Returns TRUE if the iMCU row is completed, FALSE if suspended.
|
|
||||||
*
|
|
||||||
* NB: input_buf is ignored; it is likely to be a NULL pointer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(boolean)
|
|
||||||
compress_output (j_compress_ptr cinfo, JSAMPIMAGE input_buf)
|
|
||||||
{
|
|
||||||
my_coef_ptr coef = (my_coef_ptr) cinfo->coef;
|
|
||||||
JDIMENSION MCU_col_num; /* index of current MCU within row */
|
|
||||||
int blkn, ci, xindex, yindex, yoffset;
|
|
||||||
JDIMENSION start_col;
|
|
||||||
JBLOCKARRAY buffer[MAX_COMPS_IN_SCAN];
|
|
||||||
JBLOCKROW buffer_ptr;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
/* Align the virtual buffers for the components used in this scan.
|
|
||||||
* NB: during first pass, this is safe only because the buffers will
|
|
||||||
* already be aligned properly, so jmemmgr.c won't need to do any I/O.
|
|
||||||
*/
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
buffer[ci] = (*cinfo->mem->access_virt_barray)
|
|
||||||
((j_common_ptr) cinfo, coef->whole_image[compptr->component_index],
|
|
||||||
coef->iMCU_row_num * compptr->v_samp_factor,
|
|
||||||
(JDIMENSION) compptr->v_samp_factor, FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Loop to process one whole iMCU row */
|
|
||||||
for (yoffset = coef->MCU_vert_offset; yoffset < coef->MCU_rows_per_iMCU_row;
|
|
||||||
yoffset++) {
|
|
||||||
for (MCU_col_num = coef->mcu_ctr; MCU_col_num < cinfo->MCUs_per_row;
|
|
||||||
MCU_col_num++) {
|
|
||||||
/* Construct list of pointers to DCT blocks belonging to this MCU */
|
|
||||||
blkn = 0; /* index of current DCT block within MCU */
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
start_col = MCU_col_num * compptr->MCU_width;
|
|
||||||
for (yindex = 0; yindex < compptr->MCU_height; yindex++) {
|
|
||||||
buffer_ptr = buffer[ci][yindex+yoffset] + start_col;
|
|
||||||
for (xindex = 0; xindex < compptr->MCU_width; xindex++) {
|
|
||||||
coef->MCU_buffer[blkn++] = buffer_ptr++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Try to write the MCU. */
|
|
||||||
if (! (*cinfo->entropy->encode_mcu) (cinfo, coef->MCU_buffer)) {
|
|
||||||
/* Suspension forced; update state counters and exit */
|
|
||||||
coef->MCU_vert_offset = yoffset;
|
|
||||||
coef->mcu_ctr = MCU_col_num;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Completed an MCU row, but perhaps not an iMCU row */
|
|
||||||
coef->mcu_ctr = 0;
|
|
||||||
}
|
|
||||||
/* Completed the iMCU row, advance counters for next one */
|
|
||||||
coef->iMCU_row_num++;
|
|
||||||
start_iMCU_row(cinfo);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* FULL_COEF_BUFFER_SUPPORTED */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize coefficient buffer controller.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_c_coef_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
|
||||||
{
|
|
||||||
my_coef_ptr coef;
|
|
||||||
|
|
||||||
coef = (my_coef_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_coef_controller));
|
|
||||||
cinfo->coef = (struct jpeg_c_coef_controller *) coef;
|
|
||||||
coef->pub.start_pass = start_pass_coef;
|
|
||||||
|
|
||||||
/* Create the coefficient buffer. */
|
|
||||||
if (need_full_buffer) {
|
|
||||||
#ifdef FULL_COEF_BUFFER_SUPPORTED
|
|
||||||
/* Allocate a full-image virtual array for each component, */
|
|
||||||
/* padded to a multiple of samp_factor DCT blocks in each direction. */
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
coef->whole_image[ci] = (*cinfo->mem->request_virt_barray)
|
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
|
|
||||||
(JDIMENSION) jround_up((long) compptr->width_in_blocks,
|
|
||||||
(long) compptr->h_samp_factor),
|
|
||||||
(JDIMENSION) jround_up((long) compptr->height_in_blocks,
|
|
||||||
(long) compptr->v_samp_factor),
|
|
||||||
(JDIMENSION) compptr->v_samp_factor);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
/* We only need a single-MCU buffer. */
|
|
||||||
JBLOCKROW buffer;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
buffer = (JBLOCKROW)
|
|
||||||
(*cinfo->mem->alloc_large) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
C_MAX_BLOCKS_IN_MCU * SIZEOF(JBLOCK));
|
|
||||||
for (i = 0; i < C_MAX_BLOCKS_IN_MCU; i++) {
|
|
||||||
coef->MCU_buffer[i] = buffer + i;
|
|
||||||
}
|
|
||||||
coef->whole_image[0] = NULL; /* flag for no virtual arrays */
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,604 +0,0 @@
|
|||||||
/*
|
|
||||||
* jccolor.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1996, Thomas G. Lane.
|
|
||||||
* Modified 2011-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains input colorspace conversion routines.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Private subobject */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_color_converter pub; /* public fields */
|
|
||||||
|
|
||||||
/* Private state for RGB->YCC conversion */
|
|
||||||
INT32 * rgb_ycc_tab; /* => table for RGB to YCbCr conversion */
|
|
||||||
} my_color_converter;
|
|
||||||
|
|
||||||
typedef my_color_converter * my_cconvert_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/**************** RGB -> YCbCr conversion: most common case **************/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* YCbCr is defined per Recommendation ITU-R BT.601-7 (03/2011),
|
|
||||||
* previously known as Recommendation CCIR 601-1, except that Cb and Cr
|
|
||||||
* are normalized to the range 0..MAXJSAMPLE rather than -0.5 .. 0.5.
|
|
||||||
* sRGB (standard RGB color space) is defined per IEC 61966-2-1:1999.
|
|
||||||
* sYCC (standard luma-chroma-chroma color space with extended gamut)
|
|
||||||
* is defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex F.
|
|
||||||
* bg-sRGB and bg-sYCC (big gamut standard color spaces)
|
|
||||||
* are defined per IEC 61966-2-1:1999 Amendment A1:2003 Annex G.
|
|
||||||
* Note that the derived conversion coefficients given in some of these
|
|
||||||
* documents are imprecise. The general conversion equations are
|
|
||||||
* Y = Kr * R + (1 - Kr - Kb) * G + Kb * B
|
|
||||||
* Cb = 0.5 * (B - Y) / (1 - Kb)
|
|
||||||
* Cr = 0.5 * (R - Y) / (1 - Kr)
|
|
||||||
* With Kr = 0.299 and Kb = 0.114 (derived according to SMPTE RP 177-1993
|
|
||||||
* from the 1953 FCC NTSC primaries and CIE Illuminant C),
|
|
||||||
* the conversion equations to be implemented are therefore
|
|
||||||
* Y = 0.299 * R + 0.587 * G + 0.114 * B
|
|
||||||
* Cb = -0.168735892 * R - 0.331264108 * G + 0.5 * B + CENTERJSAMPLE
|
|
||||||
* Cr = 0.5 * R - 0.418687589 * G - 0.081312411 * B + CENTERJSAMPLE
|
|
||||||
* Note: older versions of the IJG code used a zero offset of MAXJSAMPLE/2,
|
|
||||||
* rather than CENTERJSAMPLE, for Cb and Cr. This gave equal positive and
|
|
||||||
* negative swings for Cb/Cr, but meant that grayscale values (Cb=Cr=0)
|
|
||||||
* were not represented exactly. Now we sacrifice exact representation of
|
|
||||||
* maximum red and maximum blue in order to get exact grayscales.
|
|
||||||
*
|
|
||||||
* To avoid floating-point arithmetic, we represent the fractional constants
|
|
||||||
* as integers scaled up by 2^16 (about 4 digits precision); we have to divide
|
|
||||||
* the products by 2^16, with appropriate rounding, to get the correct answer.
|
|
||||||
*
|
|
||||||
* For even more speed, we avoid doing any multiplications in the inner loop
|
|
||||||
* by precalculating the constants times R,G,B for all possible values.
|
|
||||||
* For 8-bit JSAMPLEs this is very reasonable (only 256 entries per table);
|
|
||||||
* for 9-bit to 12-bit samples it is still acceptable. It's not very
|
|
||||||
* reasonable for 16-bit samples, but if you want lossless storage you
|
|
||||||
* shouldn't be changing colorspace anyway.
|
|
||||||
* The CENTERJSAMPLE offsets and the rounding fudge-factor of 0.5 are included
|
|
||||||
* in the tables to save adding them separately in the inner loop.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define SCALEBITS 16 /* speediest right-shift on some machines */
|
|
||||||
#define CBCR_OFFSET ((INT32) CENTERJSAMPLE << SCALEBITS)
|
|
||||||
#define ONE_HALF ((INT32) 1 << (SCALEBITS-1))
|
|
||||||
#define FIX(x) ((INT32) ((x) * (1L<<SCALEBITS) + 0.5))
|
|
||||||
|
|
||||||
/* We allocate one big table and divide it up into eight parts, instead of
|
|
||||||
* doing eight 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 eight 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 R_CB_OFF (3*(MAXJSAMPLE+1))
|
|
||||||
#define G_CB_OFF (4*(MAXJSAMPLE+1))
|
|
||||||
#define B_CB_OFF (5*(MAXJSAMPLE+1))
|
|
||||||
#define R_CR_OFF B_CB_OFF /* B=>Cb, R=>Cr are the same */
|
|
||||||
#define G_CR_OFF (6*(MAXJSAMPLE+1))
|
|
||||||
#define B_CR_OFF (7*(MAXJSAMPLE+1))
|
|
||||||
#define TABLE_SIZE (8*(MAXJSAMPLE+1))
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize for RGB->YCC colorspace conversion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
rgb_ycc_start (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
|
||||||
INT32 * rgb_ycc_tab;
|
|
||||||
INT32 i;
|
|
||||||
|
|
||||||
/* Allocate and fill in the conversion tables. */
|
|
||||||
cconvert->rgb_ycc_tab = rgb_ycc_tab = (INT32 *)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
(TABLE_SIZE * SIZEOF(INT32)));
|
|
||||||
|
|
||||||
for (i = 0; i <= MAXJSAMPLE; i++) {
|
|
||||||
rgb_ycc_tab[i+R_Y_OFF] = FIX(0.299) * i;
|
|
||||||
rgb_ycc_tab[i+G_Y_OFF] = FIX(0.587) * i;
|
|
||||||
rgb_ycc_tab[i+B_Y_OFF] = FIX(0.114) * i + ONE_HALF;
|
|
||||||
rgb_ycc_tab[i+R_CB_OFF] = (-FIX(0.168735892)) * i;
|
|
||||||
rgb_ycc_tab[i+G_CB_OFF] = (-FIX(0.331264108)) * i;
|
|
||||||
/* We use a rounding fudge-factor of 0.5-epsilon for Cb and Cr.
|
|
||||||
* This ensures that the maximum output will round to MAXJSAMPLE
|
|
||||||
* not MAXJSAMPLE+1, and thus that we don't have to range-limit.
|
|
||||||
*/
|
|
||||||
rgb_ycc_tab[i+B_CB_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
|
||||||
/* B=>Cb and R=>Cr tables are the same
|
|
||||||
rgb_ycc_tab[i+R_CR_OFF] = FIX(0.5) * i + CBCR_OFFSET + ONE_HALF-1;
|
|
||||||
*/
|
|
||||||
rgb_ycc_tab[i+G_CR_OFF] = (-FIX(0.418687589)) * i;
|
|
||||||
rgb_ycc_tab[i+B_CR_OFF] = (-FIX(0.081312411)) * i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
|
||||||
*
|
|
||||||
* Note that we change from the application's interleaved-pixel format
|
|
||||||
* to our internal noninterleaved, one-plane-per-component format.
|
|
||||||
* The input buffer is therefore three times as wide as the output buffer.
|
|
||||||
*
|
|
||||||
* A starting row offset is provided only for the output buffer. The caller
|
|
||||||
* can easily adjust the passed input_buf value to accommodate any row
|
|
||||||
* offset required on that side.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
rgb_ycc_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
|
||||||
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++) {
|
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
|
||||||
* Hence the value being shifted is never negative, and we don't
|
|
||||||
* need the general RIGHT_SHIFT macro.
|
|
||||||
*/
|
|
||||||
/* Y */
|
|
||||||
outptr0[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
/* Cb */
|
|
||||||
outptr1[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
/* Cr */
|
|
||||||
outptr2[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**************** Cases other than RGB -> YCbCr **************/
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
|
||||||
* This version handles RGB->grayscale conversion, which is the same
|
|
||||||
* as the RGB->Y portion of RGB->YCbCr.
|
|
||||||
* We assume rgb_ycc_start has been called (we only use the Y tables).
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
rgb_gray_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
|
||||||
register JSAMPROW inptr;
|
|
||||||
register JSAMPROW outptr;
|
|
||||||
register JDIMENSION col;
|
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
|
||||||
inptr = *input_buf++;
|
|
||||||
outptr = output_buf[0][output_row++];
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
|
||||||
/* Y */
|
|
||||||
outptr[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
|
||||||
* This version handles Adobe-style CMYK->YCCK conversion,
|
|
||||||
* where we convert R=1-C, G=1-M, and B=1-Y to YCbCr using the same
|
|
||||||
* conversion as above, while passing K (black) unchanged.
|
|
||||||
* We assume rgb_ycc_start has been called.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
cmyk_ycck_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
my_cconvert_ptr cconvert = (my_cconvert_ptr) cinfo->cconvert;
|
|
||||||
register INT32 * ctab = cconvert->rgb_ycc_tab;
|
|
||||||
register int r, g, b;
|
|
||||||
register JSAMPROW inptr;
|
|
||||||
register JSAMPROW outptr0, outptr1, outptr2, outptr3;
|
|
||||||
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];
|
|
||||||
outptr3 = output_buf[3][output_row];
|
|
||||||
output_row++;
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
|
||||||
r = MAXJSAMPLE - GETJSAMPLE(inptr[0]);
|
|
||||||
g = MAXJSAMPLE - GETJSAMPLE(inptr[1]);
|
|
||||||
b = MAXJSAMPLE - GETJSAMPLE(inptr[2]);
|
|
||||||
/* K passes through as-is */
|
|
||||||
outptr3[col] = inptr[3]; /* don't need GETJSAMPLE here */
|
|
||||||
/* If the inputs are 0..MAXJSAMPLE, the outputs of these equations
|
|
||||||
* must be too; we do not need an explicit range-limiting operation.
|
|
||||||
* Hence the value being shifted is never negative, and we don't
|
|
||||||
* need the general RIGHT_SHIFT macro.
|
|
||||||
*/
|
|
||||||
/* Y */
|
|
||||||
outptr0[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_Y_OFF] + ctab[g+G_Y_OFF] + ctab[b+B_Y_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
/* Cb */
|
|
||||||
outptr1[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_CB_OFF] + ctab[g+G_CB_OFF] + ctab[b+B_CB_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
/* Cr */
|
|
||||||
outptr2[col] = (JSAMPLE)
|
|
||||||
((ctab[r+R_CR_OFF] + ctab[g+G_CR_OFF] + ctab[b+B_CR_OFF])
|
|
||||||
>> SCALEBITS);
|
|
||||||
inptr += 4;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
|
||||||
* [R,G,B] to [R-G,G,B-G] conversion with modulo calculation
|
|
||||||
* (forward reversible color transform).
|
|
||||||
* This can be seen as an adaption of the general RGB->YCbCr
|
|
||||||
* conversion equation with Kr = Kb = 0, while replacing the
|
|
||||||
* normalization by modulo calculation.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
rgb_rgb1_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
register int r, g, b;
|
|
||||||
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++) {
|
|
||||||
r = GETJSAMPLE(inptr[RGB_RED]);
|
|
||||||
g = GETJSAMPLE(inptr[RGB_GREEN]);
|
|
||||||
b = GETJSAMPLE(inptr[RGB_BLUE]);
|
|
||||||
/* Assume that MAXJSAMPLE+1 is a power of 2, so that the MOD
|
|
||||||
* (modulo) operator is equivalent to the bitmask operator AND.
|
|
||||||
*/
|
|
||||||
outptr0[col] = (JSAMPLE) ((r - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
|
||||||
outptr1[col] = (JSAMPLE) g;
|
|
||||||
outptr2[col] = (JSAMPLE) ((b - g + CENTERJSAMPLE) & MAXJSAMPLE);
|
|
||||||
inptr += RGB_PIXELSIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convert some rows of samples to the JPEG colorspace.
|
|
||||||
* This version handles grayscale output with no conversion.
|
|
||||||
* The source can be either plain grayscale or YCC (since Y == gray).
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
grayscale_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
int instride = cinfo->input_components;
|
|
||||||
register JSAMPROW inptr;
|
|
||||||
register JSAMPROW outptr;
|
|
||||||
register JDIMENSION col;
|
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
|
||||||
inptr = *input_buf++;
|
|
||||||
outptr = output_buf[0][output_row++];
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
|
||||||
outptr[col] = inptr[0]; /* don't need GETJSAMPLE() here */
|
|
||||||
inptr += instride;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
* This version handles multi-component colorspaces without conversion.
|
|
||||||
* We assume input_components == num_components.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
null_convert (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JSAMPIMAGE output_buf,
|
|
||||||
JDIMENSION output_row, int num_rows)
|
|
||||||
{
|
|
||||||
int ci;
|
|
||||||
register int nc = cinfo->num_components;
|
|
||||||
register JSAMPROW inptr;
|
|
||||||
register JSAMPROW outptr;
|
|
||||||
register JDIMENSION col;
|
|
||||||
JDIMENSION num_cols = cinfo->image_width;
|
|
||||||
|
|
||||||
while (--num_rows >= 0) {
|
|
||||||
/* It seems fastest to make a separate pass for each component. */
|
|
||||||
for (ci = 0; ci < nc; ci++) {
|
|
||||||
inptr = input_buf[0] + ci;
|
|
||||||
outptr = output_buf[ci][output_row];
|
|
||||||
for (col = 0; col < num_cols; col++) {
|
|
||||||
*outptr++ = *inptr; /* don't need GETJSAMPLE() here */
|
|
||||||
inptr += nc;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
input_buf++;
|
|
||||||
output_row++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Empty method for start_pass.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
null_method (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
/* no work needed */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Module initialization routine for input colorspace conversion.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_color_converter (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_cconvert_ptr cconvert;
|
|
||||||
|
|
||||||
cconvert = (my_cconvert_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_color_converter));
|
|
||||||
cinfo->cconvert = &cconvert->pub;
|
|
||||||
/* set start_pass to null method until we find out differently */
|
|
||||||
cconvert->pub.start_pass = null_method;
|
|
||||||
|
|
||||||
/* Make sure input_components agrees with in_color_space */
|
|
||||||
switch (cinfo->in_color_space) {
|
|
||||||
case JCS_GRAYSCALE:
|
|
||||||
if (cinfo->input_components != 1)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_RGB:
|
|
||||||
case JCS_BG_RGB:
|
|
||||||
if (cinfo->input_components != RGB_PIXELSIZE)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_YCbCr:
|
|
||||||
case JCS_BG_YCC:
|
|
||||||
if (cinfo->input_components != 3)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_CMYK:
|
|
||||||
case JCS_YCCK:
|
|
||||||
if (cinfo->input_components != 4)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* JCS_UNKNOWN can be anything */
|
|
||||||
if (cinfo->input_components < 1)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_IN_COLORSPACE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Support color transform only for RGB colorspaces */
|
|
||||||
if (cinfo->color_transform &&
|
|
||||||
cinfo->jpeg_color_space != JCS_RGB &&
|
|
||||||
cinfo->jpeg_color_space != JCS_BG_RGB)
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
|
|
||||||
/* Check num_components, set conversion method based on requested space */
|
|
||||||
switch (cinfo->jpeg_color_space) {
|
|
||||||
case JCS_GRAYSCALE:
|
|
||||||
if (cinfo->num_components != 1)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
switch (cinfo->in_color_space) {
|
|
||||||
case JCS_GRAYSCALE:
|
|
||||||
case JCS_YCbCr:
|
|
||||||
case JCS_BG_YCC:
|
|
||||||
cconvert->pub.color_convert = grayscale_convert;
|
|
||||||
break;
|
|
||||||
case JCS_RGB:
|
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
|
||||||
cconvert->pub.color_convert = rgb_gray_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_RGB:
|
|
||||||
case JCS_BG_RGB:
|
|
||||||
if (cinfo->num_components != 3)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
if (cinfo->in_color_space == cinfo->jpeg_color_space) {
|
|
||||||
switch (cinfo->color_transform) {
|
|
||||||
case JCT_NONE:
|
|
||||||
cconvert->pub.color_convert = rgb_convert;
|
|
||||||
break;
|
|
||||||
case JCT_SUBTRACT_GREEN:
|
|
||||||
cconvert->pub.color_convert = rgb_rgb1_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_YCbCr:
|
|
||||||
if (cinfo->num_components != 3)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
switch (cinfo->in_color_space) {
|
|
||||||
case JCS_RGB:
|
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
|
||||||
cconvert->pub.color_convert = rgb_ycc_convert;
|
|
||||||
break;
|
|
||||||
case JCS_YCbCr:
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_BG_YCC:
|
|
||||||
if (cinfo->num_components != 3)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
switch (cinfo->in_color_space) {
|
|
||||||
case JCS_RGB:
|
|
||||||
/* For conversion from normal RGB input to BG_YCC representation,
|
|
||||||
* the Cb/Cr values are first computed as usual, and then
|
|
||||||
* quantized further after DCT processing by a factor of
|
|
||||||
* 2 in reference to the nominal quantization factor.
|
|
||||||
*/
|
|
||||||
/* need quantization scale by factor of 2 after DCT */
|
|
||||||
cinfo->comp_info[1].component_needed = TRUE;
|
|
||||||
cinfo->comp_info[2].component_needed = TRUE;
|
|
||||||
/* compute normal YCC first */
|
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
|
||||||
cconvert->pub.color_convert = rgb_ycc_convert;
|
|
||||||
break;
|
|
||||||
case JCS_YCbCr:
|
|
||||||
/* need quantization scale by factor of 2 after DCT */
|
|
||||||
cinfo->comp_info[1].component_needed = TRUE;
|
|
||||||
cinfo->comp_info[2].component_needed = TRUE;
|
|
||||||
/*FALLTHROUGH*/
|
|
||||||
case JCS_BG_YCC:
|
|
||||||
/* Pass through for BG_YCC input */
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_CMYK:
|
|
||||||
if (cinfo->num_components != 4)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
if (cinfo->in_color_space == JCS_CMYK)
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
else
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case JCS_YCCK:
|
|
||||||
if (cinfo->num_components != 4)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_J_COLORSPACE);
|
|
||||||
switch (cinfo->in_color_space) {
|
|
||||||
case JCS_CMYK:
|
|
||||||
cconvert->pub.start_pass = rgb_ycc_start;
|
|
||||||
cconvert->pub.color_convert = cmyk_ycck_convert;
|
|
||||||
break;
|
|
||||||
case JCS_YCCK:
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default: /* allow null conversion of JCS_UNKNOWN */
|
|
||||||
if (cinfo->jpeg_color_space != cinfo->in_color_space ||
|
|
||||||
cinfo->num_components != cinfo->input_components)
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
cconvert->pub.color_convert = null_convert;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,477 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcdctmgr.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains the forward-DCT management logic.
|
|
||||||
* This code selects a particular DCT implementation to be used,
|
|
||||||
* and it performs related housekeeping chores including coefficient
|
|
||||||
* quantization.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
#include "jdct.h" /* Private declarations for DCT subsystem */
|
|
||||||
|
|
||||||
|
|
||||||
/* Private subobject for this module */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_forward_dct pub; /* public fields */
|
|
||||||
|
|
||||||
/* Pointer to the DCT routine actually in use */
|
|
||||||
forward_DCT_method_ptr do_dct[MAX_COMPONENTS];
|
|
||||||
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
/* Same as above for the floating-point case. */
|
|
||||||
float_DCT_method_ptr do_float_dct[MAX_COMPONENTS];
|
|
||||||
#endif
|
|
||||||
} my_fdct_controller;
|
|
||||||
|
|
||||||
typedef my_fdct_controller * my_fdct_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/* The allocated post-DCT divisor tables -- big enough for any
|
|
||||||
* supported variant and not identical to the quant table entries,
|
|
||||||
* because of scaling (especially for an unnormalized DCT) --
|
|
||||||
* are pointed to by dct_table in the per-component comp_info
|
|
||||||
* structures. Each table is given in normal array order.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef union {
|
|
||||||
DCTELEM int_array[DCTSIZE2];
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
FAST_FLOAT float_array[DCTSIZE2];
|
|
||||||
#endif
|
|
||||||
} divisor_table;
|
|
||||||
|
|
||||||
|
|
||||||
/* The current scaled-DCT routines require ISLOW-style divisor tables,
|
|
||||||
* so be sure to compile that code if either ISLOW or SCALING is requested.
|
|
||||||
*/
|
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
|
||||||
#define PROVIDE_ISLOW_TABLES
|
|
||||||
#else
|
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
|
||||||
#define PROVIDE_ISLOW_TABLES
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Perform forward DCT on one or more blocks of a component.
|
|
||||||
*
|
|
||||||
* The input samples are taken from the sample_data[] array starting at
|
|
||||||
* position start_row/start_col, and moving to the right for any additional
|
|
||||||
* blocks. The quantized coefficients are returned in coef_blocks[].
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
forward_DCT (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
|
||||||
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
|
||||||
JDIMENSION start_row, JDIMENSION start_col,
|
|
||||||
JDIMENSION num_blocks)
|
|
||||||
/* This version is used for integer DCT implementations. */
|
|
||||||
{
|
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
|
||||||
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
|
||||||
forward_DCT_method_ptr do_dct = fdct->do_dct[compptr->component_index];
|
|
||||||
DCTELEM * divisors = (DCTELEM *) compptr->dct_table;
|
|
||||||
DCTELEM workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
|
||||||
JDIMENSION bi;
|
|
||||||
|
|
||||||
sample_data += start_row; /* fold in the vertical offset once */
|
|
||||||
|
|
||||||
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
|
||||||
/* Perform the DCT */
|
|
||||||
(*do_dct) (workspace, sample_data, start_col);
|
|
||||||
|
|
||||||
/* Quantize/descale the coefficients, and store into coef_blocks[] */
|
|
||||||
{ register DCTELEM temp, qval;
|
|
||||||
register int i;
|
|
||||||
register JCOEFPTR output_ptr = coef_blocks[bi];
|
|
||||||
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
qval = divisors[i];
|
|
||||||
temp = workspace[i];
|
|
||||||
/* Divide the coefficient value by qval, ensuring proper rounding.
|
|
||||||
* Since C does not specify the direction of rounding for negative
|
|
||||||
* quotients, we have to force the dividend positive for portability.
|
|
||||||
*
|
|
||||||
* In most files, at least half of the output values will be zero
|
|
||||||
* (at default quantization settings, more like three-quarters...)
|
|
||||||
* so we should ensure that this case is fast. On many machines,
|
|
||||||
* a comparison is enough cheaper than a divide to make a special test
|
|
||||||
* a win. Since both inputs will be nonnegative, we need only test
|
|
||||||
* for a < b to discover whether a/b is 0.
|
|
||||||
* If your machine's division is fast enough, define FAST_DIVIDE.
|
|
||||||
*/
|
|
||||||
#ifdef FAST_DIVIDE
|
|
||||||
#define DIVIDE_BY(a,b) a /= b
|
|
||||||
#else
|
|
||||||
#define DIVIDE_BY(a,b) if (a >= b) a /= b; else a = 0
|
|
||||||
#endif
|
|
||||||
if (temp < 0) {
|
|
||||||
temp = -temp;
|
|
||||||
temp += qval>>1; /* for rounding */
|
|
||||||
DIVIDE_BY(temp, qval);
|
|
||||||
temp = -temp;
|
|
||||||
} else {
|
|
||||||
temp += qval>>1; /* for rounding */
|
|
||||||
DIVIDE_BY(temp, qval);
|
|
||||||
}
|
|
||||||
output_ptr[i] = (JCOEF) temp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
forward_DCT_float (j_compress_ptr cinfo, jpeg_component_info * compptr,
|
|
||||||
JSAMPARRAY sample_data, JBLOCKROW coef_blocks,
|
|
||||||
JDIMENSION start_row, JDIMENSION start_col,
|
|
||||||
JDIMENSION num_blocks)
|
|
||||||
/* This version is used for floating-point DCT implementations. */
|
|
||||||
{
|
|
||||||
/* This routine is heavily used, so it's worth coding it tightly. */
|
|
||||||
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
|
||||||
float_DCT_method_ptr do_dct = fdct->do_float_dct[compptr->component_index];
|
|
||||||
FAST_FLOAT * divisors = (FAST_FLOAT *) compptr->dct_table;
|
|
||||||
FAST_FLOAT workspace[DCTSIZE2]; /* work area for FDCT subroutine */
|
|
||||||
JDIMENSION bi;
|
|
||||||
|
|
||||||
sample_data += start_row; /* fold in the vertical offset once */
|
|
||||||
|
|
||||||
for (bi = 0; bi < num_blocks; bi++, start_col += compptr->DCT_h_scaled_size) {
|
|
||||||
/* Perform the DCT */
|
|
||||||
(*do_dct) (workspace, sample_data, start_col);
|
|
||||||
|
|
||||||
/* Quantize/descale the coefficients, and store into coef_blocks[] */
|
|
||||||
{ register FAST_FLOAT temp;
|
|
||||||
register int i;
|
|
||||||
register JCOEFPTR output_ptr = coef_blocks[bi];
|
|
||||||
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
/* Apply the quantization and scaling factor */
|
|
||||||
temp = workspace[i] * divisors[i];
|
|
||||||
/* Round to nearest integer.
|
|
||||||
* Since C does not specify the direction of rounding for negative
|
|
||||||
* quotients, we have to force the dividend positive for portability.
|
|
||||||
* The maximum coefficient size is +-16K (for 12-bit data), so this
|
|
||||||
* code should work for either 16-bit or 32-bit ints.
|
|
||||||
*/
|
|
||||||
output_ptr[i] = (JCOEF) ((int) (temp + (FAST_FLOAT) 16384.5) - 16384);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* DCT_FLOAT_SUPPORTED */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize for a processing pass.
|
|
||||||
* Verify that all referenced Q-tables are present, and set up
|
|
||||||
* the divisor table for each one.
|
|
||||||
* In the current implementation, DCT of all components is done during
|
|
||||||
* the first pass, even if only some components will be output in the
|
|
||||||
* first scan. Hence all components should be examined here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
start_pass_fdctmgr (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_fdct_ptr fdct = (my_fdct_ptr) cinfo->fdct;
|
|
||||||
int ci, qtblno, i;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
int method = 0;
|
|
||||||
JQUANT_TBL * qtbl;
|
|
||||||
DCTELEM * dtbl;
|
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Select the proper DCT routine for this component's scaling */
|
|
||||||
switch ((compptr->DCT_h_scaled_size << 8) + compptr->DCT_v_scaled_size) {
|
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
|
||||||
case ((1 << 8) + 1):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_1x1;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((2 << 8) + 2):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_2x2;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((3 << 8) + 3):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_3x3;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((4 << 8) + 4):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_4x4;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((5 << 8) + 5):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_5x5;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((6 << 8) + 6):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_6x6;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((7 << 8) + 7):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_7x7;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((9 << 8) + 9):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_9x9;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((10 << 8) + 10):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_10x10;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((11 << 8) + 11):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_11x11;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((12 << 8) + 12):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_12x12;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((13 << 8) + 13):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_13x13;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((14 << 8) + 14):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_14x14;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((15 << 8) + 15):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_15x15;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((16 << 8) + 16):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_16x16;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((16 << 8) + 8):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_16x8;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((14 << 8) + 7):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_14x7;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((12 << 8) + 6):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_12x6;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((10 << 8) + 5):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_10x5;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((8 << 8) + 4):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_8x4;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((6 << 8) + 3):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_6x3;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((4 << 8) + 2):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_4x2;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((2 << 8) + 1):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_2x1;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((8 << 8) + 16):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_8x16;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((7 << 8) + 14):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_7x14;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((6 << 8) + 12):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_6x12;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((5 << 8) + 10):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_5x10;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((4 << 8) + 8):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_4x8;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((3 << 8) + 6):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_3x6;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((2 << 8) + 4):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_2x4;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
case ((1 << 8) + 2):
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_1x2;
|
|
||||||
method = JDCT_ISLOW; /* jfdctint uses islow-style table */
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
case ((DCTSIZE << 8) + DCTSIZE):
|
|
||||||
switch (cinfo->dct_method) {
|
|
||||||
#ifdef DCT_ISLOW_SUPPORTED
|
|
||||||
case JDCT_ISLOW:
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_islow;
|
|
||||||
method = JDCT_ISLOW;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
|
||||||
case JDCT_IFAST:
|
|
||||||
fdct->do_dct[ci] = jpeg_fdct_ifast;
|
|
||||||
method = JDCT_IFAST;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
case JDCT_FLOAT:
|
|
||||||
fdct->do_float_dct[ci] = jpeg_fdct_float;
|
|
||||||
method = JDCT_FLOAT;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT2(cinfo, JERR_BAD_DCTSIZE,
|
|
||||||
compptr->DCT_h_scaled_size, compptr->DCT_v_scaled_size);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
qtblno = compptr->quant_tbl_no;
|
|
||||||
/* Make sure specified quantization table is present */
|
|
||||||
if (qtblno < 0 || qtblno >= NUM_QUANT_TBLS ||
|
|
||||||
cinfo->quant_tbl_ptrs[qtblno] == NULL)
|
|
||||||
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, qtblno);
|
|
||||||
qtbl = cinfo->quant_tbl_ptrs[qtblno];
|
|
||||||
/* Create divisor table from quant table */
|
|
||||||
switch (method) {
|
|
||||||
#ifdef PROVIDE_ISLOW_TABLES
|
|
||||||
case JDCT_ISLOW:
|
|
||||||
/* For LL&M IDCT method, divisors are equal to raw quantization
|
|
||||||
* coefficients multiplied by 8 (to counteract scaling).
|
|
||||||
*/
|
|
||||||
dtbl = (DCTELEM *) compptr->dct_table;
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
dtbl[i] =
|
|
||||||
((DCTELEM) qtbl->quantval[i]) << (compptr->component_needed ? 4 : 3);
|
|
||||||
}
|
|
||||||
fdct->pub.forward_DCT[ci] = forward_DCT;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_IFAST_SUPPORTED
|
|
||||||
case JDCT_IFAST:
|
|
||||||
{
|
|
||||||
/* For AA&N IDCT method, divisors are equal to quantization
|
|
||||||
* coefficients scaled by scalefactor[row]*scalefactor[col], where
|
|
||||||
* scalefactor[0] = 1
|
|
||||||
* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
|
|
||||||
* We apply a further scale factor of 8.
|
|
||||||
*/
|
|
||||||
#define CONST_BITS 14
|
|
||||||
static const INT16 aanscales[DCTSIZE2] = {
|
|
||||||
/* precomputed values scaled up by 14 bits */
|
|
||||||
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
|
|
||||||
22725, 31521, 29692, 26722, 22725, 17855, 12299, 6270,
|
|
||||||
21407, 29692, 27969, 25172, 21407, 16819, 11585, 5906,
|
|
||||||
19266, 26722, 25172, 22654, 19266, 15137, 10426, 5315,
|
|
||||||
16384, 22725, 21407, 19266, 16384, 12873, 8867, 4520,
|
|
||||||
12873, 17855, 16819, 15137, 12873, 10114, 6967, 3552,
|
|
||||||
8867, 12299, 11585, 10426, 8867, 6967, 4799, 2446,
|
|
||||||
4520, 6270, 5906, 5315, 4520, 3552, 2446, 1247
|
|
||||||
};
|
|
||||||
SHIFT_TEMPS
|
|
||||||
|
|
||||||
dtbl = (DCTELEM *) compptr->dct_table;
|
|
||||||
for (i = 0; i < DCTSIZE2; i++) {
|
|
||||||
dtbl[i] = (DCTELEM)
|
|
||||||
DESCALE(MULTIPLY16V16((INT32) qtbl->quantval[i],
|
|
||||||
(INT32) aanscales[i]),
|
|
||||||
compptr->component_needed ? CONST_BITS-4 : CONST_BITS-3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fdct->pub.forward_DCT[ci] = forward_DCT;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
#ifdef DCT_FLOAT_SUPPORTED
|
|
||||||
case JDCT_FLOAT:
|
|
||||||
{
|
|
||||||
/* For float AA&N IDCT method, divisors are equal to quantization
|
|
||||||
* coefficients scaled by scalefactor[row]*scalefactor[col], where
|
|
||||||
* scalefactor[0] = 1
|
|
||||||
* scalefactor[k] = cos(k*PI/16) * sqrt(2) for k=1..7
|
|
||||||
* We apply a further scale factor of 8.
|
|
||||||
* What's actually stored is 1/divisor so that the inner loop can
|
|
||||||
* use a multiplication rather than a division.
|
|
||||||
*/
|
|
||||||
FAST_FLOAT * fdtbl = (FAST_FLOAT *) compptr->dct_table;
|
|
||||||
int row, col;
|
|
||||||
static const double aanscalefactor[DCTSIZE] = {
|
|
||||||
1.0, 1.387039845, 1.306562965, 1.175875602,
|
|
||||||
1.0, 0.785694958, 0.541196100, 0.275899379
|
|
||||||
};
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
for (row = 0; row < DCTSIZE; row++) {
|
|
||||||
for (col = 0; col < DCTSIZE; col++) {
|
|
||||||
fdtbl[i] = (FAST_FLOAT)
|
|
||||||
(1.0 / ((double) qtbl->quantval[i] *
|
|
||||||
aanscalefactor[row] * aanscalefactor[col] *
|
|
||||||
(compptr->component_needed ? 16.0 : 8.0)));
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fdct->pub.forward_DCT[ci] = forward_DCT_float;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize FDCT manager.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_forward_dct (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_fdct_ptr fdct;
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
fdct = (my_fdct_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_fdct_controller));
|
|
||||||
cinfo->fdct = &fdct->pub;
|
|
||||||
fdct->pub.start_pass = start_pass_fdctmgr;
|
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Allocate a divisor table for each component */
|
|
||||||
compptr->dct_table =
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(divisor_table));
|
|
||||||
}
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
@ -1,84 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcinit.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains initialization logic for the JPEG compressor.
|
|
||||||
* This routine is in charge of selecting the modules to be executed and
|
|
||||||
* making an initialization call to each one.
|
|
||||||
*
|
|
||||||
* Logically, this code belongs in jcmaster.c. It's split out because
|
|
||||||
* linking this routine implies linking the entire compression library.
|
|
||||||
* For a transcoding-only application, we want to be able to use jcmaster.c
|
|
||||||
* without linking in the whole library.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Master selection of compression modules.
|
|
||||||
* This is done once at the start of processing an image. We determine
|
|
||||||
* which modules will be used and give them appropriate initialization calls.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_compress_master (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
long samplesperrow;
|
|
||||||
JDIMENSION jd_samplesperrow;
|
|
||||||
|
|
||||||
/* For now, precision must match compiled-in value... */
|
|
||||||
if (cinfo->data_precision != BITS_IN_JSAMPLE)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
|
||||||
|
|
||||||
/* Sanity check on image dimensions */
|
|
||||||
if (cinfo->image_height <= 0 || cinfo->image_width <= 0 ||
|
|
||||||
cinfo->input_components <= 0)
|
|
||||||
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
|
||||||
|
|
||||||
/* Width of an input scanline must be representable as JDIMENSION. */
|
|
||||||
samplesperrow = (long) cinfo->image_width * (long) cinfo->input_components;
|
|
||||||
jd_samplesperrow = (JDIMENSION) samplesperrow;
|
|
||||||
if ((long) jd_samplesperrow != samplesperrow)
|
|
||||||
ERREXIT(cinfo, JERR_WIDTH_OVERFLOW);
|
|
||||||
|
|
||||||
/* Initialize master control (includes parameter checking/processing) */
|
|
||||||
jinit_c_master_control(cinfo, FALSE /* full compression */);
|
|
||||||
|
|
||||||
/* Preprocessing */
|
|
||||||
if (! cinfo->raw_data_in) {
|
|
||||||
jinit_color_converter(cinfo);
|
|
||||||
jinit_downsampler(cinfo);
|
|
||||||
jinit_c_prep_controller(cinfo, FALSE /* never need full buffer here */);
|
|
||||||
}
|
|
||||||
/* Forward DCT */
|
|
||||||
jinit_forward_dct(cinfo);
|
|
||||||
/* Entropy encoding: either Huffman or arithmetic coding. */
|
|
||||||
if (cinfo->arith_code)
|
|
||||||
jinit_arith_encoder(cinfo);
|
|
||||||
else {
|
|
||||||
jinit_huff_encoder(cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Need a full-image coefficient buffer in any multi-pass mode. */
|
|
||||||
jinit_c_coef_controller(cinfo,
|
|
||||||
(boolean) (cinfo->num_scans > 1 || cinfo->optimize_coding));
|
|
||||||
jinit_c_main_controller(cinfo, FALSE /* never need full buffer here */);
|
|
||||||
|
|
||||||
jinit_marker_writer(cinfo);
|
|
||||||
|
|
||||||
/* We can now tell the memory manager to allocate virtual arrays. */
|
|
||||||
(*cinfo->mem->realize_virt_arrays) ((j_common_ptr) cinfo);
|
|
||||||
|
|
||||||
/* Write the datastream header (SOI) immediately.
|
|
||||||
* Frame and scan headers are postponed till later.
|
|
||||||
* This lets application insert special markers after the SOI.
|
|
||||||
*/
|
|
||||||
(*cinfo->marker->write_file_header) (cinfo);
|
|
||||||
}
|
|
@ -1,297 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcmainct.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1996, Thomas G. Lane.
|
|
||||||
* Modified 2003-2012 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains the main buffer controller for compression.
|
|
||||||
* The main buffer lies between the pre-processor and the JPEG
|
|
||||||
* compressor proper; it holds downsampled data in the JPEG colorspace.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Note: currently, there is no operating mode in which a full-image buffer
|
|
||||||
* is needed at this step. If there were, that mode could not be used with
|
|
||||||
* "raw data" input, since this module is bypassed in that case. However,
|
|
||||||
* we've left the code here for possible use in special applications.
|
|
||||||
*/
|
|
||||||
#undef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
|
|
||||||
|
|
||||||
/* Private buffer controller object */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_c_main_controller pub; /* public fields */
|
|
||||||
|
|
||||||
JDIMENSION cur_iMCU_row; /* number of current iMCU row */
|
|
||||||
JDIMENSION rowgroup_ctr; /* counts row groups received in iMCU row */
|
|
||||||
boolean suspended; /* remember if we suspended output */
|
|
||||||
J_BUF_MODE pass_mode; /* current operating mode */
|
|
||||||
|
|
||||||
/* If using just a strip buffer, this points to the entire set of buffers
|
|
||||||
* (we allocate one for each component). In the full-image case, this
|
|
||||||
* points to the currently accessible strips of the virtual arrays.
|
|
||||||
*/
|
|
||||||
JSAMPARRAY buffer[MAX_COMPONENTS];
|
|
||||||
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
/* If using full-image storage, this array holds pointers to virtual-array
|
|
||||||
* control blocks for each component. Unused if not full-image storage.
|
|
||||||
*/
|
|
||||||
jvirt_sarray_ptr whole_image[MAX_COMPONENTS];
|
|
||||||
#endif
|
|
||||||
} my_main_controller;
|
|
||||||
|
|
||||||
typedef my_main_controller * my_main_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/* Forward declarations */
|
|
||||||
METHODDEF(void) process_data_simple_main
|
|
||||||
JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|
||||||
JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
METHODDEF(void) process_data_buffer_main
|
|
||||||
JPP((j_compress_ptr cinfo, JSAMPARRAY input_buf,
|
|
||||||
JDIMENSION *in_row_ctr, JDIMENSION in_rows_avail));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize for a processing pass.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
start_pass_main (j_compress_ptr cinfo, J_BUF_MODE pass_mode)
|
|
||||||
{
|
|
||||||
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
|
||||||
|
|
||||||
/* Do nothing in raw-data mode. */
|
|
||||||
if (cinfo->raw_data_in)
|
|
||||||
return;
|
|
||||||
|
|
||||||
mainp->cur_iMCU_row = 0; /* initialize counters */
|
|
||||||
mainp->rowgroup_ctr = 0;
|
|
||||||
mainp->suspended = FALSE;
|
|
||||||
mainp->pass_mode = pass_mode; /* save mode for use by process_data */
|
|
||||||
|
|
||||||
switch (pass_mode) {
|
|
||||||
case JBUF_PASS_THRU:
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
if (mainp->whole_image[0] != NULL)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
#endif
|
|
||||||
mainp->pub.process_data = process_data_simple_main;
|
|
||||||
break;
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
case JBUF_SAVE_SOURCE:
|
|
||||||
case JBUF_CRANK_DEST:
|
|
||||||
case JBUF_SAVE_AND_PASS:
|
|
||||||
if (mainp->whole_image[0] == NULL)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
mainp->pub.process_data = process_data_buffer_main;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process some data.
|
|
||||||
* This routine handles the simple pass-through mode,
|
|
||||||
* where we have only a strip buffer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
process_data_simple_main (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
|
||||||
JDIMENSION in_rows_avail)
|
|
||||||
{
|
|
||||||
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
|
||||||
|
|
||||||
while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
|
||||||
/* Read input data if we haven't filled the main buffer yet */
|
|
||||||
if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
|
||||||
(*cinfo->prep->pre_process_data) (cinfo,
|
|
||||||
input_buf, in_row_ctr, in_rows_avail,
|
|
||||||
mainp->buffer, &mainp->rowgroup_ctr,
|
|
||||||
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
|
|
||||||
|
|
||||||
/* If we don't have a full iMCU row buffered, return to application for
|
|
||||||
* more data. Note that preprocessor will always pad to fill the iMCU row
|
|
||||||
* at the bottom of the image.
|
|
||||||
*/
|
|
||||||
if (mainp->rowgroup_ctr != (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Send the completed row to the compressor */
|
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
|
|
||||||
/* If compressor did not consume the whole row, then we must need to
|
|
||||||
* suspend processing and return to the application. In this situation
|
|
||||||
* we pretend we didn't yet consume the last input row; otherwise, if
|
|
||||||
* it happened to be the last row of the image, the application would
|
|
||||||
* think we were done.
|
|
||||||
*/
|
|
||||||
if (! mainp->suspended) {
|
|
||||||
(*in_row_ctr)--;
|
|
||||||
mainp->suspended = TRUE;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* We did finish the row. Undo our little suspension hack if a previous
|
|
||||||
* call suspended; then mark the main buffer empty.
|
|
||||||
*/
|
|
||||||
if (mainp->suspended) {
|
|
||||||
(*in_row_ctr)++;
|
|
||||||
mainp->suspended = FALSE;
|
|
||||||
}
|
|
||||||
mainp->rowgroup_ctr = 0;
|
|
||||||
mainp->cur_iMCU_row++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Process some data.
|
|
||||||
* This routine handles all of the modes that use a full-size buffer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
process_data_buffer_main (j_compress_ptr cinfo,
|
|
||||||
JSAMPARRAY input_buf, JDIMENSION *in_row_ctr,
|
|
||||||
JDIMENSION in_rows_avail)
|
|
||||||
{
|
|
||||||
my_main_ptr mainp = (my_main_ptr) cinfo->main;
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
boolean writing = (mainp->pass_mode != JBUF_CRANK_DEST);
|
|
||||||
|
|
||||||
while (mainp->cur_iMCU_row < cinfo->total_iMCU_rows) {
|
|
||||||
/* Realign the virtual buffers if at the start of an iMCU row. */
|
|
||||||
if (mainp->rowgroup_ctr == 0) {
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
mainp->buffer[ci] = (*cinfo->mem->access_virt_sarray)
|
|
||||||
((j_common_ptr) cinfo, mainp->whole_image[ci], mainp->cur_iMCU_row *
|
|
||||||
((JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size)),
|
|
||||||
(JDIMENSION) (compptr->v_samp_factor * cinfo->min_DCT_v_scaled_size),
|
|
||||||
writing);
|
|
||||||
}
|
|
||||||
/* In a read pass, pretend we just read some source data. */
|
|
||||||
if (! writing) {
|
|
||||||
*in_row_ctr += (JDIMENSION)
|
|
||||||
(cinfo->max_v_samp_factor * cinfo->min_DCT_v_scaled_size);
|
|
||||||
mainp->rowgroup_ctr = (JDIMENSION) cinfo->min_DCT_v_scaled_size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If a write pass, read input data until the current iMCU row is full. */
|
|
||||||
/* Note: preprocessor will pad if necessary to fill the last iMCU row. */
|
|
||||||
if (writing) {
|
|
||||||
(*cinfo->prep->pre_process_data) (cinfo,
|
|
||||||
input_buf, in_row_ctr, in_rows_avail,
|
|
||||||
mainp->buffer, &mainp->rowgroup_ctr,
|
|
||||||
(JDIMENSION) cinfo->min_DCT_v_scaled_size);
|
|
||||||
/* Return to application if we need more data to fill the iMCU row. */
|
|
||||||
if (mainp->rowgroup_ctr < (JDIMENSION) cinfo->min_DCT_v_scaled_size)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Emit data, unless this is a sink-only pass. */
|
|
||||||
if (mainp->pass_mode != JBUF_SAVE_SOURCE) {
|
|
||||||
if (! (*cinfo->coef->compress_data) (cinfo, mainp->buffer)) {
|
|
||||||
/* If compressor did not consume the whole row, then we must need to
|
|
||||||
* suspend processing and return to the application. In this situation
|
|
||||||
* we pretend we didn't yet consume the last input row; otherwise, if
|
|
||||||
* it happened to be the last row of the image, the application would
|
|
||||||
* think we were done.
|
|
||||||
*/
|
|
||||||
if (! mainp->suspended) {
|
|
||||||
(*in_row_ctr)--;
|
|
||||||
mainp->suspended = TRUE;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* We did finish the row. Undo our little suspension hack if a previous
|
|
||||||
* call suspended; then mark the main buffer empty.
|
|
||||||
*/
|
|
||||||
if (mainp->suspended) {
|
|
||||||
(*in_row_ctr)++;
|
|
||||||
mainp->suspended = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If get here, we are done with this iMCU row. Mark buffer empty. */
|
|
||||||
mainp->rowgroup_ctr = 0;
|
|
||||||
mainp->cur_iMCU_row++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* FULL_MAIN_BUFFER_SUPPORTED */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize main buffer controller.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_c_main_controller (j_compress_ptr cinfo, boolean need_full_buffer)
|
|
||||||
{
|
|
||||||
my_main_ptr mainp;
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
mainp = (my_main_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_main_controller));
|
|
||||||
cinfo->main = &mainp->pub;
|
|
||||||
mainp->pub.start_pass = start_pass_main;
|
|
||||||
|
|
||||||
/* We don't need to create a buffer in raw-data mode. */
|
|
||||||
if (cinfo->raw_data_in)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Create the buffer. It holds downsampled data, so each component
|
|
||||||
* may be of a different size.
|
|
||||||
*/
|
|
||||||
if (need_full_buffer) {
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
/* Allocate a full-image virtual array for each component */
|
|
||||||
/* Note we pad the bottom to a multiple of the iMCU height */
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
mainp->whole_image[ci] = (*cinfo->mem->request_virt_sarray)
|
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE, FALSE,
|
|
||||||
compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
|
|
||||||
((JDIMENSION) jround_up((long) compptr->height_in_blocks,
|
|
||||||
(long) compptr->v_samp_factor)) *
|
|
||||||
((JDIMENSION) cinfo->min_DCT_v_scaled_size),
|
|
||||||
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_BAD_BUFFER_MODE);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
#ifdef FULL_MAIN_BUFFER_SUPPORTED
|
|
||||||
mainp->whole_image[0] = NULL; /* flag for no virtual arrays */
|
|
||||||
#endif
|
|
||||||
/* Allocate a strip buffer for each component */
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
mainp->buffer[ci] = (*cinfo->mem->alloc_sarray)
|
|
||||||
((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
compptr->width_in_blocks * ((JDIMENSION) compptr->DCT_h_scaled_size),
|
|
||||||
(JDIMENSION) (compptr->v_samp_factor * compptr->DCT_v_scaled_size));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,719 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcmarker.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1998, Thomas G. Lane.
|
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains routines to write JPEG datastream markers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum { /* JPEG marker codes */
|
|
||||||
M_SOF0 = 0xc0,
|
|
||||||
M_SOF1 = 0xc1,
|
|
||||||
M_SOF2 = 0xc2,
|
|
||||||
M_SOF3 = 0xc3,
|
|
||||||
|
|
||||||
M_SOF5 = 0xc5,
|
|
||||||
M_SOF6 = 0xc6,
|
|
||||||
M_SOF7 = 0xc7,
|
|
||||||
|
|
||||||
M_JPG = 0xc8,
|
|
||||||
M_SOF9 = 0xc9,
|
|
||||||
M_SOF10 = 0xca,
|
|
||||||
M_SOF11 = 0xcb,
|
|
||||||
|
|
||||||
M_SOF13 = 0xcd,
|
|
||||||
M_SOF14 = 0xce,
|
|
||||||
M_SOF15 = 0xcf,
|
|
||||||
|
|
||||||
M_DHT = 0xc4,
|
|
||||||
|
|
||||||
M_DAC = 0xcc,
|
|
||||||
|
|
||||||
M_RST0 = 0xd0,
|
|
||||||
M_RST1 = 0xd1,
|
|
||||||
M_RST2 = 0xd2,
|
|
||||||
M_RST3 = 0xd3,
|
|
||||||
M_RST4 = 0xd4,
|
|
||||||
M_RST5 = 0xd5,
|
|
||||||
M_RST6 = 0xd6,
|
|
||||||
M_RST7 = 0xd7,
|
|
||||||
|
|
||||||
M_SOI = 0xd8,
|
|
||||||
M_EOI = 0xd9,
|
|
||||||
M_SOS = 0xda,
|
|
||||||
M_DQT = 0xdb,
|
|
||||||
M_DNL = 0xdc,
|
|
||||||
M_DRI = 0xdd,
|
|
||||||
M_DHP = 0xde,
|
|
||||||
M_EXP = 0xdf,
|
|
||||||
|
|
||||||
M_APP0 = 0xe0,
|
|
||||||
M_APP1 = 0xe1,
|
|
||||||
M_APP2 = 0xe2,
|
|
||||||
M_APP3 = 0xe3,
|
|
||||||
M_APP4 = 0xe4,
|
|
||||||
M_APP5 = 0xe5,
|
|
||||||
M_APP6 = 0xe6,
|
|
||||||
M_APP7 = 0xe7,
|
|
||||||
M_APP8 = 0xe8,
|
|
||||||
M_APP9 = 0xe9,
|
|
||||||
M_APP10 = 0xea,
|
|
||||||
M_APP11 = 0xeb,
|
|
||||||
M_APP12 = 0xec,
|
|
||||||
M_APP13 = 0xed,
|
|
||||||
M_APP14 = 0xee,
|
|
||||||
M_APP15 = 0xef,
|
|
||||||
|
|
||||||
M_JPG0 = 0xf0,
|
|
||||||
M_JPG8 = 0xf8,
|
|
||||||
M_JPG13 = 0xfd,
|
|
||||||
M_COM = 0xfe,
|
|
||||||
|
|
||||||
M_TEM = 0x01,
|
|
||||||
|
|
||||||
M_ERROR = 0x100
|
|
||||||
} JPEG_MARKER;
|
|
||||||
|
|
||||||
|
|
||||||
/* Private state */
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_marker_writer pub; /* public fields */
|
|
||||||
|
|
||||||
unsigned int last_restart_interval; /* last DRI value emitted; 0 after SOI */
|
|
||||||
} my_marker_writer;
|
|
||||||
|
|
||||||
typedef my_marker_writer * my_marker_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Basic output routines.
|
|
||||||
*
|
|
||||||
* Note that we do not support suspension while writing a marker.
|
|
||||||
* Therefore, an application using suspension must ensure that there is
|
|
||||||
* enough buffer space for the initial markers (typ. 600-700 bytes) before
|
|
||||||
* calling jpeg_start_compress, and enough space to write the trailing EOI
|
|
||||||
* (a few bytes) before calling jpeg_finish_compress. Multipass compression
|
|
||||||
* modes are not supported at all with suspension, so those two are the only
|
|
||||||
* points where markers will be written.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_byte (j_compress_ptr cinfo, int val)
|
|
||||||
/* Emit a byte */
|
|
||||||
{
|
|
||||||
struct jpeg_destination_mgr * dest = cinfo->dest;
|
|
||||||
|
|
||||||
*(dest->next_output_byte)++ = (JOCTET) val;
|
|
||||||
if (--dest->free_in_buffer == 0) {
|
|
||||||
if (! (*dest->empty_output_buffer) (cinfo))
|
|
||||||
ERREXIT(cinfo, JERR_CANT_SUSPEND);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_marker (j_compress_ptr cinfo, JPEG_MARKER mark)
|
|
||||||
/* Emit a marker code */
|
|
||||||
{
|
|
||||||
emit_byte(cinfo, 0xFF);
|
|
||||||
emit_byte(cinfo, (int) mark);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_2bytes (j_compress_ptr cinfo, int value)
|
|
||||||
/* Emit a 2-byte integer; these are always MSB first in JPEG files */
|
|
||||||
{
|
|
||||||
emit_byte(cinfo, (value >> 8) & 0xFF);
|
|
||||||
emit_byte(cinfo, value & 0xFF);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Routines to write specific marker types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
LOCAL(int)
|
|
||||||
emit_dqt (j_compress_ptr cinfo, int index)
|
|
||||||
/* Emit a DQT marker */
|
|
||||||
/* Returns the precision used (0 = 8bits, 1 = 16bits) for baseline checking */
|
|
||||||
{
|
|
||||||
JQUANT_TBL * qtbl = cinfo->quant_tbl_ptrs[index];
|
|
||||||
int prec;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (qtbl == NULL)
|
|
||||||
ERREXIT1(cinfo, JERR_NO_QUANT_TABLE, index);
|
|
||||||
|
|
||||||
prec = 0;
|
|
||||||
for (i = 0; i <= cinfo->lim_Se; i++) {
|
|
||||||
if (qtbl->quantval[cinfo->natural_order[i]] > 255)
|
|
||||||
prec = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! qtbl->sent_table) {
|
|
||||||
emit_marker(cinfo, M_DQT);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo,
|
|
||||||
prec ? cinfo->lim_Se * 2 + 2 + 1 + 2 : cinfo->lim_Se + 1 + 1 + 2);
|
|
||||||
|
|
||||||
emit_byte(cinfo, index + (prec<<4));
|
|
||||||
|
|
||||||
for (i = 0; i <= cinfo->lim_Se; i++) {
|
|
||||||
/* The table entries must be emitted in zigzag order. */
|
|
||||||
unsigned int qval = qtbl->quantval[cinfo->natural_order[i]];
|
|
||||||
if (prec)
|
|
||||||
emit_byte(cinfo, (int) (qval >> 8));
|
|
||||||
emit_byte(cinfo, (int) (qval & 0xFF));
|
|
||||||
}
|
|
||||||
|
|
||||||
qtbl->sent_table = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return prec;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_dht (j_compress_ptr cinfo, int index, boolean is_ac)
|
|
||||||
/* Emit a DHT marker */
|
|
||||||
{
|
|
||||||
JHUFF_TBL * htbl;
|
|
||||||
int length, i;
|
|
||||||
|
|
||||||
if (is_ac) {
|
|
||||||
htbl = cinfo->ac_huff_tbl_ptrs[index];
|
|
||||||
index += 0x10; /* output index has AC bit set */
|
|
||||||
} else {
|
|
||||||
htbl = cinfo->dc_huff_tbl_ptrs[index];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (htbl == NULL)
|
|
||||||
ERREXIT1(cinfo, JERR_NO_HUFF_TABLE, index);
|
|
||||||
|
|
||||||
if (! htbl->sent_table) {
|
|
||||||
emit_marker(cinfo, M_DHT);
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
for (i = 1; i <= 16; i++)
|
|
||||||
length += htbl->bits[i];
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, length + 2 + 1 + 16);
|
|
||||||
emit_byte(cinfo, index);
|
|
||||||
|
|
||||||
for (i = 1; i <= 16; i++)
|
|
||||||
emit_byte(cinfo, htbl->bits[i]);
|
|
||||||
|
|
||||||
for (i = 0; i < length; i++)
|
|
||||||
emit_byte(cinfo, htbl->huffval[i]);
|
|
||||||
|
|
||||||
htbl->sent_table = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_dac (j_compress_ptr cinfo)
|
|
||||||
/* Emit a DAC marker */
|
|
||||||
/* Since the useful info is so small, we want to emit all the tables in */
|
|
||||||
/* one DAC marker. Therefore this routine does its own scan of the table. */
|
|
||||||
{
|
|
||||||
#ifdef C_ARITH_CODING_SUPPORTED
|
|
||||||
char dc_in_use[NUM_ARITH_TBLS];
|
|
||||||
char ac_in_use[NUM_ARITH_TBLS];
|
|
||||||
int length, i;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_ARITH_TBLS; i++)
|
|
||||||
dc_in_use[i] = ac_in_use[i] = 0;
|
|
||||||
|
|
||||||
for (i = 0; i < cinfo->comps_in_scan; 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;
|
|
||||||
/* AC needs no table when not present */
|
|
||||||
if (cinfo->Se)
|
|
||||||
ac_in_use[compptr->ac_tbl_no] = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
for (i = 0; i < NUM_ARITH_TBLS; i++)
|
|
||||||
length += dc_in_use[i] + ac_in_use[i];
|
|
||||||
|
|
||||||
if (length) {
|
|
||||||
emit_marker(cinfo, M_DAC);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, length*2 + 2);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_ARITH_TBLS; i++) {
|
|
||||||
if (dc_in_use[i]) {
|
|
||||||
emit_byte(cinfo, i);
|
|
||||||
emit_byte(cinfo, cinfo->arith_dc_L[i] + (cinfo->arith_dc_U[i]<<4));
|
|
||||||
}
|
|
||||||
if (ac_in_use[i]) {
|
|
||||||
emit_byte(cinfo, i + 0x10);
|
|
||||||
emit_byte(cinfo, cinfo->arith_ac_K[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* C_ARITH_CODING_SUPPORTED */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_dri (j_compress_ptr cinfo)
|
|
||||||
/* Emit a DRI marker */
|
|
||||||
{
|
|
||||||
emit_marker(cinfo, M_DRI);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 4); /* fixed length */
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, (int) cinfo->restart_interval);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_lse_ict (j_compress_ptr cinfo)
|
|
||||||
/* Emit an LSE inverse color transform specification marker */
|
|
||||||
{
|
|
||||||
/* Support only 1 transform */
|
|
||||||
if (cinfo->color_transform != JCT_SUBTRACT_GREEN ||
|
|
||||||
cinfo->num_components < 3)
|
|
||||||
ERREXIT(cinfo, JERR_CONVERSION_NOTIMPL);
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_JPG8);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 24); /* fixed length */
|
|
||||||
|
|
||||||
emit_byte(cinfo, 0x0D); /* ID inverse transform specification */
|
|
||||||
emit_2bytes(cinfo, MAXJSAMPLE); /* MAXTRANS */
|
|
||||||
emit_byte(cinfo, 3); /* Nt=3 */
|
|
||||||
emit_byte(cinfo, cinfo->comp_info[1].component_id);
|
|
||||||
emit_byte(cinfo, cinfo->comp_info[0].component_id);
|
|
||||||
emit_byte(cinfo, cinfo->comp_info[2].component_id);
|
|
||||||
emit_byte(cinfo, 0x80); /* F1: CENTER1=1, NORM1=0 */
|
|
||||||
emit_2bytes(cinfo, 0); /* A(1,1)=0 */
|
|
||||||
emit_2bytes(cinfo, 0); /* A(1,2)=0 */
|
|
||||||
emit_byte(cinfo, 0); /* F2: CENTER2=0, NORM2=0 */
|
|
||||||
emit_2bytes(cinfo, 1); /* A(2,1)=1 */
|
|
||||||
emit_2bytes(cinfo, 0); /* A(2,2)=0 */
|
|
||||||
emit_byte(cinfo, 0); /* F3: CENTER3=0, NORM3=0 */
|
|
||||||
emit_2bytes(cinfo, 1); /* A(3,1)=1 */
|
|
||||||
emit_2bytes(cinfo, 0); /* A(3,2)=0 */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_sof (j_compress_ptr cinfo, JPEG_MARKER code)
|
|
||||||
/* Emit a SOF marker */
|
|
||||||
{
|
|
||||||
int ci;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
emit_marker(cinfo, code);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 3 * cinfo->num_components + 2 + 5 + 1); /* length */
|
|
||||||
|
|
||||||
/* Make sure image isn't bigger than SOF field can handle */
|
|
||||||
if ((long) cinfo->jpeg_height > 65535L ||
|
|
||||||
(long) cinfo->jpeg_width > 65535L)
|
|
||||||
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) 65535);
|
|
||||||
|
|
||||||
emit_byte(cinfo, cinfo->data_precision);
|
|
||||||
emit_2bytes(cinfo, (int) cinfo->jpeg_height);
|
|
||||||
emit_2bytes(cinfo, (int) cinfo->jpeg_width);
|
|
||||||
|
|
||||||
emit_byte(cinfo, cinfo->num_components);
|
|
||||||
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
emit_byte(cinfo, compptr->component_id);
|
|
||||||
emit_byte(cinfo, (compptr->h_samp_factor << 4) + compptr->v_samp_factor);
|
|
||||||
emit_byte(cinfo, compptr->quant_tbl_no);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_sos (j_compress_ptr cinfo)
|
|
||||||
/* Emit a SOS marker */
|
|
||||||
{
|
|
||||||
int i, td, ta;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_SOS);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 2 * cinfo->comps_in_scan + 2 + 1 + 3); /* length */
|
|
||||||
|
|
||||||
emit_byte(cinfo, cinfo->comps_in_scan);
|
|
||||||
|
|
||||||
for (i = 0; i < cinfo->comps_in_scan; i++) {
|
|
||||||
compptr = cinfo->cur_comp_info[i];
|
|
||||||
emit_byte(cinfo, compptr->component_id);
|
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* DC needs no table for refinement scan */
|
|
||||||
td = cinfo->Ss == 0 && cinfo->Ah == 0 ? compptr->dc_tbl_no : 0;
|
|
||||||
/* AC needs no table when not present */
|
|
||||||
ta = cinfo->Se ? compptr->ac_tbl_no : 0;
|
|
||||||
|
|
||||||
emit_byte(cinfo, (td << 4) + ta);
|
|
||||||
}
|
|
||||||
|
|
||||||
emit_byte(cinfo, cinfo->Ss);
|
|
||||||
emit_byte(cinfo, cinfo->Se);
|
|
||||||
emit_byte(cinfo, (cinfo->Ah << 4) + cinfo->Al);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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)
|
|
||||||
emit_jfif_app0 (j_compress_ptr cinfo)
|
|
||||||
/* Emit a JFIF-compliant APP0 marker */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Length of APP0 block (2 bytes)
|
|
||||||
* Block ID (4 bytes - ASCII "JFIF")
|
|
||||||
* Zero byte (1 byte to terminate the ID string)
|
|
||||||
* Version Major, Minor (2 bytes - major first)
|
|
||||||
* Units (1 byte - 0x00 = none, 0x01 = inch, 0x02 = cm)
|
|
||||||
* Xdpu (2 bytes - dots per unit horizontal)
|
|
||||||
* Ydpu (2 bytes - dots per unit vertical)
|
|
||||||
* Thumbnail X size (1 byte)
|
|
||||||
* Thumbnail Y size (1 byte)
|
|
||||||
*/
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_APP0);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 2 + 4 + 1 + 2 + 1 + 2 + 2 + 1 + 1); /* length */
|
|
||||||
|
|
||||||
emit_byte(cinfo, 0x4A); /* Identifier: ASCII "JFIF" */
|
|
||||||
emit_byte(cinfo, 0x46);
|
|
||||||
emit_byte(cinfo, 0x49);
|
|
||||||
emit_byte(cinfo, 0x46);
|
|
||||||
emit_byte(cinfo, 0);
|
|
||||||
emit_byte(cinfo, cinfo->JFIF_major_version); /* Version fields */
|
|
||||||
emit_byte(cinfo, cinfo->JFIF_minor_version);
|
|
||||||
emit_byte(cinfo, cinfo->density_unit); /* Pixel size information */
|
|
||||||
emit_2bytes(cinfo, (int) cinfo->X_density);
|
|
||||||
emit_2bytes(cinfo, (int) cinfo->Y_density);
|
|
||||||
emit_byte(cinfo, 0); /* No thumbnail image */
|
|
||||||
emit_byte(cinfo, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
emit_adobe_app14 (j_compress_ptr cinfo)
|
|
||||||
/* Emit an Adobe APP14 marker */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Length of APP14 block (2 bytes)
|
|
||||||
* Block ID (5 bytes - ASCII "Adobe")
|
|
||||||
* Version Number (2 bytes - currently 100)
|
|
||||||
* Flags0 (2 bytes - currently 0)
|
|
||||||
* Flags1 (2 bytes - currently 0)
|
|
||||||
* Color transform (1 byte)
|
|
||||||
*
|
|
||||||
* Although Adobe TN 5116 mentions Version = 101, all the Adobe files
|
|
||||||
* now in circulation seem to use Version = 100, so that's what we write.
|
|
||||||
*
|
|
||||||
* We write the color transform byte as 1 if the JPEG color space is
|
|
||||||
* YCbCr, 2 if it's YCCK, 0 otherwise. Adobe's definition has to do with
|
|
||||||
* whether the encoder performed a transformation, which is pretty useless.
|
|
||||||
*/
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_APP14);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, 2 + 5 + 2 + 2 + 2 + 1); /* length */
|
|
||||||
|
|
||||||
emit_byte(cinfo, 0x41); /* Identifier: ASCII "Adobe" */
|
|
||||||
emit_byte(cinfo, 0x64);
|
|
||||||
emit_byte(cinfo, 0x6F);
|
|
||||||
emit_byte(cinfo, 0x62);
|
|
||||||
emit_byte(cinfo, 0x65);
|
|
||||||
emit_2bytes(cinfo, 100); /* Version */
|
|
||||||
emit_2bytes(cinfo, 0); /* Flags0 */
|
|
||||||
emit_2bytes(cinfo, 0); /* Flags1 */
|
|
||||||
switch (cinfo->jpeg_color_space) {
|
|
||||||
case JCS_YCbCr:
|
|
||||||
emit_byte(cinfo, 1); /* Color transform = 1 */
|
|
||||||
break;
|
|
||||||
case JCS_YCCK:
|
|
||||||
emit_byte(cinfo, 2); /* Color transform = 2 */
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
emit_byte(cinfo, 0); /* Color transform = 0 */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* These routines allow writing an arbitrary marker with parameters.
|
|
||||||
* The only intended use is to emit COM or APPn markers after calling
|
|
||||||
* write_file_header and before calling write_frame_header.
|
|
||||||
* Other uses are not guaranteed to produce desirable results.
|
|
||||||
* Counting the parameter bytes properly is the caller's responsibility.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_marker_header (j_compress_ptr cinfo, int marker, unsigned int datalen)
|
|
||||||
/* Emit an arbitrary marker header */
|
|
||||||
{
|
|
||||||
if (datalen > (unsigned int) 65533) /* safety check */
|
|
||||||
ERREXIT(cinfo, JERR_BAD_LENGTH);
|
|
||||||
|
|
||||||
emit_marker(cinfo, (JPEG_MARKER) marker);
|
|
||||||
|
|
||||||
emit_2bytes(cinfo, (int) (datalen + 2)); /* total length */
|
|
||||||
}
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_marker_byte (j_compress_ptr cinfo, int val)
|
|
||||||
/* Emit one byte of marker parameters following write_marker_header */
|
|
||||||
{
|
|
||||||
emit_byte(cinfo, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write datastream header.
|
|
||||||
* This consists of an SOI and optional APPn markers.
|
|
||||||
* We recommend use of the JFIF marker, but not the Adobe marker,
|
|
||||||
* when using YCbCr or grayscale data. The JFIF marker is also used
|
|
||||||
* for other standard JPEG colorspaces. The Adobe marker is helpful
|
|
||||||
* to distinguish RGB, CMYK, and YCCK colorspaces.
|
|
||||||
* Note that an application can write additional header markers after
|
|
||||||
* jpeg_start_compress returns.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_file_header (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_SOI); /* first the SOI */
|
|
||||||
|
|
||||||
/* SOI is defined to reset restart interval to 0 */
|
|
||||||
marker->last_restart_interval = 0;
|
|
||||||
|
|
||||||
if (cinfo->write_JFIF_header) /* next an optional JFIF APP0 */
|
|
||||||
emit_jfif_app0(cinfo);
|
|
||||||
if (cinfo->write_Adobe_marker) /* next an optional Adobe APP14 */
|
|
||||||
emit_adobe_app14(cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write frame header.
|
|
||||||
* This consists of DQT and SOFn markers,
|
|
||||||
* a conditional LSE marker and a conditional pseudo SOS marker.
|
|
||||||
* Note that we do not emit the SOF until we have emitted the DQT(s).
|
|
||||||
* This avoids compatibility problems with incorrect implementations that
|
|
||||||
* try to error-check the quant table numbers as soon as they see the SOF.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_frame_header (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
int ci, prec;
|
|
||||||
boolean is_baseline;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
/* Emit DQT for each quantization table.
|
|
||||||
* Note that emit_dqt() suppresses any duplicate tables.
|
|
||||||
*/
|
|
||||||
prec = 0;
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
prec += emit_dqt(cinfo, compptr->quant_tbl_no);
|
|
||||||
}
|
|
||||||
/* now prec is nonzero iff there are any 16-bit quant tables. */
|
|
||||||
|
|
||||||
/* Check for a non-baseline specification.
|
|
||||||
* Note we assume that Huffman table numbers won't be changed later.
|
|
||||||
*/
|
|
||||||
if (cinfo->arith_code || cinfo->progressive_mode ||
|
|
||||||
cinfo->data_precision != 8 || cinfo->block_size != DCTSIZE) {
|
|
||||||
is_baseline = FALSE;
|
|
||||||
} else {
|
|
||||||
is_baseline = TRUE;
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
if (compptr->dc_tbl_no > 1 || compptr->ac_tbl_no > 1)
|
|
||||||
is_baseline = FALSE;
|
|
||||||
}
|
|
||||||
if (prec && is_baseline) {
|
|
||||||
is_baseline = FALSE;
|
|
||||||
/* If it's baseline except for quantizer size, warn the user */
|
|
||||||
TRACEMS(cinfo, 0, JTRC_16BIT_TABLES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Emit the proper SOF marker */
|
|
||||||
if (cinfo->arith_code) {
|
|
||||||
if (cinfo->progressive_mode)
|
|
||||||
emit_sof(cinfo, M_SOF10); /* SOF code for progressive arithmetic */
|
|
||||||
else
|
|
||||||
emit_sof(cinfo, M_SOF9); /* SOF code for sequential arithmetic */
|
|
||||||
} else {
|
|
||||||
if (cinfo->progressive_mode)
|
|
||||||
emit_sof(cinfo, M_SOF2); /* SOF code for progressive Huffman */
|
|
||||||
else if (is_baseline)
|
|
||||||
emit_sof(cinfo, M_SOF0); /* SOF code for baseline implementation */
|
|
||||||
else
|
|
||||||
emit_sof(cinfo, M_SOF1); /* SOF code for non-baseline Huffman file */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check to emit LSE inverse color transform specification marker */
|
|
||||||
if (cinfo->color_transform)
|
|
||||||
emit_lse_ict(cinfo);
|
|
||||||
|
|
||||||
/* Check to emit pseudo SOS marker */
|
|
||||||
if (cinfo->progressive_mode && cinfo->block_size != DCTSIZE)
|
|
||||||
emit_pseudo_sos(cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write scan header.
|
|
||||||
* This consists of DHT or DAC markers, optional DRI, and SOS.
|
|
||||||
* Compressed data will be written following the SOS.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_scan_header (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_marker_ptr marker = (my_marker_ptr) cinfo->marker;
|
|
||||||
int i;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
if (cinfo->arith_code) {
|
|
||||||
/* Emit arith conditioning info. We may have some duplication
|
|
||||||
* if the file has multiple scans, but it's so small it's hardly
|
|
||||||
* worth worrying about.
|
|
||||||
*/
|
|
||||||
emit_dac(cinfo);
|
|
||||||
} else {
|
|
||||||
/* Emit Huffman tables.
|
|
||||||
* Note that emit_dht() suppresses any duplicate tables.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < cinfo->comps_in_scan; i++) {
|
|
||||||
compptr = cinfo->cur_comp_info[i];
|
|
||||||
/* DC needs no table for refinement scan */
|
|
||||||
if (cinfo->Ss == 0 && cinfo->Ah == 0)
|
|
||||||
emit_dht(cinfo, compptr->dc_tbl_no, FALSE);
|
|
||||||
/* AC needs no table when not present */
|
|
||||||
if (cinfo->Se)
|
|
||||||
emit_dht(cinfo, compptr->ac_tbl_no, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Emit DRI if required --- note that DRI value could change for each scan.
|
|
||||||
* We avoid wasting space with unnecessary DRIs, however.
|
|
||||||
*/
|
|
||||||
if (cinfo->restart_interval != marker->last_restart_interval) {
|
|
||||||
emit_dri(cinfo);
|
|
||||||
marker->last_restart_interval = cinfo->restart_interval;
|
|
||||||
}
|
|
||||||
|
|
||||||
emit_sos(cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write datastream trailer.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_file_trailer (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
emit_marker(cinfo, M_EOI);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Write an abbreviated table-specification datastream.
|
|
||||||
* This consists of SOI, DQT and DHT tables, and EOI.
|
|
||||||
* Any table that is defined and not marked sent_table = TRUE will be
|
|
||||||
* emitted. Note that all tables will be marked sent_table = TRUE at exit.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
write_tables_only (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_SOI);
|
|
||||||
|
|
||||||
for (i = 0; i < NUM_QUANT_TBLS; i++) {
|
|
||||||
if (cinfo->quant_tbl_ptrs[i] != NULL)
|
|
||||||
(void) emit_dqt(cinfo, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! cinfo->arith_code) {
|
|
||||||
for (i = 0; i < NUM_HUFF_TBLS; i++) {
|
|
||||||
if (cinfo->dc_huff_tbl_ptrs[i] != NULL)
|
|
||||||
emit_dht(cinfo, i, FALSE);
|
|
||||||
if (cinfo->ac_huff_tbl_ptrs[i] != NULL)
|
|
||||||
emit_dht(cinfo, i, TRUE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
emit_marker(cinfo, M_EOI);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize the marker writer module.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_marker_writer (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_marker_ptr marker;
|
|
||||||
|
|
||||||
/* Create the subobject */
|
|
||||||
marker = (my_marker_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_marker_writer));
|
|
||||||
cinfo->marker = &marker->pub;
|
|
||||||
/* Initialize method pointers */
|
|
||||||
marker->pub.write_file_header = write_file_header;
|
|
||||||
marker->pub.write_frame_header = write_frame_header;
|
|
||||||
marker->pub.write_scan_header = write_scan_header;
|
|
||||||
marker->pub.write_file_trailer = write_file_trailer;
|
|
||||||
marker->pub.write_tables_only = write_tables_only;
|
|
||||||
marker->pub.write_marker_header = write_marker_header;
|
|
||||||
marker->pub.write_marker_byte = write_marker_byte;
|
|
||||||
/* Initialize private state */
|
|
||||||
marker->last_restart_interval = 0;
|
|
||||||
}
|
|
@ -1,856 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcmaster.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1991-1997, Thomas G. Lane.
|
|
||||||
* Modified 2003-2013 by Guido Vollbeding.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains master control logic for the JPEG compressor.
|
|
||||||
* These routines are concerned with parameter validation, initial setup,
|
|
||||||
* and inter-pass control (determining the number of passes and the work
|
|
||||||
* to be done in each pass).
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/* Private state */
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
main_pass, /* input data, also do first output step */
|
|
||||||
huff_opt_pass, /* Huffman code optimization pass */
|
|
||||||
output_pass /* data output pass */
|
|
||||||
} c_pass_type;
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
struct jpeg_comp_master pub; /* public fields */
|
|
||||||
|
|
||||||
c_pass_type pass_type; /* the type of the current pass */
|
|
||||||
|
|
||||||
int pass_number; /* # of passes completed */
|
|
||||||
int total_passes; /* total # of passes needed */
|
|
||||||
|
|
||||||
int scan_number; /* current index in scan_info[] */
|
|
||||||
} my_comp_master;
|
|
||||||
|
|
||||||
typedef my_comp_master * my_master_ptr;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Support routines that do various essential calculations.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Compute JPEG 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_calc_jpeg_dimensions (j_compress_ptr cinfo)
|
|
||||||
/* Do computations that are needed before master selection phase */
|
|
||||||
{
|
|
||||||
#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. */
|
|
||||||
if (cinfo->scale_num >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/1 scaling */
|
|
||||||
cinfo->jpeg_width = cinfo->image_width * cinfo->block_size;
|
|
||||||
cinfo->jpeg_height = cinfo->image_height * cinfo->block_size;
|
|
||||||
cinfo->min_DCT_h_scaled_size = 1;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 1;
|
|
||||||
} else if (cinfo->scale_num * 2 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/2 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
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_v_scaled_size = 2;
|
|
||||||
} else if (cinfo->scale_num * 3 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/3 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 3L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 3L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 3;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 3;
|
|
||||||
} else if (cinfo->scale_num * 4 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/4 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
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_v_scaled_size = 4;
|
|
||||||
} else if (cinfo->scale_num * 5 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/5 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 5L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 5L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 5;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 5;
|
|
||||||
} else if (cinfo->scale_num * 6 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/6 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 6L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 6L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 6;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 6;
|
|
||||||
} else if (cinfo->scale_num * 7 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/7 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 7L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 7L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 7;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 7;
|
|
||||||
} else if (cinfo->scale_num * 8 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/8 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 8L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
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_v_scaled_size = 9;
|
|
||||||
} else if (cinfo->scale_num * 10 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/10 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 10L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 10L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 10;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 10;
|
|
||||||
} else if (cinfo->scale_num * 11 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/11 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 11L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 11L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 11;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 11;
|
|
||||||
} else if (cinfo->scale_num * 12 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/12 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 12L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 12L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 12;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 12;
|
|
||||||
} else if (cinfo->scale_num * 13 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/13 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 13L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 13L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 13;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 13;
|
|
||||||
} else if (cinfo->scale_num * 14 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/14 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 14L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 14L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 14;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 14;
|
|
||||||
} else if (cinfo->scale_num * 15 >= cinfo->scale_denom * cinfo->block_size) {
|
|
||||||
/* Provide block_size/15 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 15L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 15L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 15;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 15;
|
|
||||||
} else {
|
|
||||||
/* Provide block_size/16 scaling */
|
|
||||||
cinfo->jpeg_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_width * cinfo->block_size, 16L);
|
|
||||||
cinfo->jpeg_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->image_height * cinfo->block_size, 16L);
|
|
||||||
cinfo->min_DCT_h_scaled_size = 16;
|
|
||||||
cinfo->min_DCT_v_scaled_size = 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
#else /* !DCT_SCALING_SUPPORTED */
|
|
||||||
|
|
||||||
/* Hardwire it to "no 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;
|
|
||||||
|
|
||||||
#endif /* DCT_SCALING_SUPPORTED */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
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 */
|
|
||||||
{
|
|
||||||
int ci, ssize;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
if (transcode_only)
|
|
||||||
jpeg_calc_trans_dimensions(cinfo);
|
|
||||||
else
|
|
||||||
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 */
|
|
||||||
if (cinfo->jpeg_height <= 0 || cinfo->jpeg_width <= 0 ||
|
|
||||||
cinfo->num_components <= 0)
|
|
||||||
ERREXIT(cinfo, JERR_EMPTY_IMAGE);
|
|
||||||
|
|
||||||
/* Make sure image isn't bigger than I can handle */
|
|
||||||
if ((long) cinfo->jpeg_height > (long) JPEG_MAX_DIMENSION ||
|
|
||||||
(long) cinfo->jpeg_width > (long) JPEG_MAX_DIMENSION)
|
|
||||||
ERREXIT1(cinfo, JERR_IMAGE_TOO_BIG, (unsigned int) JPEG_MAX_DIMENSION);
|
|
||||||
|
|
||||||
/* Only 8 to 12 bits data precision are supported for DCT based JPEG */
|
|
||||||
if (cinfo->data_precision < 8 || cinfo->data_precision > 12)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PRECISION, cinfo->data_precision);
|
|
||||||
|
|
||||||
/* Check that number of components won't exceed internal array sizes */
|
|
||||||
if (cinfo->num_components > MAX_COMPONENTS)
|
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
|
|
||||||
MAX_COMPONENTS);
|
|
||||||
|
|
||||||
/* Compute maximum sampling factors; check factor validity */
|
|
||||||
cinfo->max_h_samp_factor = 1;
|
|
||||||
cinfo->max_v_samp_factor = 1;
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
if (compptr->h_samp_factor<=0 || compptr->h_samp_factor>MAX_SAMP_FACTOR ||
|
|
||||||
compptr->v_samp_factor<=0 || compptr->v_samp_factor>MAX_SAMP_FACTOR)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_SAMPLING);
|
|
||||||
cinfo->max_h_samp_factor = MAX(cinfo->max_h_samp_factor,
|
|
||||||
compptr->h_samp_factor);
|
|
||||||
cinfo->max_v_samp_factor = MAX(cinfo->max_v_samp_factor,
|
|
||||||
compptr->v_samp_factor);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute dimensions of components */
|
|
||||||
for (ci = 0, compptr = cinfo->comp_info; ci < cinfo->num_components;
|
|
||||||
ci++, compptr++) {
|
|
||||||
/* Fill in the correct component_index value; don't rely on application */
|
|
||||||
compptr->component_index = ci;
|
|
||||||
/* In selecting the actual DCT scaling for each component, we try to
|
|
||||||
* scale down the chroma components via DCT scaling rather than downsampling.
|
|
||||||
* This saves time if the downsampler gets to use 1:1 scaling.
|
|
||||||
* Note this code adapts subsampling ratios which are powers of 2.
|
|
||||||
*/
|
|
||||||
ssize = 1;
|
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
|
||||||
while (cinfo->min_DCT_h_scaled_size * ssize <=
|
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
|
||||||
(cinfo->max_h_samp_factor % (compptr->h_samp_factor * ssize * 2)) == 0) {
|
|
||||||
ssize = ssize * 2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
compptr->DCT_h_scaled_size = cinfo->min_DCT_h_scaled_size * ssize;
|
|
||||||
ssize = 1;
|
|
||||||
#ifdef DCT_SCALING_SUPPORTED
|
|
||||||
while (cinfo->min_DCT_v_scaled_size * ssize <=
|
|
||||||
(cinfo->do_fancy_downsampling ? DCTSIZE : DCTSIZE / 2) &&
|
|
||||||
(cinfo->max_v_samp_factor % (compptr->v_samp_factor * ssize * 2)) == 0) {
|
|
||||||
ssize = ssize * 2;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
compptr->DCT_v_scaled_size = cinfo->min_DCT_v_scaled_size * ssize;
|
|
||||||
|
|
||||||
/* We don't support DCT ratios larger than 2. */
|
|
||||||
if (compptr->DCT_h_scaled_size > compptr->DCT_v_scaled_size * 2)
|
|
||||||
compptr->DCT_h_scaled_size = compptr->DCT_v_scaled_size * 2;
|
|
||||||
else if (compptr->DCT_v_scaled_size > compptr->DCT_h_scaled_size * 2)
|
|
||||||
compptr->DCT_v_scaled_size = compptr->DCT_h_scaled_size * 2;
|
|
||||||
|
|
||||||
/* Size in DCT blocks */
|
|
||||||
compptr->width_in_blocks = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_width * (long) compptr->h_samp_factor,
|
|
||||||
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
|
||||||
compptr->height_in_blocks = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_height * (long) compptr->v_samp_factor,
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
/* Size in samples */
|
|
||||||
compptr->downsampled_width = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_width *
|
|
||||||
(long) (compptr->h_samp_factor * compptr->DCT_h_scaled_size),
|
|
||||||
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
|
||||||
compptr->downsampled_height = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_height *
|
|
||||||
(long) (compptr->v_samp_factor * compptr->DCT_v_scaled_size),
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
/* Don't need quantization scale after DCT,
|
|
||||||
* until color conversion says otherwise.
|
|
||||||
*/
|
|
||||||
compptr->component_needed = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Compute number of fully interleaved MCU rows (number of times that
|
|
||||||
* main controller will call coefficient controller).
|
|
||||||
*/
|
|
||||||
cinfo->total_iMCU_rows = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_height,
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
validate_script (j_compress_ptr cinfo)
|
|
||||||
/* Verify that the scan script in cinfo->scan_info[] is valid; also
|
|
||||||
* determine whether it uses progressive JPEG, and set cinfo->progressive_mode.
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
const jpeg_scan_info * scanptr;
|
|
||||||
int scanno, ncomps, ci, coefi, thisi;
|
|
||||||
int Ss, Se, Ah, Al;
|
|
||||||
boolean component_sent[MAX_COMPONENTS];
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
int * last_bitpos_ptr;
|
|
||||||
int last_bitpos[MAX_COMPONENTS][DCTSIZE2];
|
|
||||||
/* -1 until that coefficient has been seen; then last Al for it */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (cinfo->num_scans <= 0)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, 0);
|
|
||||||
|
|
||||||
/* For sequential JPEG, all scans must have Ss=0, Se=DCTSIZE2-1;
|
|
||||||
* for progressive JPEG, no scan can have this.
|
|
||||||
*/
|
|
||||||
scanptr = cinfo->scan_info;
|
|
||||||
if (scanptr->Ss != 0 || scanptr->Se != DCTSIZE2-1) {
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
cinfo->progressive_mode = TRUE;
|
|
||||||
last_bitpos_ptr = & last_bitpos[0][0];
|
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
|
||||||
for (coefi = 0; coefi < DCTSIZE2; coefi++)
|
|
||||||
*last_bitpos_ptr++ = -1;
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
cinfo->progressive_mode = FALSE;
|
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++)
|
|
||||||
component_sent[ci] = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (scanno = 1; scanno <= cinfo->num_scans; scanptr++, scanno++) {
|
|
||||||
/* Validate component indexes */
|
|
||||||
ncomps = scanptr->comps_in_scan;
|
|
||||||
if (ncomps <= 0 || ncomps > MAX_COMPS_IN_SCAN)
|
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, ncomps, MAX_COMPS_IN_SCAN);
|
|
||||||
for (ci = 0; ci < ncomps; ci++) {
|
|
||||||
thisi = scanptr->component_index[ci];
|
|
||||||
if (thisi < 0 || thisi >= cinfo->num_components)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
|
|
||||||
/* Components must appear in SOF order within each scan */
|
|
||||||
if (ci > 0 && thisi <= scanptr->component_index[ci-1])
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
|
|
||||||
}
|
|
||||||
/* Validate progression parameters */
|
|
||||||
Ss = scanptr->Ss;
|
|
||||||
Se = scanptr->Se;
|
|
||||||
Ah = scanptr->Ah;
|
|
||||||
Al = scanptr->Al;
|
|
||||||
if (cinfo->progressive_mode) {
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
/* The JPEG spec simply gives the ranges 0..13 for Ah and Al, but that
|
|
||||||
* seems wrong: the upper bound ought to depend on data precision.
|
|
||||||
* Perhaps they really meant 0..N+1 for N-bit precision.
|
|
||||||
* Here we allow 0..10 for 8-bit data; Al larger than 10 results in
|
|
||||||
* out-of-range reconstructed DC values during the first DC scan,
|
|
||||||
* which might cause problems for some decoders.
|
|
||||||
*/
|
|
||||||
#if BITS_IN_JSAMPLE == 8
|
|
||||||
#define MAX_AH_AL 10
|
|
||||||
#else
|
|
||||||
#define MAX_AH_AL 13
|
|
||||||
#endif
|
|
||||||
if (Ss < 0 || Ss >= DCTSIZE2 || Se < Ss || Se >= DCTSIZE2 ||
|
|
||||||
Ah < 0 || Ah > MAX_AH_AL || Al < 0 || Al > MAX_AH_AL)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
if (Ss == 0) {
|
|
||||||
if (Se != 0) /* DC and AC together not OK */
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
} else {
|
|
||||||
if (ncomps != 1) /* AC scans must be for only one component */
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
}
|
|
||||||
for (ci = 0; ci < ncomps; ci++) {
|
|
||||||
last_bitpos_ptr = & last_bitpos[scanptr->component_index[ci]][0];
|
|
||||||
if (Ss != 0 && last_bitpos_ptr[0] < 0) /* AC without prior DC scan */
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
for (coefi = Ss; coefi <= Se; coefi++) {
|
|
||||||
if (last_bitpos_ptr[coefi] < 0) {
|
|
||||||
/* first scan of this coefficient */
|
|
||||||
if (Ah != 0)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
} else {
|
|
||||||
/* not first scan */
|
|
||||||
if (Ah != last_bitpos_ptr[coefi] || Al != Ah-1)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
}
|
|
||||||
last_bitpos_ptr[coefi] = Al;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
/* For sequential JPEG, all progression parameters must be these: */
|
|
||||||
if (Ss != 0 || Se != DCTSIZE2-1 || Ah != 0 || Al != 0)
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_PROG_SCRIPT, scanno);
|
|
||||||
/* Make sure components are not sent twice */
|
|
||||||
for (ci = 0; ci < ncomps; ci++) {
|
|
||||||
thisi = scanptr->component_index[ci];
|
|
||||||
if (component_sent[thisi])
|
|
||||||
ERREXIT1(cinfo, JERR_BAD_SCAN_SCRIPT, scanno);
|
|
||||||
component_sent[thisi] = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now verify that everything got sent. */
|
|
||||||
if (cinfo->progressive_mode) {
|
|
||||||
#ifdef C_PROGRESSIVE_SUPPORTED
|
|
||||||
/* For progressive mode, we only check that at least some DC data
|
|
||||||
* got sent for each component; the spec does not require that all bits
|
|
||||||
* of all coefficients be transmitted. Would it be wiser to enforce
|
|
||||||
* transmission of all coefficient bits??
|
|
||||||
*/
|
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++) {
|
|
||||||
if (last_bitpos[ci][0] < 0)
|
|
||||||
ERREXIT(cinfo, JERR_MISSING_DATA);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++) {
|
|
||||||
if (! component_sent[ci])
|
|
||||||
ERREXIT(cinfo, JERR_MISSING_DATA);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
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 */
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
select_scan_parameters (j_compress_ptr cinfo)
|
|
||||||
/* Set up the scan parameters for the current scan */
|
|
||||||
{
|
|
||||||
int ci;
|
|
||||||
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
if (cinfo->scan_info != NULL) {
|
|
||||||
/* Prepare for current scan --- the script is already validated */
|
|
||||||
my_master_ptr master = (my_master_ptr) cinfo->master;
|
|
||||||
const jpeg_scan_info * scanptr = cinfo->scan_info + master->scan_number;
|
|
||||||
|
|
||||||
cinfo->comps_in_scan = scanptr->comps_in_scan;
|
|
||||||
for (ci = 0; ci < scanptr->comps_in_scan; ci++) {
|
|
||||||
cinfo->cur_comp_info[ci] =
|
|
||||||
&cinfo->comp_info[scanptr->component_index[ci]];
|
|
||||||
}
|
|
||||||
if (cinfo->progressive_mode) {
|
|
||||||
cinfo->Ss = scanptr->Ss;
|
|
||||||
cinfo->Se = scanptr->Se;
|
|
||||||
cinfo->Ah = scanptr->Ah;
|
|
||||||
cinfo->Al = scanptr->Al;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
/* Prepare for single sequential-JPEG scan containing all components */
|
|
||||||
if (cinfo->num_components > MAX_COMPS_IN_SCAN)
|
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->num_components,
|
|
||||||
MAX_COMPS_IN_SCAN);
|
|
||||||
cinfo->comps_in_scan = cinfo->num_components;
|
|
||||||
for (ci = 0; ci < cinfo->num_components; ci++) {
|
|
||||||
cinfo->cur_comp_info[ci] = &cinfo->comp_info[ci];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cinfo->Ss = 0;
|
|
||||||
cinfo->Se = cinfo->block_size * cinfo->block_size - 1;
|
|
||||||
cinfo->Ah = 0;
|
|
||||||
cinfo->Al = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
LOCAL(void)
|
|
||||||
per_scan_setup (j_compress_ptr cinfo)
|
|
||||||
/* Do computations that are needed before processing a JPEG scan */
|
|
||||||
/* cinfo->comps_in_scan and cinfo->cur_comp_info[] are already set */
|
|
||||||
{
|
|
||||||
int ci, mcublks, tmp;
|
|
||||||
jpeg_component_info *compptr;
|
|
||||||
|
|
||||||
if (cinfo->comps_in_scan == 1) {
|
|
||||||
|
|
||||||
/* Noninterleaved (single-component) scan */
|
|
||||||
compptr = cinfo->cur_comp_info[0];
|
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
|
||||||
cinfo->MCUs_per_row = compptr->width_in_blocks;
|
|
||||||
cinfo->MCU_rows_in_scan = compptr->height_in_blocks;
|
|
||||||
|
|
||||||
/* For noninterleaved scan, always one block per MCU */
|
|
||||||
compptr->MCU_width = 1;
|
|
||||||
compptr->MCU_height = 1;
|
|
||||||
compptr->MCU_blocks = 1;
|
|
||||||
compptr->MCU_sample_width = compptr->DCT_h_scaled_size;
|
|
||||||
compptr->last_col_width = 1;
|
|
||||||
/* For noninterleaved scans, it is convenient to define last_row_height
|
|
||||||
* as the number of block rows present in the last iMCU row.
|
|
||||||
*/
|
|
||||||
tmp = (int) (compptr->height_in_blocks % compptr->v_samp_factor);
|
|
||||||
if (tmp == 0) tmp = compptr->v_samp_factor;
|
|
||||||
compptr->last_row_height = tmp;
|
|
||||||
|
|
||||||
/* Prepare array describing MCU composition */
|
|
||||||
cinfo->blocks_in_MCU = 1;
|
|
||||||
cinfo->MCU_membership[0] = 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
/* Interleaved (multi-component) scan */
|
|
||||||
if (cinfo->comps_in_scan <= 0 || cinfo->comps_in_scan > MAX_COMPS_IN_SCAN)
|
|
||||||
ERREXIT2(cinfo, JERR_COMPONENT_COUNT, cinfo->comps_in_scan,
|
|
||||||
MAX_COMPS_IN_SCAN);
|
|
||||||
|
|
||||||
/* Overall image size in MCUs */
|
|
||||||
cinfo->MCUs_per_row = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_width,
|
|
||||||
(long) (cinfo->max_h_samp_factor * cinfo->block_size));
|
|
||||||
cinfo->MCU_rows_in_scan = (JDIMENSION)
|
|
||||||
jdiv_round_up((long) cinfo->jpeg_height,
|
|
||||||
(long) (cinfo->max_v_samp_factor * cinfo->block_size));
|
|
||||||
|
|
||||||
cinfo->blocks_in_MCU = 0;
|
|
||||||
|
|
||||||
for (ci = 0; ci < cinfo->comps_in_scan; ci++) {
|
|
||||||
compptr = cinfo->cur_comp_info[ci];
|
|
||||||
/* Sampling factors give # of blocks of component in each MCU */
|
|
||||||
compptr->MCU_width = compptr->h_samp_factor;
|
|
||||||
compptr->MCU_height = compptr->v_samp_factor;
|
|
||||||
compptr->MCU_blocks = compptr->MCU_width * compptr->MCU_height;
|
|
||||||
compptr->MCU_sample_width = compptr->MCU_width * compptr->DCT_h_scaled_size;
|
|
||||||
/* Figure number of non-dummy blocks in last MCU column & row */
|
|
||||||
tmp = (int) (compptr->width_in_blocks % compptr->MCU_width);
|
|
||||||
if (tmp == 0) tmp = compptr->MCU_width;
|
|
||||||
compptr->last_col_width = tmp;
|
|
||||||
tmp = (int) (compptr->height_in_blocks % compptr->MCU_height);
|
|
||||||
if (tmp == 0) tmp = compptr->MCU_height;
|
|
||||||
compptr->last_row_height = tmp;
|
|
||||||
/* Prepare array describing MCU composition */
|
|
||||||
mcublks = compptr->MCU_blocks;
|
|
||||||
if (cinfo->blocks_in_MCU + mcublks > C_MAX_BLOCKS_IN_MCU)
|
|
||||||
ERREXIT(cinfo, JERR_BAD_MCU_SIZE);
|
|
||||||
while (mcublks-- > 0) {
|
|
||||||
cinfo->MCU_membership[cinfo->blocks_in_MCU++] = ci;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Convert restart specified in rows to actual MCU count. */
|
|
||||||
/* Note that count must fit in 16 bits, so we provide limiting. */
|
|
||||||
if (cinfo->restart_in_rows > 0) {
|
|
||||||
long nominal = (long) cinfo->restart_in_rows * (long) cinfo->MCUs_per_row;
|
|
||||||
cinfo->restart_interval = (unsigned int) MIN(nominal, 65535L);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Per-pass setup.
|
|
||||||
* This is called at the beginning of each pass. We determine which modules
|
|
||||||
* will be active during this pass and give them appropriate start_pass calls.
|
|
||||||
* We also set is_last_pass to indicate whether any more passes will be
|
|
||||||
* required.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
prepare_for_pass (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_master_ptr master = (my_master_ptr) cinfo->master;
|
|
||||||
|
|
||||||
switch (master->pass_type) {
|
|
||||||
case main_pass:
|
|
||||||
/* Initial pass: will collect input data, and do either Huffman
|
|
||||||
* optimization or data output for the first scan.
|
|
||||||
*/
|
|
||||||
select_scan_parameters(cinfo);
|
|
||||||
per_scan_setup(cinfo);
|
|
||||||
if (! cinfo->raw_data_in) {
|
|
||||||
(*cinfo->cconvert->start_pass) (cinfo);
|
|
||||||
(*cinfo->downsample->start_pass) (cinfo);
|
|
||||||
(*cinfo->prep->start_pass) (cinfo, JBUF_PASS_THRU);
|
|
||||||
}
|
|
||||||
(*cinfo->fdct->start_pass) (cinfo);
|
|
||||||
(*cinfo->entropy->start_pass) (cinfo, cinfo->optimize_coding);
|
|
||||||
(*cinfo->coef->start_pass) (cinfo,
|
|
||||||
(master->total_passes > 1 ?
|
|
||||||
JBUF_SAVE_AND_PASS : JBUF_PASS_THRU));
|
|
||||||
(*cinfo->main->start_pass) (cinfo, JBUF_PASS_THRU);
|
|
||||||
if (cinfo->optimize_coding) {
|
|
||||||
/* No immediate data output; postpone writing frame/scan headers */
|
|
||||||
master->pub.call_pass_startup = FALSE;
|
|
||||||
} else {
|
|
||||||
/* Will write frame/scan headers at first jpeg_write_scanlines call */
|
|
||||||
master->pub.call_pass_startup = TRUE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
#ifdef ENTROPY_OPT_SUPPORTED
|
|
||||||
case huff_opt_pass:
|
|
||||||
/* Do Huffman optimization for a scan after the first one. */
|
|
||||||
select_scan_parameters(cinfo);
|
|
||||||
per_scan_setup(cinfo);
|
|
||||||
if (cinfo->Ss != 0 || cinfo->Ah == 0) {
|
|
||||||
(*cinfo->entropy->start_pass) (cinfo, TRUE);
|
|
||||||
(*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
|
|
||||||
master->pub.call_pass_startup = FALSE;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* Special case: Huffman DC refinement scans need no Huffman table
|
|
||||||
* and therefore we can skip the optimization pass for them.
|
|
||||||
*/
|
|
||||||
master->pass_type = output_pass;
|
|
||||||
master->pass_number++;
|
|
||||||
/*FALLTHROUGH*/
|
|
||||||
#endif
|
|
||||||
case output_pass:
|
|
||||||
/* Do a data-output pass. */
|
|
||||||
/* We need not repeat per-scan setup if prior optimization pass did it. */
|
|
||||||
if (! cinfo->optimize_coding) {
|
|
||||||
select_scan_parameters(cinfo);
|
|
||||||
per_scan_setup(cinfo);
|
|
||||||
}
|
|
||||||
(*cinfo->entropy->start_pass) (cinfo, FALSE);
|
|
||||||
(*cinfo->coef->start_pass) (cinfo, JBUF_CRANK_DEST);
|
|
||||||
/* We emit frame/scan headers now */
|
|
||||||
if (master->scan_number == 0)
|
|
||||||
(*cinfo->marker->write_frame_header) (cinfo);
|
|
||||||
(*cinfo->marker->write_scan_header) (cinfo);
|
|
||||||
master->pub.call_pass_startup = FALSE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
}
|
|
||||||
|
|
||||||
master->pub.is_last_pass = (master->pass_number == master->total_passes-1);
|
|
||||||
|
|
||||||
/* Set up progress monitor's pass info if present */
|
|
||||||
if (cinfo->progress != NULL) {
|
|
||||||
cinfo->progress->completed_passes = master->pass_number;
|
|
||||||
cinfo->progress->total_passes = master->total_passes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Special start-of-pass hook.
|
|
||||||
* This is called by jpeg_write_scanlines if call_pass_startup is TRUE.
|
|
||||||
* In single-pass processing, we need this hook because we don't want to
|
|
||||||
* write frame/scan headers during jpeg_start_compress; we want to let the
|
|
||||||
* application write COM markers etc. between jpeg_start_compress and the
|
|
||||||
* jpeg_write_scanlines loop.
|
|
||||||
* In multi-pass processing, this routine is not used.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
pass_startup (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
cinfo->master->call_pass_startup = FALSE; /* reset flag so call only once */
|
|
||||||
|
|
||||||
(*cinfo->marker->write_frame_header) (cinfo);
|
|
||||||
(*cinfo->marker->write_scan_header) (cinfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Finish up at end of pass.
|
|
||||||
*/
|
|
||||||
|
|
||||||
METHODDEF(void)
|
|
||||||
finish_pass_master (j_compress_ptr cinfo)
|
|
||||||
{
|
|
||||||
my_master_ptr master = (my_master_ptr) cinfo->master;
|
|
||||||
|
|
||||||
/* The entropy coder always needs an end-of-pass call,
|
|
||||||
* either to analyze statistics or to flush its output buffer.
|
|
||||||
*/
|
|
||||||
(*cinfo->entropy->finish_pass) (cinfo);
|
|
||||||
|
|
||||||
/* Update state for next pass */
|
|
||||||
switch (master->pass_type) {
|
|
||||||
case main_pass:
|
|
||||||
/* next pass is either output of scan 0 (after optimization)
|
|
||||||
* or output of scan 1 (if no optimization).
|
|
||||||
*/
|
|
||||||
master->pass_type = output_pass;
|
|
||||||
if (! cinfo->optimize_coding)
|
|
||||||
master->scan_number++;
|
|
||||||
break;
|
|
||||||
case huff_opt_pass:
|
|
||||||
/* next pass is always output of current scan */
|
|
||||||
master->pass_type = output_pass;
|
|
||||||
break;
|
|
||||||
case output_pass:
|
|
||||||
/* next pass is either optimization or output of next scan */
|
|
||||||
if (cinfo->optimize_coding)
|
|
||||||
master->pass_type = huff_opt_pass;
|
|
||||||
master->scan_number++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
master->pass_number++;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Initialize master compression control.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jinit_c_master_control (j_compress_ptr cinfo, boolean transcode_only)
|
|
||||||
{
|
|
||||||
my_master_ptr master;
|
|
||||||
|
|
||||||
master = (my_master_ptr)
|
|
||||||
(*cinfo->mem->alloc_small) ((j_common_ptr) cinfo, JPOOL_IMAGE,
|
|
||||||
SIZEOF(my_comp_master));
|
|
||||||
cinfo->master = &master->pub;
|
|
||||||
master->pub.prepare_for_pass = prepare_for_pass;
|
|
||||||
master->pub.pass_startup = pass_startup;
|
|
||||||
master->pub.finish_pass = finish_pass_master;
|
|
||||||
master->pub.is_last_pass = FALSE;
|
|
||||||
|
|
||||||
/* Validate parameters, determine derived values */
|
|
||||||
initial_setup(cinfo, transcode_only);
|
|
||||||
|
|
||||||
if (cinfo->scan_info != NULL) {
|
|
||||||
#ifdef C_MULTISCAN_FILES_SUPPORTED
|
|
||||||
validate_script(cinfo);
|
|
||||||
if (cinfo->block_size < DCTSIZE)
|
|
||||||
reduce_script(cinfo);
|
|
||||||
#else
|
|
||||||
ERREXIT(cinfo, JERR_NOT_COMPILED);
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
cinfo->progressive_mode = FALSE;
|
|
||||||
cinfo->num_scans = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cinfo->optimize_coding)
|
|
||||||
cinfo->arith_code = FALSE; /* disable arithmetic coding */
|
|
||||||
else if (! cinfo->arith_code &&
|
|
||||||
(cinfo->progressive_mode ||
|
|
||||||
(cinfo->block_size > 1 && cinfo->block_size < DCTSIZE)))
|
|
||||||
/* TEMPORARY HACK ??? */
|
|
||||||
/* assume default tables no good for progressive or reduced AC mode */
|
|
||||||
cinfo->optimize_coding = TRUE; /* force Huffman optimization */
|
|
||||||
|
|
||||||
/* Initialize my private state */
|
|
||||||
if (transcode_only) {
|
|
||||||
/* no main pass in transcoding */
|
|
||||||
if (cinfo->optimize_coding)
|
|
||||||
master->pass_type = huff_opt_pass;
|
|
||||||
else
|
|
||||||
master->pass_type = output_pass;
|
|
||||||
} else {
|
|
||||||
/* for normal compression, first pass is always this type: */
|
|
||||||
master->pass_type = main_pass;
|
|
||||||
}
|
|
||||||
master->scan_number = 0;
|
|
||||||
master->pass_number = 0;
|
|
||||||
if (cinfo->optimize_coding)
|
|
||||||
master->total_passes = cinfo->num_scans * 2;
|
|
||||||
else
|
|
||||||
master->total_passes = cinfo->num_scans;
|
|
||||||
}
|
|
@ -1,106 +0,0 @@
|
|||||||
/*
|
|
||||||
* jcomapi.c
|
|
||||||
*
|
|
||||||
* Copyright (C) 1994-1997, Thomas G. Lane.
|
|
||||||
* This file is part of the Independent JPEG Group's software.
|
|
||||||
* For conditions of distribution and use, see the accompanying README file.
|
|
||||||
*
|
|
||||||
* This file contains application interface routines that are used for both
|
|
||||||
* compression and decompression.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define JPEG_INTERNALS
|
|
||||||
#include "jinclude.h"
|
|
||||||
#include "jpeglib.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Abort processing of a JPEG compression or decompression operation,
|
|
||||||
* but don't destroy the object itself.
|
|
||||||
*
|
|
||||||
* For this, we merely clean up all the nonpermanent memory pools.
|
|
||||||
* Note that temp files (virtual arrays) are not allowed to belong to
|
|
||||||
* the permanent pool, so we will be able to close all temp files here.
|
|
||||||
* Closing a data source or destination, if necessary, is the application's
|
|
||||||
* responsibility.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_abort (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
int pool;
|
|
||||||
|
|
||||||
/* Do nothing if called on a not-initialized or destroyed JPEG object. */
|
|
||||||
if (cinfo->mem == NULL)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Releasing pools in reverse order might help avoid fragmentation
|
|
||||||
* with some (brain-damaged) malloc libraries.
|
|
||||||
*/
|
|
||||||
for (pool = JPOOL_NUMPOOLS-1; pool > JPOOL_PERMANENT; pool--) {
|
|
||||||
(*cinfo->mem->free_pool) (cinfo, pool);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reset overall state for possible reuse of object */
|
|
||||||
if (cinfo->is_decompressor) {
|
|
||||||
cinfo->global_state = DSTATE_START;
|
|
||||||
/* Try to keep application from accessing now-deleted marker list.
|
|
||||||
* A bit kludgy to do it here, but this is the most central place.
|
|
||||||
*/
|
|
||||||
((j_decompress_ptr) cinfo)->marker_list = NULL;
|
|
||||||
} else {
|
|
||||||
cinfo->global_state = CSTATE_START;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Destruction of a JPEG object.
|
|
||||||
*
|
|
||||||
* Everything gets deallocated except the master jpeg_compress_struct itself
|
|
||||||
* and the error manager struct. Both of these are supplied by the application
|
|
||||||
* and must be freed, if necessary, by the application. (Often they are on
|
|
||||||
* the stack and so don't need to be freed anyway.)
|
|
||||||
* Closing a data source or destination, if necessary, is the application's
|
|
||||||
* responsibility.
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(void)
|
|
||||||
jpeg_destroy (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
/* We need only tell the memory manager to release everything. */
|
|
||||||
/* NB: mem pointer is NULL if memory mgr failed to initialize. */
|
|
||||||
if (cinfo->mem != NULL)
|
|
||||||
(*cinfo->mem->self_destruct) (cinfo);
|
|
||||||
cinfo->mem = NULL; /* be safe if jpeg_destroy is called twice */
|
|
||||||
cinfo->global_state = 0; /* mark it destroyed */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Convenience routines for allocating quantization and Huffman tables.
|
|
||||||
* (Would jutils.c be a more reasonable place to put these?)
|
|
||||||
*/
|
|
||||||
|
|
||||||
GLOBAL(JQUANT_TBL *)
|
|
||||||
jpeg_alloc_quant_table (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
JQUANT_TBL *tbl;
|
|
||||||
|
|
||||||
tbl = (JQUANT_TBL *)
|
|
||||||
(*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JQUANT_TBL));
|
|
||||||
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
|
||||||
return tbl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL(JHUFF_TBL *)
|
|
||||||
jpeg_alloc_huff_table (j_common_ptr cinfo)
|
|
||||||
{
|
|
||||||
JHUFF_TBL *tbl;
|
|
||||||
|
|
||||||
tbl = (JHUFF_TBL *)
|
|
||||||
(*cinfo->mem->alloc_small) (cinfo, JPOOL_PERMANENT, SIZEOF(JHUFF_TBL));
|
|
||||||
tbl->sent_table = FALSE; /* make sure this is false in any new table */
|
|
||||||
return tbl;
|
|
||||||
}
|
|
@ -1,48 +0,0 @@
|
|||||||
/* jconfig.bcc --- jconfig.h for Borland C (Turbo C) on MS-DOS or OS/2. */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#ifdef __MSDOS__
|
|
||||||
#define NEED_FAR_POINTERS /* for small or medium memory model */
|
|
||||||
#endif
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN /* this assumes you have -w-stu in CFLAGS */
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#ifdef __MSDOS__
|
|
||||||
#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */
|
|
||||||
#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */
|
|
||||||
#define USE_FMEM /* Borland has _fmemcpy() and _fmemset() */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#define TWO_FILE_COMMANDLINE
|
|
||||||
#define USE_SETMODE /* Borland has setmode() */
|
|
||||||
#ifdef __MSDOS__
|
|
||||||
#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */
|
|
||||||
#endif
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,59 +0,0 @@
|
|||||||
/* jconfig.cfg --- source file edited by configure script */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#undef HAVE_PROTOTYPES
|
|
||||||
#undef HAVE_UNSIGNED_CHAR
|
|
||||||
#undef HAVE_UNSIGNED_SHORT
|
|
||||||
#undef void
|
|
||||||
#undef const
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#undef HAVE_STDDEF_H
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
#undef HAVE_LOCALE_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
/* Define this if you get warnings about undefined structures. */
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
/* Define "boolean" as unsigned char, not enum, on Windows systems. */
|
|
||||||
#ifdef _WIN32
|
|
||||||
#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */
|
|
||||||
typedef unsigned char boolean;
|
|
||||||
#endif
|
|
||||||
#ifndef FALSE /* in case these macros already exist */
|
|
||||||
#define FALSE 0 /* values of boolean */
|
|
||||||
#endif
|
|
||||||
#ifndef TRUE
|
|
||||||
#define TRUE 1
|
|
||||||
#endif
|
|
||||||
#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
#undef INLINE
|
|
||||||
/* These are for configuring the JPEG memory manager. */
|
|
||||||
#undef DEFAULT_MAX_MEM
|
|
||||||
#undef NO_MKTEMP
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#undef TWO_FILE_COMMANDLINE
|
|
||||||
#undef NEED_SIGNAL_CATCHER
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
|
|
||||||
/* Define this if you want percent-done progress reports from cjpeg/djpeg. */
|
|
||||||
#undef PROGRESS_REPORT
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,38 +0,0 @@
|
|||||||
/* jconfig.dj --- jconfig.h for DJGPP (Delorie's GNU C port) on MS-DOS. */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS /* DJGPP uses flat 32-bit addressing */
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#undef TWO_FILE_COMMANDLINE /* optional */
|
|
||||||
#define USE_SETMODE /* Needed to make one-file style work in DJGPP */
|
|
||||||
#undef NEED_SIGNAL_CATCHER /* Define this if you use jmemname.c */
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,38 +0,0 @@
|
|||||||
/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#define TWO_FILE_COMMANDLINE /* optional */
|
|
||||||
#define USE_SETMODE /* Microsoft has setmode() */
|
|
||||||
#undef NEED_SIGNAL_CATCHER
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,43 +0,0 @@
|
|||||||
/* jconfig.mac --- jconfig.h for CodeWarrior on Apple Macintosh */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#define USE_MAC_MEMMGR /* Define this if you use jmemmac.c */
|
|
||||||
|
|
||||||
#define ALIGN_TYPE long /* Needed for 680x0 Macs */
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#define USE_CCOMMAND /* Command line reader for Macintosh */
|
|
||||||
#define TWO_FILE_COMMANDLINE /* Binary I/O thru stdin/stdout doesn't work */
|
|
||||||
|
|
||||||
#undef NEED_SIGNAL_CATCHER
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,43 +0,0 @@
|
|||||||
/* jconfig.manx --- jconfig.h for Amiga systems using Manx Aztec C ver 5.x. */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#undef NEED_FAR_POINTERS
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#define TEMP_DIRECTORY "JPEGTMP:" /* recommended setting for Amiga */
|
|
||||||
|
|
||||||
#define SHORTxSHORT_32 /* produces better DCT code with Aztec C */
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#define TWO_FILE_COMMANDLINE
|
|
||||||
#define NEED_SIGNAL_CATCHER
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#define signal_catcher _abort /* hack for Aztec C naming requirements */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
@ -1,52 +0,0 @@
|
|||||||
/* jconfig.mc6 --- jconfig.h for Microsoft C on MS-DOS, version 6.00A & up. */
|
|
||||||
/* see jconfig.txt for explanations */
|
|
||||||
|
|
||||||
#define HAVE_PROTOTYPES
|
|
||||||
#define HAVE_UNSIGNED_CHAR
|
|
||||||
#define HAVE_UNSIGNED_SHORT
|
|
||||||
/* #define void char */
|
|
||||||
/* #define const */
|
|
||||||
#undef CHAR_IS_UNSIGNED
|
|
||||||
#define HAVE_STDDEF_H
|
|
||||||
#define HAVE_STDLIB_H
|
|
||||||
#undef NEED_BSD_STRINGS
|
|
||||||
#undef NEED_SYS_TYPES_H
|
|
||||||
#define NEED_FAR_POINTERS /* for small or medium memory model */
|
|
||||||
#undef NEED_SHORT_EXTERNAL_NAMES
|
|
||||||
#undef INCOMPLETE_TYPES_BROKEN
|
|
||||||
|
|
||||||
#ifdef JPEG_INTERNALS
|
|
||||||
|
|
||||||
#undef RIGHT_SHIFT_IS_UNSIGNED
|
|
||||||
|
|
||||||
#define USE_MSDOS_MEMMGR /* Define this if you use jmemdos.c */
|
|
||||||
|
|
||||||
#define MAX_ALLOC_CHUNK 65520L /* Maximum request to malloc() */
|
|
||||||
|
|
||||||
#define USE_FMEM /* Microsoft has _fmemcpy() and _fmemset() */
|
|
||||||
|
|
||||||
#define NEED_FHEAPMIN /* far heap management routines are broken */
|
|
||||||
|
|
||||||
#define SHORTxLCONST_32 /* enable compiler-specific DCT optimization */
|
|
||||||
/* 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.
|
|
||||||
* Please report any info on this point to jpeg-info@jpegclub.org.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#endif /* JPEG_INTERNALS */
|
|
||||||
|
|
||||||
#ifdef JPEG_CJPEG_DJPEG
|
|
||||||
|
|
||||||
#define BMP_SUPPORTED /* BMP image file format */
|
|
||||||
#define GIF_SUPPORTED /* GIF image file format */
|
|
||||||
#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */
|
|
||||||
#undef RLE_SUPPORTED /* Utah RLE image file format */
|
|
||||||
#define TARGA_SUPPORTED /* Targa image file format */
|
|
||||||
|
|
||||||
#define TWO_FILE_COMMANDLINE
|
|
||||||
#define USE_SETMODE /* Microsoft has setmode() */
|
|
||||||
#define NEED_SIGNAL_CATCHER /* Define this if you use jmemdos.c */
|
|
||||||
#undef DONT_USE_B_MODE
|
|
||||||
#undef PROGRESS_REPORT /* optional */
|
|
||||||
|
|
||||||
#endif /* JPEG_CJPEG_DJPEG */
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user